129 lines
4.0 KiB
C++
129 lines
4.0 KiB
C++
/*++
|
|
|
|
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
|
|
|