GetAdaptersInfo et GetAdaptersAddressess BufferLength Param

J’ai un code hérité en C ++ ici qui fait des choses que je ne comprends pas. Je l’exécute dans Visual C ++ 2008 Express Edition sur un ordinateur exécutant Windows XP.

Le code utilise certaines fonctions Windows: GetAdaptersInfo et GetAdaptersAddressess. Je me rends compte que le dernier paramètre pour ces deux éléments est un pointeur sur la taille du tampon et, comme il est in_out, il peut être modifié dans la fonction.

Ma question est la suivante: ces fonctions sont-elles supposées changer la longueur de la mémoire tampon?

Dans le code que j’ai, chaque fois que ces fonctions sont appelées, la variable de longueur de tampon est initialisée à zéro et, une fois la fonction appelée, elle rest toujours à 0.

Votre code doit ressembler à quelque chose comme ceci:

// First get the desired size. unsigned long outBufLen = 0; DWORD dwResult = GetAdaptersInfo(NULL, &outBufLen); if (dwResult == ERROR_BUFFER_OVERFLOW) // This is what we're expecting { // Now allocate a structure of the requried size. PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen); dwResult = GetAdaptersInfo(pIpAdapterInfo, &outBufLen); if (dwResult == ERROR_SUCCESS) { // Yay! 

Edit: Voir aussi la réponse de Jeremy Friesner pour expliquer pourquoi ce code ne suffit pas.

Bien entendu, l’exemple de code dans la réponse de @ RichieHindle contient une condition de concurrence …. si la taille de la structure que Windows veut renvoyer augmente après le premier appel à GetAdaptersInfo () mais avant le deuxième appel à GetAdaptersInfo (), le second to GetAdaptersInfo () échouera également avec ERROR_BUFFER_OVERFLOW et votre fonction ne fonctionnera pas.

Oui, cela se produit dans la vraie vie – cela m’est arrivé. Si vous voulez que le code soit fiable, vous devez appeler GetAdaptersInfo () en boucle, en augmentant la taille de la mémoire tampon autant de fois que nécessaire jusqu’à la réussite de l’appel.

Il doit exister un moyen moins risqué d’élaborer une API … Malheureusement, Microsoft ne l’a pas encore trouvée. : ^ P

En effet, en utilisant Visual studio 6, j’avais l’habitude d’obtenir le nombre d’adaptateurs en:

 DWORD drc = GetAdaptersInfo(NULL, &(Buflen = 0L)); if (drc == ERROR_BUFFER_OVERFLOW) n = Buflen / sizeof(IP_ADAPTER_INFO); 

Tout allait bien, par exemple, pour 2 adaptateurs, Buflen était défini sur 1280 et sizeof(IP_ADAPTER_INFO) 640.

J’utilise maintenant Visual C ++ 2008 Express et mon résultat est tronqué, car la fonction définit toujours Buflen sur 1280, mais la valeur de sizeof(IP_ADAPTER_INFO) est maintenant 648!

Est-ce un bug ou est-ce que je manque quelque chose?