A really long and annoying troubleshooting of a problem finally ended with a bug found in GetAdaptersInfo/GetAdaptersAddresses API.
It may unexpectedly fail under the following conditions:
- 32-bit application
- 64-bit operating system or /3GB feature enabled on 32-bit operating system
- hosting process is linked with /LARGEADDRESSAWARE flag or has otherwise set it in binary header
- over 2GB of RAM (in terms of Private Bytes/Virtual Size performance counters) consumed by the hosting process
The application might unexpectedly start getting ERROR_NO_DATA (232) or ERROR_NOACCESS (998) error codes instead of list of adapters. Supposedly, the responsible Microsoft component iplhlpapi.dll or one of the underlying components/APIs are incompatible with such environments (such as for example, treating 32-bit pointer with the most significant bit set as invalid or compares such pointers as signed values).
A test Visual C++ .NET 2010 application is available from SVN. More bug details on Microsoft Connect.
NOTE 1: You need to run “GetAdaptersAddressesTest /regserver” once to register the app before running it for the test.
NOTE 2: The problem does not seem to take place with 32-bit operating systems with /3GB tuning enabled.