windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/propagateprocesshistory.cpp

106 lines
3.1 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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