/*++ Copyright (C) Microsoft Corporation, 2001 Module Name: WHttpImp.cxx Abstract: HTTP2 WinHttp import functionality. Author: KamenM 10-30-01 Created Revision History: --*/ #include #include #include RpcWinHttpImportTableType RpcWinHttpImportTable = {NULL}; HMODULE WinHttpLibrary = NULL; const char *RpcWinHttpImportTableFunctionNames[] = { "WinHttpOpen", "WinHttpSetStatusCallback", "WinHttpSetOption", "WinHttpConnect", "WinHttpOpenRequest", "WinHttpQueryOption", "WinHttpSendRequest", "WinHttpWriteData", "WinHttpReceiveResponse", "WinHttpReadData", "WinHttpCloseHandle", "WinHttpQueryHeaders", "WinHttpQueryDataAvailable", "WinHttpQueryAuthSchemes", "WinHttpSetCredentials", "WinHttpAddRequestHeaders" }; RPC_STATUS InitRpcWinHttpImportTable ( void ) /*++ Routine Description: Initializes the Rpc WinHttp import table. Must be called before any WinHttp function. The function must be idempotent. Arguments: Return Value: RPC_S_OK or RPC_S_* for error. --*/ { RPC_STATUS RpcStatus; int i; int FunctionsCount; FARPROC *CurrentFunction; HMODULE LocalWinHttpLibrary; GlobalMutexRequest(); if (WinHttpLibrary == NULL) { WinHttpLibrary = LoadLibrary(L"WinHttp.dll"); if (WinHttpLibrary == NULL) { RpcStatus = GetLastError(); GlobalMutexClear(); if (RpcStatus == ERROR_FILE_NOT_FOUND) RpcStatus = RPC_S_CANNOT_SUPPORT; else RpcStatus = RPC_S_OUT_OF_MEMORY; return RpcStatus; } } FunctionsCount = sizeof(RpcWinHttpImportTableFunctionNames) / sizeof(RpcWinHttpImportTableFunctionNames[0]); CurrentFunction = (FARPROC *) &RpcWinHttpImportTable; for (i = 0; i < FunctionsCount; i ++) { *CurrentFunction = GetProcAddress(WinHttpLibrary, RpcWinHttpImportTableFunctionNames[i] ); if (*CurrentFunction == NULL) { LocalWinHttpLibrary = WinHttpLibrary; WinHttpLibrary = NULL; GlobalMutexClear(); FreeLibrary(LocalWinHttpLibrary); return RPC_S_CANNOT_SUPPORT; } CurrentFunction ++; } GlobalMutexClear(); return RPC_S_OK; }