master
 1#ifndef WIN32_LEAN_AND_MEAN
 2#define WIN32_LEAN_AND_MEAN
 3#endif
 4#undef  __CRT__NO_INLINE
 5#define __CRT__NO_INLINE
 6#include <winsock2.h>
 7#include <wspiapi.h>
 8
 9FARPROC WINAPI
10WspiapiLoad (WORD wFunction)
11{
12  static WINBOOL isinit = FALSE;
13  static WSPIAPI_FUNCTION rgtGlobal[] = WSPIAPI_FUNCTION_ARRAY;
14  static const int iNumGlobal = (sizeof(rgtGlobal) / sizeof(WSPIAPI_FUNCTION));
15  HMODULE hlib = NULL;
16  WSPIAPI_FUNCTION rgtLocal[] = WSPIAPI_FUNCTION_ARRAY;
17  FARPROC fScratch = NULL;
18  int i = 0;
19
20  if (isinit)
21    return rgtGlobal[wFunction].pfAddress;
22
23  for (;;)
24    {
25	CHAR systemdir[MAX_PATH + 1], path[MAX_PATH + 8];
26
27	if (GetSystemDirectoryA (systemdir, MAX_PATH) == 0)
28	  break;
29	strcpy (path, systemdir);
30	strcat (path, "\\ws2_32");
31	hlib = LoadLibraryA (path);
32	if(hlib != NULL)
33	  {
34	    fScratch = GetProcAddress (hlib, "getaddrinfo");
35	    if (!fScratch)
36	      {
37		FreeLibrary (hlib);
38		hlib = NULL;
39	      }
40	  }
41	if (hlib != NULL)
42	  break;
43	strcpy (path, systemdir);
44	strcat (path, "\\wship6");
45	hlib = LoadLibraryA (path);
46	if (hlib != NULL)
47	  {
48	    if ((fScratch = GetProcAddress (hlib, "getaddrinfo")) == NULL)
49	      {
50		FreeLibrary (hlib);
51		hlib = NULL;
52	      }
53	  }
54	break;
55    }
56  if (hlib != NULL)
57    {
58	for (i = 0; i < iNumGlobal; i++)
59	  {
60	    if ((rgtLocal[i].pfAddress = GetProcAddress (hlib, rgtLocal[i].pszName)) == NULL)
61	      {
62		FreeLibrary (hlib);
63		hlib = NULL;
64		break;
65	      }
66	  }
67	if (hlib != NULL)
68	  {
69	    for (i = 0; i < iNumGlobal; i++)
70	      rgtGlobal[i].pfAddress = rgtLocal[i].pfAddress;
71	  }
72    }
73  isinit = TRUE;
74  return rgtGlobal[wFunction].pfAddress;
75}