106 lines
3.1 KiB
C++
106 lines
3.1 KiB
C++
|
/*++
|
||
|
|
||
|
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
|
||
|
|