/*++ Copyright (c) 2001 Microsoft Corporation Module Name: dload.cpp Abstract: This file implement dload error handling --*/ #include "precomp.h" #include BOOL BITSFailureHookWinHttpAddRequestHeaders( IN HINTERNET hRequest, IN LPCWSTR lpszHeaders, IN DWORD dwHeadersLength, IN DWORD dwModifiers ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } BOOL BITSFailureHookWinHttpCloseHandle( IN HINTERNET hInternet ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } HINTERNET BITSFailureHookWinHttpConnect( IN HINTERNET hInternetSession, IN LPCWSTR pszServerNameW, IN INTERNET_PORT nServerPort, IN DWORD dwReserved ) { SetLastError( ERROR_MOD_NOT_FOUND ); return NULL; } BOOL BITSFailureHookWinHttpCrackUrl( IN LPCWSTR pszUrlW, IN DWORD dwUrlLengthW, IN DWORD dwFlags, IN OUT LPURL_COMPONENTS pUCW ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } HINTERNET BITSFailureHookWinHttpOpen( IN LPCWSTR pszAgentW, IN DWORD dwAccessType, IN LPCWSTR pszProxyW OPTIONAL, IN LPCWSTR pszProxyBypassW OPTIONAL, IN DWORD dwFlags ) { SetLastError( ERROR_MOD_NOT_FOUND ); return NULL; } HINTERNET BITSFailureHookWinHttpOpenRequest( IN HINTERNET hConnect, IN LPCWSTR lpszVerb, IN LPCWSTR lpszObjectName, IN LPCWSTR lpszVersion, IN LPCWSTR lpszReferrer OPTIONAL, IN LPCWSTR FAR * lplpszAcceptTypes OPTIONAL, IN DWORD dwFlags ) { SetLastError( ERROR_MOD_NOT_FOUND ); return NULL; } BOOL BITSFailureHookWinHttpQueryHeaders( IN HINTERNET hRequest, IN DWORD dwInfoLevel, IN LPCWSTR lpszName OPTIONAL, OUT LPVOID lpBuffer OPTIONAL, IN OUT LPDWORD lpdwBufferLength, IN OUT LPDWORD lpdwIndex OPTIONAL ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } BOOL BITSFailureHookWinHttpReadData( IN HINTERNET hFile, IN LPVOID lpBuffer, IN DWORD dwNumberOfBytesToRead, OUT LPDWORD lpdwNumberOfBytesRead ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } BOOL BITSFailureHookWinHttpReceiveResponse( IN HINTERNET hRequest, IN LPVOID lpBuffersOut OPTIONAL ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } BOOL BITSFailureHookWinHttpSendRequest( IN HINTERNET hRequest, IN LPCWSTR lpszHeaders OPTIONAL, IN DWORD dwHeadersLength, IN LPVOID lpOptional OPTIONAL, IN DWORD dwOptionalLength, IN DWORD dwTotalLength, IN DWORD_PTR dwContext ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } BOOL BITSFailureHookWinHttpWriteData( IN HINTERNET hFile, IN LPCVOID lpBuffer, IN DWORD dwNumberOfBytesToWrite, OUT LPDWORD lpdwNumberOfBytesWritten ) { SetLastError( ERROR_MOD_NOT_FOUND ); return FALSE; } struct FailureHookTableEntry { LPCSTR pszDllName; LPCSTR pszProcName; FARPROC pfnHandler; }; FailureHookTableEntry FailureHookTable[] = { { "winhttp.dll", "WinHttpAddRequestHeaders", (FARPROC)BITSFailureHookWinHttpAddRequestHeaders }, { "winhttp.dll", "WinHttpCloseHandle", (FARPROC)BITSFailureHookWinHttpCloseHandle }, { "winhttp.dll", "WinHttpConnect", (FARPROC)BITSFailureHookWinHttpConnect }, { "winhttp.dll", "WinHttpCrackUrl", (FARPROC)BITSFailureHookWinHttpCrackUrl }, { "winhttp.dll", "WinHttpOpen", (FARPROC)BITSFailureHookWinHttpOpen }, { "winhttp.dll", "WinHttpOpenRequest", (FARPROC)BITSFailureHookWinHttpOpenRequest }, { "winhttp.dll", "WinHttpQueryHeaders", (FARPROC)BITSFailureHookWinHttpQueryHeaders }, { "winhttp.dll", "WinHttpReadData", (FARPROC)BITSFailureHookWinHttpReadData }, { "winhttp.dll", "WinHttpReceiveResponse", (FARPROC)BITSFailureHookWinHttpReceiveResponse }, { "winhttp.dll", "WinHttpSendRequest", (FARPROC)BITSFailureHookWinHttpSendRequest }, { "winhttp.dll", "WinHttpWriteData", (FARPROC)BITSFailureHookWinHttpWriteData }, { NULL, NULL, NULL } }; FARPROC LookupFailureHook( LPCSTR pszDllName, LPCSTR pszProcName ) { for ( FailureHookTableEntry *p = FailureHookTable; p->pszDllName; p++ ) { if ( ( lstrcmpiA( pszDllName, p->pszDllName ) == 0 ) && ( lstrcmpiA( pszProcName, p->pszProcName ) == 0 ) ) { return p->pfnHandler; } } ASSERT( 0 ); return NULL; } FARPROC WINAPI BITSSERVER_DelayLoadFailureHook( UINT unReason, PDelayLoadInfo pDelayInfo ) { // For a failed LoadLibrary, we return a bogus HMODULE of -1 to force // DLOAD call again with dliFailGetProc if (dliFailLoadLib == unReason) { return (FARPROC)-1; } if (dliFailGetProc == unReason) { // The loader is asking us to return a pointer to a procedure. // Lookup the handler for this DLL/procedure and, if found, return it. return LookupFailureHook(pDelayInfo->szDll, pDelayInfo->dlp.szProcName); } return NULL; }