/*++ Copyright (c) 2000 Microsoft Corporation Module Name: Abstract: Notes: History: --*/ #include "precomp.h" IMPLEMENT_SHIM_BEGIN(TSPerUserFiles) #include "ShimHookMacro.h" #include "TSPerUserFiles_utils.h" APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(CreateFileA) APIHOOK_ENUM_ENTRY(CreateFileW) APIHOOK_ENUM_END CPerUserPaths* g_pPerUserPaths = NULL; HANDLE APIHOOK(CreateFileA)( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { LPCSTR strCorrect = lpFileName; if (g_pPerUserPaths) { strCorrect = g_pPerUserPaths->GetPerUserPathA(lpFileName); } return ORIGINAL_API(CreateFileA)(strCorrect, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } HANDLE APIHOOK(CreateFileW)( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { LPCWSTR strCorrect = lpFileName; if (g_pPerUserPaths) { strCorrect = g_pPerUserPaths->GetPerUserPathW(lpFileName); } return ORIGINAL_API(CreateFileW)(strCorrect, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } /*++ Register hooked functions --*/ BOOL NOTIFY_FUNCTION( DWORD fdwReason ) { if (fdwReason == DLL_PROCESS_ATTACH) { DPF("TSPerUserFiles", eDbgLevelInfo, "[NOTIFY_FUNCTION] DLL_PROCESS_ATTACH\n"); g_pPerUserPaths = new CPerUserPaths; if (g_pPerUserPaths) { if (!g_pPerUserPaths->Init()) { delete g_pPerUserPaths; g_pPerUserPaths = NULL; } } } else if (fdwReason == DLL_PROCESS_DETACH) { DPF("TSPerUserFiles", eDbgLevelInfo, "[NOTIFY_FUNCTION] DLL_PROCESS_DETACH\n"); } return TRUE; } HOOK_BEGIN APIHOOK_ENTRY(KERNEL32.DLL, CreateFileA) APIHOOK_ENTRY(KERNEL32.DLL, CreateFileW) CALL_NOTIFY_FUNCTION HOOK_END IMPLEMENT_SHIM_END