|
|
/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
LUA_TrackFS.cpp
Abstract: Track the directories the app looks at and record them into a file.
Notes:
This is a general purpose shim.
History:
04/04/2001 maonis Created
--*/
#include "precomp.h"
#include "utils.h"
HFILE LuatOpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle); HFILE Luat_lopen(LPCSTR, int); HFILE Luat_lcreat(LPCSTR, int);
class CTrackObject; extern CTrackObject g_td;
IMPLEMENT_SHIM_BEGIN(LUATrackFS) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(CreateFileA) APIHOOK_ENUM_ENTRY(CreateFileW) APIHOOK_ENUM_ENTRY(CopyFileA) APIHOOK_ENUM_ENTRY(CopyFileW) APIHOOK_ENUM_ENTRY(OpenFile) APIHOOK_ENUM_ENTRY(_lopen) APIHOOK_ENUM_ENTRY(_lcreat) APIHOOK_ENUM_ENTRY(CreateDirectoryA) APIHOOK_ENUM_ENTRY(CreateDirectoryW) APIHOOK_ENUM_ENTRY(SetFileAttributesA) APIHOOK_ENUM_ENTRY(SetFileAttributesW) APIHOOK_ENUM_ENTRY(DeleteFileA) APIHOOK_ENUM_ENTRY(DeleteFileW) APIHOOK_ENUM_ENTRY(MoveFileA) APIHOOK_ENUM_ENTRY(MoveFileW) APIHOOK_ENUM_ENTRY(RemoveDirectoryA) APIHOOK_ENUM_ENTRY(RemoveDirectoryW) APIHOOK_ENUM_ENTRY(GetTempFileNameA) APIHOOK_ENUM_ENTRY(GetTempFileNameW) APIHOOK_ENUM_ENTRY(WritePrivateProfileStringA) APIHOOK_ENUM_ENTRY(WritePrivateProfileStringW) APIHOOK_ENUM_ENTRY(WritePrivateProfileSectionA) APIHOOK_ENUM_ENTRY(WritePrivateProfileSectionW) APIHOOK_ENUM_ENTRY(WritePrivateProfileStructA) APIHOOK_ENUM_ENTRY(WritePrivateProfileStructW) APIHOOK_ENUM_END
HANDLE APIHOOK(CreateFileW)( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { return LuatCreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); }
HANDLE APIHOOK(CreateFileA)( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { STRINGA2W wstrFileName(lpFileName);
return (wstrFileName.m_fIsOutOfMemory ? ORIGINAL_API(CreateFileA)( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile) :
LuatCreateFileW( wstrFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)); }
BOOL APIHOOK(CopyFileW)( LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, BOOL bFailIfExists ) { return LuatCopyFileW(lpExistingFileName, lpNewFileName, bFailIfExists); }
BOOL APIHOOK(CopyFileA)( LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists ) { STRINGA2W wstrExistingFileName(lpExistingFileName); STRINGA2W wstrNewFileName(lpNewFileName);
return ((wstrExistingFileName.m_fIsOutOfMemory || wstrNewFileName.m_fIsOutOfMemory) ? ORIGINAL_API(CopyFileA)(lpExistingFileName, lpNewFileName, bFailIfExists) : LuatCopyFileW(wstrExistingFileName, wstrNewFileName, bFailIfExists)); }
HFILE APIHOOK(OpenFile)( LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle ) { return LuatOpenFile(lpFileName, lpReOpenBuff, uStyle); }
HFILE APIHOOK(_lopen)( LPCSTR lpPathName, int iReadWrite ) { return Luat_lopen(lpPathName, iReadWrite); }
HFILE APIHOOK(_lcreat)( LPCSTR lpPathName, int iAttribute ) { return Luat_lcreat(lpPathName, iAttribute); }
BOOL APIHOOK(CreateDirectoryW)( LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ) { return LuatCreateDirectoryW(lpPathName, lpSecurityAttributes); }
BOOL APIHOOK(CreateDirectoryA)( LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ) { STRINGA2W wstrPathName(lpPathName);
return (wstrPathName.m_fIsOutOfMemory ? ORIGINAL_API(CreateDirectoryA)(lpPathName, lpSecurityAttributes) : LuatCreateDirectoryW(wstrPathName, lpSecurityAttributes)); }
BOOL APIHOOK(SetFileAttributesW)( LPCWSTR lpFileName, DWORD dwFileAttributes ) { return LuatSetFileAttributesW(lpFileName, dwFileAttributes); }
BOOL APIHOOK(SetFileAttributesA)( LPCSTR lpFileName, DWORD dwFileAttributes ) { STRINGA2W wstrFileName(lpFileName);
return (wstrFileName.m_fIsOutOfMemory ? ORIGINAL_API(SetFileAttributesA)(lpFileName, dwFileAttributes) : LuatSetFileAttributesW(wstrFileName, dwFileAttributes)); }
BOOL APIHOOK(DeleteFileW)( LPCWSTR lpFileName ) { return LuatDeleteFileW(lpFileName); }
BOOL APIHOOK(DeleteFileA)( LPCSTR lpFileName ) { STRINGA2W wstrFileName(lpFileName);
return (wstrFileName.m_fIsOutOfMemory ? ORIGINAL_API(DeleteFileA)(lpFileName) : LuatDeleteFileW(wstrFileName)); }
BOOL APIHOOK(MoveFileW)( LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName ) { return LuatMoveFileW(lpExistingFileName, lpNewFileName); }
BOOL APIHOOK(MoveFileA)( LPCSTR lpExistingFileName, LPCSTR lpNewFileName ) { STRINGA2W wstrExistingFileName(lpExistingFileName); STRINGA2W wstrNewFileName(lpNewFileName);
return ((wstrExistingFileName.m_fIsOutOfMemory || wstrNewFileName.m_fIsOutOfMemory) ? ORIGINAL_API(MoveFileA)(lpExistingFileName, lpNewFileName) : LuatMoveFileW(wstrExistingFileName, wstrNewFileName)); }
BOOL APIHOOK(RemoveDirectoryW)( LPCWSTR lpPathName ) { return LuatRemoveDirectoryW(lpPathName); }
BOOL APIHOOK(RemoveDirectoryA)( LPCSTR lpPathName ) { STRINGA2W wstrPathName(lpPathName);
return (wstrPathName.m_fIsOutOfMemory ? ORIGINAL_API(RemoveDirectoryA)(lpPathName) : LuatRemoveDirectoryW(wstrPathName)); }
UINT APIHOOK(GetTempFileNameW)( LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName ) { return LuatGetTempFileNameW(lpPathName, lpPrefixString, uUnique, lpTempFileName); }
UINT APIHOOK(GetTempFileNameA)( LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName ) { STRINGA2W wstrPathName(lpPathName); STRINGA2W wstrPrefixString(lpPrefixString);
if (wstrPathName.m_fIsOutOfMemory || wstrPrefixString.m_fIsOutOfMemory) { return ORIGINAL_API(GetTempFileNameA)( lpPathName, lpPrefixString, uUnique, lpTempFileName); }
WCHAR wstrTempFileName[MAX_PATH]; UINT uiRes; if (uiRes = LuatGetTempFileNameW( wstrPathName, wstrPrefixString, uUnique, wstrTempFileName)) { UnicodeToAnsi(wstrTempFileName, lpTempFileName); }
return uiRes; }
BOOL APIHOOK(WritePrivateProfileStringW)( LPCWSTR lpAppName, LPCWSTR lpKeyName, LPCWSTR lpString, LPCWSTR lpFileName ) { return LuatWritePrivateProfileStringW( lpAppName, lpKeyName, lpString, lpFileName); }
BOOL APIHOOK(WritePrivateProfileStringA)( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName ) { STRINGA2W wstrAppName(lpAppName); STRINGA2W wstrKeyName(lpKeyName); STRINGA2W wstrString(lpString); STRINGA2W wstrFileName(lpFileName);
return ((wstrAppName.m_fIsOutOfMemory || wstrKeyName.m_fIsOutOfMemory || wstrString.m_fIsOutOfMemory || wstrFileName.m_fIsOutOfMemory) ?
ORIGINAL_API(WritePrivateProfileStringA)( lpAppName, lpKeyName, lpString, lpFileName) :
LuatWritePrivateProfileStringW( wstrAppName, wstrKeyName, wstrString, wstrFileName)); }
BOOL APIHOOK(WritePrivateProfileSectionW)( LPCWSTR lpAppName, LPCWSTR lpString, LPCWSTR lpFileName ) { return LuatWritePrivateProfileSectionW( lpAppName, lpString, lpFileName); }
BOOL APIHOOK(WritePrivateProfileSectionA)( LPCSTR lpAppName, LPCSTR lpString, LPCSTR lpFileName ) { STRINGA2W wstrAppName(lpAppName); STRINGA2W wstrString(lpString); STRINGA2W wstrFileName(lpFileName);
return ((wstrAppName.m_fIsOutOfMemory || wstrString.m_fIsOutOfMemory || wstrFileName.m_fIsOutOfMemory) ?
ORIGINAL_API(WritePrivateProfileSectionA)( lpAppName, lpString, lpFileName) :
LuatWritePrivateProfileSectionW( wstrAppName, wstrString, wstrFileName)); }
BOOL APIHOOK(WritePrivateProfileStructW)( LPCWSTR lpszSection, LPCWSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCWSTR szFile ) { return LuatWritePrivateProfileStructW( lpszSection, lpszKey, lpStruct, uSizeStruct, szFile); }
BOOL APIHOOK(WritePrivateProfileStructA)( LPCSTR lpszSection, LPCSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCSTR szFile ) { STRINGA2W wstrSection(lpszSection); STRINGA2W wstrKey(lpszKey); STRINGA2W wstrFile(szFile);
return ((wstrSection.m_fIsOutOfMemory || wstrKey.m_fIsOutOfMemory || wstrFile.m_fIsOutOfMemory) ?
ORIGINAL_API(WritePrivateProfileStructA)( lpszSection, lpszKey, lpStruct, uSizeStruct, szFile) :
LuatWritePrivateProfileStructW( wstrSection, wstrKey, lpStruct, uSizeStruct, wstrFile)); }
BOOL NOTIFY_FUNCTION( DWORD fdwReason) { if (fdwReason == DLL_PROCESS_ATTACH) { return LuatFSInit(); } else if (fdwReason == DLL_PROCESS_DETACH) { LuatFSCleanup(); }
return TRUE; }
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(KERNEL32.DLL, CreateFileA) APIHOOK_ENTRY(KERNEL32.DLL, CreateFileW) APIHOOK_ENTRY(KERNEL32.DLL, CopyFileA) APIHOOK_ENTRY(KERNEL32.DLL, CopyFileW) APIHOOK_ENTRY(KERNEL32.DLL, OpenFile) APIHOOK_ENTRY(KERNEL32.DLL, _lopen) APIHOOK_ENTRY(KERNEL32.DLL, _lcreat) APIHOOK_ENTRY(KERNEL32.DLL, CreateDirectoryA) APIHOOK_ENTRY(KERNEL32.DLL, CreateDirectoryW) APIHOOK_ENTRY(KERNEL32.DLL, SetFileAttributesA) APIHOOK_ENTRY(KERNEL32.DLL, SetFileAttributesW) APIHOOK_ENTRY(KERNEL32.DLL, DeleteFileA) APIHOOK_ENTRY(KERNEL32.DLL, DeleteFileW) APIHOOK_ENTRY(KERNEL32.DLL, MoveFileA) APIHOOK_ENTRY(KERNEL32.DLL, MoveFileW) APIHOOK_ENTRY(KERNEL32.DLL, RemoveDirectoryA) APIHOOK_ENTRY(KERNEL32.DLL, RemoveDirectoryW) APIHOOK_ENTRY(KERNEL32.DLL, GetTempFileNameA) APIHOOK_ENTRY(KERNEL32.DLL, GetTempFileNameW) APIHOOK_ENTRY(KERNEL32.DLL, WritePrivateProfileStringA) APIHOOK_ENTRY(KERNEL32.DLL, WritePrivateProfileStringW) APIHOOK_ENTRY(KERNEL32.DLL, WritePrivateProfileSectionA) APIHOOK_ENTRY(KERNEL32.DLL, WritePrivateProfileSectionW) APIHOOK_ENTRY(KERNEL32.DLL, WritePrivateProfileStructA) APIHOOK_ENTRY(KERNEL32.DLL, WritePrivateProfileStructW)
HOOK_END
IMPLEMENT_SHIM_END
|