Dynamically load and detect iphlpapi. Makes rpcrt4 work on systems without the DLL...
authorAlex Ionescu <aionescu@gmail.com>
Thu, 26 May 2005 13:45:08 +0000 (13:45 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Thu, 26 May 2005 13:45:08 +0000 (13:45 +0000)
svn path=/trunk/; revision=15513

reactos/lib/rpcrt4/rpcrt4_main.c

index bdab2e8..4f8d66a 100644 (file)
@@ -319,6 +319,8 @@ static void RPC_UuidGetSystemTime(ULONGLONG *time)
     *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
@@ -329,28 +331,46 @@ static RPC_STATUS RPC_UuidGetNodeAddress(BYTE *address)
 \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