|
|
/*++
Copyright (c) 2000 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
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(PropagateProcessHistory) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_END
/*++
Register hooked functions
--*/
BOOL NOTIFY_FUNCTION( DWORD fdwReason) { if (fdwReason == DLL_PROCESS_ATTACH) { DWORD dwProcessHistoryBufSize, dwExeFileNameBufSize; LPWSTR wszExeFileName = NULL, wszProcessHistory = NULL;
dwProcessHistoryBufSize = GetEnvironmentVariableW( L"__PROCESS_HISTORY", NULL, 0 ); dwExeFileNameBufSize = MAX_PATH; // GetModuleFileNameW doesn't return buffer size needed??;
wszProcessHistory = (LPWSTR) HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, (dwProcessHistoryBufSize + dwExeFileNameBufSize + 2) * sizeof(WCHAR) );
wszExeFileName = (LPWSTR) HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, (dwExeFileNameBufSize + 1) * sizeof(WCHAR) );
if( wszExeFileName && wszProcessHistory ) { wszProcessHistory[0] = L'\0'; dwProcessHistoryBufSize = GetEnvironmentVariableW( L"__PROCESS_HISTORY", wszProcessHistory, dwProcessHistoryBufSize );
dwExeFileNameBufSize = GetModuleFileNameW( NULL, wszExeFileName, dwExeFileNameBufSize );
if( *wszProcessHistory && wszProcessHistory[wcslen(wszProcessHistory) - 1] != L';' ) wcscat( wszProcessHistory, L";" );
wcscat( wszProcessHistory, 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");
if( wszProcessHistory ) HeapFree( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, wszProcessHistory );
if( wszExeFileName ) HeapFree( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, wszExeFileName ); }
return TRUE; }
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
HOOK_END
IMPLEMENT_SHIM_END
|