Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
Copyright (c) 2000 Microsoft Corporation
Module Name:
ProfilesEnvStrings.cpp
Abstract:
This DLL hooks GetEnvironmentVariableA and ExpandEnvironmentStringsA. Any application that is looking for %USERPROFILE% will be told the location of %ALLUSERSPROFILE% instead.
This shim is designed to fool install apps that use env variables obtain the users profile location.
Notes:
History:
08/07/2000 reinerf Created 02/28/2001 robkenny Converted to CString */
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(ProfilesEnvStrings) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(GetEnvironmentVariableA) APIHOOK_ENUM_ENTRY(ExpandEnvironmentStringsA) APIHOOK_ENUM_END
// if apps try to read the %USERPROFILE% env variable, we lie to them
DWORD APIHOOK(GetEnvironmentVariableA)( LPCSTR lpName, // environment variable name
LPSTR lpBuffer, // buffer for variable value
DWORD nSize // size of buffer
) { if (lstrcmpiA(lpName, "USERPROFILE") == 0) { LOGN( eDbgLevelInfo, "[GetEnvironmentVariableA] overriding USERPROFILE with ALLUSERSPROFILE."); return ORIGINAL_API(GetEnvironmentVariableA)("ALLUSERSPROFILE", lpBuffer, nSize); }
return ORIGINAL_API(GetEnvironmentVariableA)(lpName, lpBuffer, nSize); }
DWORD APIHOOK(ExpandEnvironmentStringsA)( LPCSTR lpSrc, // string with environment variables
LPSTR lpDst, // string with expanded strings
DWORD nSize // maximum characters in expanded string
) { DWORD dwRet = 0;
CSTRING_TRY { // replace UserProfile with AllUserProfile
CString csEnvironments(lpSrc); csEnvironments.ReplaceI(L"%userprofile%", L"%alluserprofile%"); dwRet = ORIGINAL_API(ExpandEnvironmentStringsA)(csEnvironments.GetAnsi(), lpDst, nSize); } CSTRING_CATCH { dwRet = ORIGINAL_API(ExpandEnvironmentStringsA)(lpSrc, lpDst, nSize); }
return dwRet; }
BOOL NOTIFY_FUNCTION( DWORD fdwReason ) { if (fdwReason == DLL_PROCESS_ATTACH) { OSVERSIONINFOEX osvi = {0}; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (GetVersionEx((OSVERSIONINFO*)&osvi)) { if (!((VER_SUITE_TERMINAL & osvi.wSuiteMask) && !(VER_SUITE_SINGLEUSERTS & osvi.wSuiteMask))) { //
// Only install hooks if we are not on a "Terminal Server"
// (aka "Application Server") machine.
//
APIHOOK_ENTRY(KERNEL32.DLL, GetEnvironmentVariableA); APIHOOK_ENTRY(KERNEL32.DLL, ExpandEnvironmentStringsA); } } } return TRUE; }
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
HOOK_END
IMPLEMENT_SHIM_END
|