Logo Search packages:      
Sourcecode: mingw-w64 version File versions

WspiapiLoad.c

#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;
}

Generated by  Doxygen 1.6.0   Back to index