|
|
/*++
Copyright (c) 2000-2002 Microsoft Corporation
Module Name:
PropagateProcessHistory.cpp
Abstract:
This DLL adds the current process to the __PROCESS_HISTORY environment variable. This is needed for 32-bit applications that launch other 32-bit executables that have been put in a temporary directory and have no appropriate side-step files. It allows the matching mechanism to locate files in the parent's directory, which are unique to the application.
History:
03/21/2000 markder Created 03/13/2002 mnikkel Modified to use strsafe and correctly handle error returns from GetEnvironmentVariableW and GetModuleFileNameW. Removed HEAP_GENERATE_EXCEPTIONS from HeapAllocs. 03/26/2002 mnikkel Removed incorrect checks for error on GetEnvironmentVariableW.
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(PropagateProcessHistory) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_END
/*++
Register hooked functions
--*/
BOOL NOTIFY_FUNCTION( DWORD fdwReason) { BOOL bRet = TRUE;
if (fdwReason == DLL_PROCESS_ATTACH) { DWORD dwProcessHistoryBufSize, dwExeFileNameBufSize, dwFullProcessSize; LPWSTR wszExeFileName = NULL, wszProcessHistory = NULL;
// Get size of buffers, note that if PROCESS_HISTORY is not defined that
// dwProcessHistoryBufSize can be zero. This is expected.
dwProcessHistoryBufSize = GetEnvironmentVariableW( L"__PROCESS_HISTORY", NULL, 0 ); dwExeFileNameBufSize = MAX_PATH*2; // GetModuleFileNameW doesn't return buffer size needed??;
dwFullProcessSize = dwProcessHistoryBufSize + dwExeFileNameBufSize + 2;
wszProcessHistory = (LPWSTR) HeapAlloc( GetProcessHeap(), 0, dwFullProcessSize * sizeof(WCHAR) );
wszExeFileName = (LPWSTR) HeapAlloc( GetProcessHeap(), 0, (dwExeFileNameBufSize + 1) * sizeof(WCHAR) );
if( wszExeFileName && wszProcessHistory ) { wszProcessHistory[0] = L'\0'; if (dwProcessHistoryBufSize > 0) { dwProcessHistoryBufSize = GetEnvironmentVariableW( L"__PROCESS_HISTORY", wszProcessHistory, dwProcessHistoryBufSize ); }
dwExeFileNameBufSize = GetModuleFileNameW( NULL, wszExeFileName, dwExeFileNameBufSize ); if (dwExeFileNameBufSize <= 0) { DPFN( eDbgLevelError, "GetModuleFileNameW failed."); bRet = FALSE; goto exitnotify; }
if( *wszProcessHistory && wszProcessHistory[wcslen(wszProcessHistory) - 1] != L';' ) StringCchCatW(wszProcessHistory, dwFullProcessSize, L";");
StringCchCatW(wszProcessHistory, dwFullProcessSize, wszExeFileName);
if( ! SetEnvironmentVariableW( L"__PROCESS_HISTORY", wszProcessHistory ) ) { DPFN( eDbgLevelError, "SetEnvironmentVariable failed!"); } else { DPFN( eDbgLevelInfo, "Current EXE added to process history"); DPFN( eDbgLevelInfo, "__PROCESS_HISTORY=%S", wszProcessHistory); } } else { DPFN( eDbgLevelError, "Could not allocate memory for strings"); bRet = FALSE; }
exitnotify: if( wszProcessHistory ) HeapFree( GetProcessHeap(), 0, wszProcessHistory );
if( wszExeFileName ) HeapFree( GetProcessHeap(), 0, wszExeFileName ); }
return bRet; }
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
HOOK_END
IMPLEMENT_SHIM_END
|