From c46c9878567a6120463b8f78a766285d6bc0a4aa Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Mon, 4 Aug 2008 17:48:21 -0700 Subject: [PATCH] Dynamically load iphlpapi --- dlls/rpcrt4/Makefile.in | 2 +- dlls/rpcrt4/rpcrt4_main.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dlls/rpcrt4/Makefile.in b/dlls/rpcrt4/Makefile.in index 14ee4a3..b44bfb0 100644 --- a/dlls/rpcrt4/Makefile.in +++ b/dlls/rpcrt4/Makefile.in @@ -5,7 +5,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = rpcrt4.dll IMPORTLIB = rpcrt4 -IMPORTS = uuid iphlpapi advapi32 kernel32 ntdll +IMPORTS = uuid advapi32 kernel32 ntdll DELAYIMPORTS = secur32 user32 C_SRCS = \ diff --git a/dlls/rpcrt4/rpcrt4_main.c b/dlls/rpcrt4/rpcrt4_main.c index 1f0b1bb..ff51821 100644 --- a/dlls/rpcrt4/rpcrt4_main.c +++ b/dlls/rpcrt4/rpcrt4_main.c @@ -304,18 +304,23 @@ #define ADDRESS_BYTES_NEEDED 6 static RPC_STATUS RPC_UuidGetNodeAddress(BYTE *address) { + static const WCHAR iphlpapi[] = { 'i','p','h','l','p','a','p','i',0 }; int i; DWORD status = RPC_S_OK; ULONG buflen = sizeof(IP_ADAPTER_INFO); PIP_ADAPTER_INFO adapter = HeapAlloc(GetProcessHeap(), 0, buflen); + HMODULE lib = LoadLibraryW(iphlpapi); + DWORD (WINAPI *pGetAdaptersInfo)(PIP_ADAPTER_INFO, PULONG) = NULL; - if (GetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) { + if (lib) + pGetAdaptersInfo = (void *)GetProcAddress(lib, "GetAdaptersInfo"); + if (pGetAdaptersInfo && pGetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) { HeapFree(GetProcessHeap(), 0, adapter); adapter = HeapAlloc(GetProcessHeap(), 0, buflen); } - if (GetAdaptersInfo(adapter, &buflen) == NO_ERROR) { + if (pGetAdaptersInfo && pGetAdaptersInfo(adapter, &buflen) == NO_ERROR) { for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) { address[i] = adapter->Address[i]; } @@ -332,6 +337,7 @@ static RPC_STATUS RPC_UuidGetNodeAddress } HeapFree(GetProcessHeap(), 0, adapter); + FreeLibrary(lib); return status; } -- 1.4.1