windows-nt/Source/XPSP1/NT/com/rpc/runtime/trans/common/whttpimp.cxx
2020-09-26 16:20:57 +08:00

117 lines
2.4 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 2001
Module Name:
WHttpImp.cxx
Abstract:
HTTP2 WinHttp import functionality.
Author:
KamenM 10-30-01 Created
Revision History:
--*/
#include <precomp.hxx>
#include <Http2Log.hxx>
#include <WHttpImp.hxx>
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;
}