| #ifndef WIN32_LEAN_AND_MEAN |
| #define WIN32_LEAN_AND_MEAN |
| #endif |
| #undef __CRT__NO_INLINE |
| #define __CRT__NO_INLINE |
| #include <winsock2.h> |
| #include <wspiapi.h> |
| |
| FARPROC WINAPI |
| WspiapiLoad (WORD wFunction) |
| { |
| static WINBOOL isinit = FALSE; |
| static WSPIAPI_FUNCTION rgtGlobal[] = WSPIAPI_FUNCTION_ARRAY; |
| static const int iNumGlobal = (sizeof(rgtGlobal) / sizeof(WSPIAPI_FUNCTION)); |
| HMODULE hlib = NULL; |
| WSPIAPI_FUNCTION rgtLocal[] = WSPIAPI_FUNCTION_ARRAY; |
| FARPROC fScratch = NULL; |
| int i = 0; |
| |
| if (isinit) |
| return rgtGlobal[wFunction].pfAddress; |
| |
| for (;;) |
| { |
| CHAR systemdir[MAX_PATH + 1], path[MAX_PATH + 8]; |
| |
| if (GetSystemDirectoryA (systemdir, MAX_PATH) == 0) |
| break; |
| strcpy (path, systemdir); |
| strcat (path, "\\ws2_32"); |
| hlib = LoadLibraryA (path); |
| if(hlib != NULL) |
| { |
| fScratch = GetProcAddress (hlib, "getaddrinfo"); |
| if (!fScratch) |
| { |
| FreeLibrary (hlib); |
| hlib = NULL; |
| } |
| } |
| if (hlib != NULL) |
| break; |
| strcpy (path, systemdir); |
| strcat (path, "\\wship6"); |
| hlib = LoadLibraryA (path); |
| if (hlib != NULL) |
| { |
| if ((fScratch = GetProcAddress (hlib, "getaddrinfo")) == NULL) |
| { |
| FreeLibrary (hlib); |
| hlib = NULL; |
| } |
| } |
| break; |
| } |
| if (hlib != NULL) |
| { |
| for (i = 0; i < iNumGlobal; i++) |
| { |
| if ((rgtLocal[i].pfAddress = GetProcAddress (hlib, rgtLocal[i].pszName)) == NULL) |
| { |
| FreeLibrary (hlib); |
| hlib = NULL; |
| break; |
| } |
| } |
| if (hlib != NULL) |
| { |
| for (i = 0; i < iNumGlobal; i++) |
| rgtGlobal[i].pfAddress = rgtLocal[i].pfAddress; |
| } |
| } |
| isinit = TRUE; |
| return rgtGlobal[wFunction].pfAddress; |
| } |