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.
136 lines
3.1 KiB
136 lines
3.1 KiB
/*++
|
|
|
|
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
|
|
|