*time += TICKS_15_OCT_1582_TO_1601;\r
}\r
\r
+typedef DWORD WINAPI (*LPGETADAPTERSINFO)(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);\r
+\r
/* Assume that a hardware address is at least 6 bytes long */ \r
#define ADDRESS_BYTES_NEEDED 6\r
\r
\r
ULONG buflen = sizeof(IP_ADAPTER_INFO);\r
PIP_ADAPTER_INFO adapter = HeapAlloc(GetProcessHeap(), 0, buflen);\r
-\r
- if (GetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) {\r
- HeapFree(GetProcessHeap(), 0, adapter);\r
- adapter = HeapAlloc(GetProcessHeap(), 0, buflen);\r
- }\r
-\r
- if (GetAdaptersInfo(adapter, &buflen) == NO_ERROR) {\r
- for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) {\r
- address[i] = adapter->Address[i];\r
+ HANDLE hIpHlpApi;\r
+ LPGETADAPTERSINFO pGetAdaptersInfo;\r
+ \r
+ hIpHlpApi = LoadLibrary("iphlpapi.dll");\r
+ if (hIpHlpApi)\r
+ {\r
+ pGetAdaptersInfo = (LPGETADAPTERSINFO)GetProcAddress(hIpHlpApi, "GetAdaptersInfo");\r
+ if (pGetAdaptersInfo)\r
+ {\r
+ if (pGetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) {\r
+ HeapFree(GetProcessHeap(), 0, adapter);\r
+ adapter = HeapAlloc(GetProcessHeap(), 0, buflen);\r
+ }\r
+\r
+ if (pGetAdaptersInfo(adapter, &buflen) == NO_ERROR) {\r
+ for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) {\r
+ address[i] = adapter->Address[i];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ goto local;\r
+ } \r
}\r
+ \r
+ /* Free the Library */\r
+ FreeLibrary(hIpHlpApi);\r
+ goto exit;\r
}\r
+ \r
+local: \r
/* We can't get a hardware address, just use random numbers.\r
- Set the multicast bit to prevent conflicts with real cards. */\r
- else {\r
- for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) {\r
- address[i] = rand() & 0xff;\r
- }\r
-\r
- address[0] |= 0x01;\r
- status = RPC_S_UUID_LOCAL_ONLY;\r
+ Set the multicast bit to prevent conflicts with real cards. */\r
+ for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) {\r
+ address[i] = rand() & 0xff;\r
}\r
-\r
+ address[0] |= 0x01;\r
+ status = RPC_S_UUID_LOCAL_ONLY;\r
+ \r
+exit:\r
HeapFree(GetProcessHeap(), 0, adapter);\r
return status;\r
}\r