|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
ProfilesGetFolderPath.cpp
Abstract:
This DLL hooks shell32!SHGetFolderLocation, shell32!SHGetSpecialFolderLocation, and shell32!SHGetFolderPathA. Any application that is looking for a per-user CSIDL will be returned the corosponding all-users location instead.
This shim is designed to fool install apps that call shell32.dll api's to obtain shell folder locations.
History:
08/07/2000 reinerf Created 05/11/2001 markder Modified Removed Desktop redirection as it makes the shim too invasive. --*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(ProfilesGetFolderPath) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(SHGetFolderLocation) APIHOOK_ENUM_ENTRY(SHGetSpecialFolderLocation) APIHOOK_ENUM_ENTRY(SHGetFolderPathA) APIHOOK_ENUM_END
int TranslateCSIDL( int nFolder ) { switch (nFolder) {
case CSIDL_STARTMENU: DPFN( eDbgLevelInfo, "[TranslateCSIDL] overriding CSIDL_STARTMENU with CSIDL_COMMON_STARTMENU\n"); return CSIDL_COMMON_STARTMENU; break;
case CSIDL_STARTUP: DPFN( eDbgLevelInfo, "[TranslateCSIDL] overriding CSIDL_STARTUP with CSIDL_COMMON_STARTUP\n"); return CSIDL_COMMON_STARTUP; break;
case CSIDL_PROGRAMS: DPFN( eDbgLevelInfo, "[TranslateCSIDL] overriding CSIDL_PROGRAMS with CSIDL_COMMON_PROGRAMS\n"); return CSIDL_COMMON_PROGRAMS; break;
default: return nFolder; } }
HRESULT APIHOOK(SHGetSpecialFolderLocation)( HWND hwndOwner, int nFolder, LPITEMIDLIST* ppidl ) { return ORIGINAL_API(SHGetSpecialFolderLocation)(hwndOwner, TranslateCSIDL(nFolder), ppidl); }
HRESULT APIHOOK(SHGetFolderLocation)( HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST* ppidl ) { return ORIGINAL_API(SHGetFolderLocation)(hwndOwner, TranslateCSIDL(nFolder), hToken, dwReserved, ppidl); }
HRESULT APIHOOK(SHGetFolderPathA)( HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPSTR pszPath ) { return ORIGINAL_API(SHGetFolderPathA)(hwndOwner, TranslateCSIDL(nFolder), hToken, dwFlags, pszPath); }
// Register hooked functions
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(SHELL32.DLL, SHGetFolderLocation); APIHOOK_ENTRY(SHELL32.DLL, SHGetSpecialFolderLocation); APIHOOK_ENTRY(SHELL32.DLL, SHGetFolderPathA); } } } return TRUE; }
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
HOOK_END
IMPLEMENT_SHIM_END
|