2008-10-09 4 views
7

Je rencontre fréquemment des définitions de structures Win32API (mais pas limitées à cela) qui ont un membre cbSize comme dans l'exemple suivant.Quel est le but du membre cbSize dans les structures Win32API?

typedef struct _TEST { 
    int cbSize; 
    // other members follow 
} TEST, *PTEST; 

Et puis nous l'utiliser comme ceci:

TEST t = { sizeof(TEST) }; 
... 

ou

TEST t; 
t.cbSize = sizeof(TEST); 
... 

Mon estimation initiale est que cela pourrait être utilisé pour versioning. Une DLL qui reçoit un pointeur pour une structure de ce type peut vérifier si le membre cbSize a la valeur attendue avec laquelle la DLL a été compilée. Ou pour vérifier si l'emballage approprié est fait pour la structure. Mais je voudrais ici de vous.

Quel est l'objectif du membre cbSize dans certaines structures C++ sur Win32API?

Répondre

10

Mon estimation initiale est que cela pourrait être utilisé potentiellement pour versioning.

C'est une des raisons. Je pense que c'est le plus habituel.

Un autre est pour les structures qui ont des données de longueur variable.

Je ne pense pas que la vérification de l'emballage correct ou des bogues dans l'appelant soit un raisonnement particulier, mais cela aurait cet effet.

0

partiellement versioning, la plupart du temps la sécurité ... pour empêcher la fonction appelée dans la mémoire de piquer qui ne faisait pas partie de la struct transmise.

11

Il est utilisé pour versioning. Un bon exemple est l'appel GetVersionEx. Vous pouvez passer un OSVERSIONINFO ou OSVERSIONINFOEX. Le fichier OSVERSIONINFOEX est un surensemble de OSVERSIONINFO, et le seul moyen dont le système d'exploitation sait que vous avez transmis est le membre dwOSVersionInfoSize.

+1

Les stucs varient également en taille entre les versions d'OS. Je viens de frapper un bug en utilisant la plate-forme sdk qui vient avec VC++ 2008. Nous ne définissions pas correctement la version du système d'exploitation et avons fini par utiliser la version Vista d'une structure - qui ne fonctionnait pas si bien sur ma boîte XP. – Aardvark

2

Il permet également à l'WIN32 API faire une quantité minimale de vérification de la validité des données transmise.

Par exemple, une erreur commum est une structure WIN32 être passé avec un incorrect ou uninitialisedcbSize et quand cela se produit l'API WIN32 habituellement retourne juste un résultat a échoué, plutôt que d'essayer de traiter ce qui semble être des données corrompues.

Questions connexes