1578 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			1578 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | //  Detours Test Program (trcreg.cpp of trcreg.dll)
 | ||
|  | //
 | ||
|  | //  Microsoft Research Detours Package
 | ||
|  | //
 | ||
|  | //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | ||
|  | //
 | ||
|  | #define _WIN32_WINNT        0x0400
 | ||
|  | #define WIN32
 | ||
|  | #define NT
 | ||
|  | 
 | ||
|  | #define DBG_TRACE   0
 | ||
|  | 
 | ||
|  | #include <windows.h>
 | ||
|  | #include <stdio.h>
 | ||
|  | #include "detours.h"
 | ||
|  | #include "syelog.h"
 | ||
|  | 
 | ||
|  | #define PULONG_PTR          PVOID
 | ||
|  | #define PLONG_PTR           PVOID
 | ||
|  | #define ULONG_PTR           PVOID
 | ||
|  | #define ENUMRESNAMEPROCA    PVOID
 | ||
|  | #define ENUMRESNAMEPROCW    PVOID
 | ||
|  | #define ENUMRESLANGPROCA    PVOID
 | ||
|  | #define ENUMRESLANGPROCW    PVOID
 | ||
|  | #define ENUMRESTYPEPROCA    PVOID
 | ||
|  | #define ENUMRESTYPEPROCW    PVOID
 | ||
|  | #define STGOPTIONS          PVOID
 | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | #pragma warning(disable:4127)   // Many of our asserts are constants.
 | ||
|  | 
 | ||
|  | #define ASSERT_ALWAYS(x)   \
 | ||
|  |     do {                                                        \ | ||
|  |     if (!(x)) {                                                 \ | ||
|  |             AssertMessage(#x, __FILE__, __LINE__);              \ | ||
|  |             DebugBreak();                                       \ | ||
|  |     }                                                           \ | ||
|  |     } while (0) | ||
|  | 
 | ||
|  | #ifndef NDEBUG
 | ||
|  | #define ASSERT(x)           ASSERT_ALWAYS(x)
 | ||
|  | #else
 | ||
|  | #define ASSERT(x)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define UNUSED(c)       (c) = (c)
 | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | static HMODULE s_hInst = NULL; | ||
|  | static CHAR s_szDllPath[MAX_PATH]; | ||
|  | 
 | ||
|  | BOOL ProcessEnumerate(); | ||
|  | BOOL InstanceEnumerate(HINSTANCE hInst); | ||
|  | 
 | ||
|  | VOID _PrintEnter(PCSTR psz, ...); | ||
|  | VOID _PrintExit(PCSTR psz, ...); | ||
|  | VOID _Print(PCSTR psz, ...); | ||
|  | 
 | ||
|  | VOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine); | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | extern "C" { | ||
|  |     HANDLE (WINAPI * | ||
|  |             Real_CreateFileW)(LPCWSTR a0, | ||
|  |                               DWORD a1, | ||
|  |                               DWORD a2, | ||
|  |                               LPSECURITY_ATTRIBUTES a3, | ||
|  |                               DWORD a4, | ||
|  |                               DWORD a5, | ||
|  |                               HANDLE a6) | ||
|  |         = CreateFileW; | ||
|  | 
 | ||
|  |     BOOL (WINAPI * | ||
|  |           Real_WriteFile)(HANDLE hFile, | ||
|  |                           LPCVOID lpBuffer, | ||
|  |                           DWORD nNumberOfBytesToWrite, | ||
|  |                           LPDWORD lpNumberOfBytesWritten, | ||
|  |                           LPOVERLAPPED lpOverlapped) | ||
|  |         = WriteFile; | ||
|  |     BOOL (WINAPI * | ||
|  |           Real_FlushFileBuffers)(HANDLE hFile) | ||
|  |         = FlushFileBuffers; | ||
|  |     BOOL (WINAPI * | ||
|  |           Real_CloseHandle)(HANDLE hObject) | ||
|  |         = CloseHandle; | ||
|  | 
 | ||
|  |     BOOL (WINAPI * | ||
|  |           Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut) | ||
|  |         = WaitNamedPipeW; | ||
|  |     BOOL (WINAPI * | ||
|  |           Real_SetNamedPipeHandleState)(HANDLE hNamedPipe, | ||
|  |                                         LPDWORD lpMode, | ||
|  |                                         LPDWORD lpMaxCollectionCount, | ||
|  |                                         LPDWORD lpCollectDataTimeout) | ||
|  |         = SetNamedPipeHandleState; | ||
|  | 
 | ||
|  |     DWORD (WINAPI * | ||
|  |            Real_GetCurrentProcessId)(VOID) | ||
|  |         = GetCurrentProcessId; | ||
|  |     VOID (WINAPI * | ||
|  |           Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime) | ||
|  |         = GetSystemTimeAsFileTime; | ||
|  | 
 | ||
|  |     VOID (WINAPI * | ||
|  |           Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection) | ||
|  |         = InitializeCriticalSection; | ||
|  |     VOID (WINAPI * | ||
|  |           Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection) | ||
|  |         = EnterCriticalSection; | ||
|  |     VOID (WINAPI * | ||
|  |           Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection) | ||
|  |         = LeaveCriticalSection; | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_CopyFileExA)(LPCSTR a0, | ||
|  |                                  LPCSTR a1, | ||
|  |                                  LPPROGRESS_ROUTINE a2, | ||
|  |                                  LPVOID a3, | ||
|  |                                  LPBOOL a4, | ||
|  |                                  DWORD a5) | ||
|  |     = CopyFileExA; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_CopyFileExW)(LPCWSTR a0, | ||
|  |                                  LPCWSTR a1, | ||
|  |                                  LPPROGRESS_ROUTINE a2, | ||
|  |                                  LPVOID a3, | ||
|  |                                  LPBOOL a4, | ||
|  |                                  DWORD a5) | ||
|  |     = CopyFileExW; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_CreateDirectoryExW)(LPCWSTR a0, | ||
|  |                                         LPCWSTR a1, | ||
|  |                                         LPSECURITY_ATTRIBUTES a2) | ||
|  |     = CreateDirectoryExW; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_CreateDirectoryW)(LPCWSTR a0, | ||
|  |                                       LPSECURITY_ATTRIBUTES a1) | ||
|  |     = CreateDirectoryW; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_CreateProcessW)(LPCWSTR lpApplicationName, | ||
|  |                                     LPWSTR lpCommandLine, | ||
|  |                                     LPSECURITY_ATTRIBUTES lpProcessAttributes, | ||
|  |                                     LPSECURITY_ATTRIBUTES lpThreadAttributes, | ||
|  |                                     BOOL bInheritHandles, | ||
|  |                                     DWORD dwCreationFlags, | ||
|  |                                     LPVOID lpEnvironment, | ||
|  |                                     LPCWSTR lpCurrentDirectory, | ||
|  |                                     LPSTARTUPINFOW lpStartupInfo, | ||
|  |                                     LPPROCESS_INFORMATION lpProcessInformation) | ||
|  |     = CreateProcessW; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_DeleteFileA)(LPCSTR a0) | ||
|  |     = DeleteFileA; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_DeleteFileW)(LPCWSTR a0) | ||
|  |     = DeleteFileW; | ||
|  | 
 | ||
|  | HANDLE (WINAPI * Real_FindFirstFileExA)(LPCSTR a0, | ||
|  |                                         FINDEX_INFO_LEVELS a1, | ||
|  |                                         LPVOID a2, | ||
|  |                                         FINDEX_SEARCH_OPS a3, | ||
|  |                                         LPVOID a4, | ||
|  |                                         DWORD a5) | ||
|  |     = FindFirstFileExA; | ||
|  | 
 | ||
|  | HANDLE (WINAPI * Real_FindFirstFileExW)(LPCWSTR a0, | ||
|  |                                         FINDEX_INFO_LEVELS a1, | ||
|  |                                         LPVOID a2, | ||
|  |                                         FINDEX_SEARCH_OPS a3, | ||
|  |                                         LPVOID a4, | ||
|  |                                         DWORD a5) | ||
|  |     = FindFirstFileExW; | ||
|  | 
 | ||
|  | DWORD (WINAPI * Real_GetFileAttributesW)(LPCWSTR a0) | ||
|  |     = GetFileAttributesW; | ||
|  | 
 | ||
|  | DWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0, | ||
|  |                                          LPWSTR a1, | ||
|  |                                          DWORD a2) | ||
|  |     = GetModuleFileNameW; | ||
|  | 
 | ||
|  | DWORD (WINAPI * Real_GetModuleFileNameA)(HMODULE a0, | ||
|  |                                          LPSTR a1, | ||
|  |                                          DWORD a2) | ||
|  |     = GetModuleFileNameA; | ||
|  | 
 | ||
|  | FARPROC (WINAPI * Real_GetProcAddress)(struct HINSTANCE__* a0, | ||
|  |                                        LPCSTR a1) | ||
|  |     = GetProcAddress; | ||
|  | 
 | ||
|  | HMODULE (WINAPI * Real_LoadLibraryExW)(LPCWSTR a0, | ||
|  |                                        HANDLE a1, | ||
|  |                                        DWORD a2) | ||
|  |     = LoadLibraryExW; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_MoveFileA)(LPCSTR a0, | ||
|  |                                LPCSTR a1) | ||
|  |     = MoveFileA; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_MoveFileExA)(LPCSTR a0, | ||
|  |                                  LPCSTR a1, | ||
|  |                                  DWORD a2) | ||
|  |     = MoveFileExA; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_MoveFileExW)(LPCWSTR a0, | ||
|  |                                  LPCWSTR a1, | ||
|  |                                  DWORD a2) | ||
|  |     = MoveFileExW; | ||
|  | 
 | ||
|  | BOOL (WINAPI * Real_MoveFileW)(LPCWSTR a0, | ||
|  |                                LPCWSTR a1) | ||
|  |     = MoveFileW; | ||
|  | 
 | ||
|  | HFILE (WINAPI * Real_OpenFile)(LPCSTR a0, | ||
|  |                                struct _OFSTRUCT* a1, | ||
|  |                                UINT a2) | ||
|  |     = OpenFile; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegCreateKeyExA)(HKEY a0, | ||
|  |                                      LPCSTR a1, | ||
|  |                                      DWORD a2, | ||
|  |                                      LPSTR a3, | ||
|  |                                      DWORD a4, | ||
|  |                                      REGSAM a5, | ||
|  |                                      LPSECURITY_ATTRIBUTES a6, | ||
|  |                                      PHKEY a7, | ||
|  |                                      LPDWORD a8) | ||
|  |     = RegCreateKeyExA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegCreateKeyExW)(HKEY a0, | ||
|  |                                      LPCWSTR a1, | ||
|  |                                      DWORD a2, | ||
|  |                                      LPWSTR a3, | ||
|  |                                      DWORD a4, | ||
|  |                                      REGSAM a5, | ||
|  |                                      LPSECURITY_ATTRIBUTES a6, | ||
|  |                                      PHKEY a7, | ||
|  |                                      LPDWORD a8) | ||
|  |     = RegCreateKeyExW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegDeleteKeyA)(HKEY a0, | ||
|  |                                    LPCSTR a1) | ||
|  |     = RegDeleteKeyA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegDeleteKeyW)(HKEY a0, | ||
|  |                                    LPCWSTR a1) | ||
|  |     = RegDeleteKeyW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegDeleteValueA)(HKEY a0, | ||
|  |                                      LPCSTR a1) | ||
|  |     = RegDeleteValueA; | ||
|  | 
 | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegDeleteValueW)(HKEY a0, | ||
|  |                                      LPCWSTR a1) | ||
|  |     = RegDeleteValueW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegEnumKeyExA)(HKEY a0, | ||
|  |                                    DWORD a1, | ||
|  |                                    LPSTR a2, | ||
|  |                                    LPDWORD a3, | ||
|  |                                    LPDWORD a4, | ||
|  |                                    LPSTR a5, | ||
|  |                                    LPDWORD a6, | ||
|  |                                    struct _FILETIME* a7) | ||
|  |     = RegEnumKeyExA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegEnumKeyExW)(HKEY a0, | ||
|  |                                    DWORD a1, | ||
|  |                                    LPWSTR a2, | ||
|  |                                    LPDWORD a3, | ||
|  |                                    LPDWORD a4, | ||
|  |                                    LPWSTR a5, | ||
|  |                                    LPDWORD a6, | ||
|  |                                    struct _FILETIME* a7) | ||
|  |     = RegEnumKeyExW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegEnumValueA)(HKEY a0, | ||
|  |                                    DWORD a1, | ||
|  |                                    LPSTR a2, | ||
|  |                                    LPDWORD a3, | ||
|  |                                    LPDWORD a4, | ||
|  |                                    LPDWORD a5, | ||
|  |                                    LPBYTE a6, | ||
|  |                                    LPDWORD a7) | ||
|  |     = RegEnumValueA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegEnumValueW)(HKEY a0, | ||
|  |                                    DWORD a1, | ||
|  |                                    LPWSTR a2, | ||
|  |                                    LPDWORD a3, | ||
|  |                                    LPDWORD a4, | ||
|  |                                    LPDWORD a5, | ||
|  |                                    LPBYTE a6, | ||
|  |                                    LPDWORD a7) | ||
|  |     = RegEnumValueW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegOpenKeyExA)(HKEY a0, | ||
|  |                                    LPCSTR a1, | ||
|  |                                    DWORD a2, | ||
|  |                                    REGSAM a3, | ||
|  |                                    PHKEY a4) | ||
|  |     = RegOpenKeyExA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegOpenKeyExW)(HKEY a0, | ||
|  |                                    LPCWSTR a1, | ||
|  |                                    DWORD a2, | ||
|  |                                    REGSAM a3, | ||
|  |                                    PHKEY a4) | ||
|  |     = RegOpenKeyExW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegQueryInfoKeyA)(HKEY a0, | ||
|  |                                       LPSTR a1, | ||
|  |                                       LPDWORD a2, | ||
|  |                                       LPDWORD a3, | ||
|  |                                       LPDWORD a4, | ||
|  |                                       LPDWORD a5, | ||
|  |                                       LPDWORD a6, | ||
|  |                                       LPDWORD a7, | ||
|  |                                       LPDWORD a8, | ||
|  |                                       LPDWORD a9, | ||
|  |                                       LPDWORD a10, | ||
|  |                                       struct _FILETIME* a11) | ||
|  |     = RegQueryInfoKeyA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegQueryInfoKeyW)(HKEY a0, | ||
|  |                                       LPWSTR a1, | ||
|  |                                       LPDWORD a2, | ||
|  |                                       LPDWORD a3, | ||
|  |                                       LPDWORD a4, | ||
|  |                                       LPDWORD a5, | ||
|  |                                       LPDWORD a6, | ||
|  |                                       LPDWORD a7, | ||
|  |                                       LPDWORD a8, | ||
|  |                                       LPDWORD a9, | ||
|  |                                       LPDWORD a10, | ||
|  |                                       struct _FILETIME* a11) | ||
|  |     = RegQueryInfoKeyW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegQueryValueExA)(HKEY a0, | ||
|  |                                       LPCSTR a1, | ||
|  |                                       LPDWORD a2, | ||
|  |                                       LPDWORD a3, | ||
|  |                                       LPBYTE a4, | ||
|  |                                       LPDWORD a5) | ||
|  |     = RegQueryValueExA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegQueryValueExW)(HKEY a0, | ||
|  |                                       LPCWSTR a1, | ||
|  |                                       LPDWORD a2, | ||
|  |                                       LPDWORD a3, | ||
|  |                                       LPBYTE a4, | ||
|  |                                       LPDWORD a5) | ||
|  |     = RegQueryValueExW; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegSetValueExA)(HKEY a0, | ||
|  |                                     LPCSTR a1, | ||
|  |                                     DWORD a2, | ||
|  |                                     DWORD a3, | ||
|  |                                     const BYTE* a4, | ||
|  |                                     DWORD a5) | ||
|  |     = RegSetValueExA; | ||
|  | 
 | ||
|  | LONG (WINAPI * Real_RegSetValueExW)(HKEY a0, | ||
|  |                                     LPCWSTR a1, | ||
|  |                                     DWORD a2, | ||
|  |                                     DWORD a3, | ||
|  |                                     const BYTE* a4, | ||
|  |                                     DWORD a5) | ||
|  |     = RegSetValueExW; | ||
|  | 
 | ||
|  | HFILE (WINAPI * Real__lcreat)(LPCSTR a0, | ||
|  |                               int a1) | ||
|  |     = _lcreat; | ||
|  | 
 | ||
|  | HFILE (WINAPI * Real__lopen)(LPCSTR a0, | ||
|  |                              int a1) | ||
|  |     = _lopen; | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////
 | ||
|  | // Detours
 | ||
|  | //
 | ||
|  | BOOL WINAPI Mine_WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut) | ||
|  | { | ||
|  |     return Real_WaitNamedPipeW(lpNamedPipeName, nTimeOut); | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_CloseHandle(HANDLE hObject) | ||
|  | { | ||
|  |     return Real_CloseHandle(hObject); | ||
|  | } | ||
|  | 
 | ||
|  | VOID WINAPI Mine_GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) | ||
|  | { | ||
|  |     Real_GetSystemTimeAsFileTime(lpSystemTimeAsFileTime); | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_SetNamedPipeHandleState(HANDLE hNamedPipe, | ||
|  |                                             LPDWORD lpMode, | ||
|  |                                             LPDWORD lpMaxCollectionCount, | ||
|  |                                             LPDWORD lpCollectDataTimeout) | ||
|  | { | ||
|  |     return Real_SetNamedPipeHandleState(hNamedPipe, | ||
|  |                                         lpMode, | ||
|  |                                         lpMaxCollectionCount, | ||
|  |                                         lpCollectDataTimeout); | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_WriteFile(HANDLE hFile, | ||
|  |                            LPCVOID lpBuffer, | ||
|  |                            DWORD nNumberOfBytesToWrite, | ||
|  |                            LPDWORD lpNumberOfBytesWritten, | ||
|  |                            LPOVERLAPPED lpOverlapped) | ||
|  | { | ||
|  |     return Real_WriteFile(hFile, | ||
|  |                           lpBuffer, | ||
|  |                           nNumberOfBytesToWrite, | ||
|  |                           lpNumberOfBytesWritten, | ||
|  |                           lpOverlapped); | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName, | ||
|  |                                 LPWSTR lpCommandLine, | ||
|  |                                 LPSECURITY_ATTRIBUTES lpProcessAttributes, | ||
|  |                                 LPSECURITY_ATTRIBUTES lpThreadAttributes, | ||
|  |                                 BOOL bInheritHandles, | ||
|  |                                 DWORD dwCreationFlags, | ||
|  |                                 LPVOID lpEnvironment, | ||
|  |                                 LPCWSTR lpCurrentDirectory, | ||
|  |                                 LPSTARTUPINFOW lpStartupInfo, | ||
|  |                                 LPPROCESS_INFORMATION lpProcessInformation) | ||
|  | { | ||
|  |     _PrintEnter("CreateProcessW(%ls,%ls,%p,%p,%x,%x,%p,%ls,%p,%p)\n", | ||
|  |                 lpApplicationName, | ||
|  |                 lpCommandLine, | ||
|  |                 lpProcessAttributes, | ||
|  |                 lpThreadAttributes, | ||
|  |                 bInheritHandles, | ||
|  |                 dwCreationFlags, | ||
|  |                 lpEnvironment, | ||
|  |                 lpCurrentDirectory, | ||
|  |                 lpStartupInfo, | ||
|  |                 lpProcessInformation); | ||
|  | 
 | ||
|  |     _Print("Calling DetourCreateProcessWithDllExW(,%hs)\n", s_szDllPath); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = DetourCreateProcessWithDllExW(lpApplicationName, | ||
|  |                                            lpCommandLine, | ||
|  |                                            lpProcessAttributes, | ||
|  |                                            lpThreadAttributes, | ||
|  |                                            bInheritHandles, | ||
|  |                                            dwCreationFlags, | ||
|  |                                            lpEnvironment, | ||
|  |                                            lpCurrentDirectory, | ||
|  |                                            lpStartupInfo, | ||
|  |                                            lpProcessInformation, | ||
|  |                                            s_szDllPath, | ||
|  |                                            Real_CreateProcessW); | ||
|  |     } __finally { | ||
|  |         _PrintExit("CreateProcessW(,,,,,,,,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | //
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_CopyFileExA(LPCSTR a0, | ||
|  |                              LPCSTR a1, | ||
|  |                              LPPROGRESS_ROUTINE a2, | ||
|  |                              LPVOID a3, | ||
|  |                              LPBOOL a4, | ||
|  |                              DWORD a5) | ||
|  | { | ||
|  |     _PrintEnter("CopyFileExA(%hs,%hs,%p,%p,%p,%x)\n", a0, a1, a2, a3, a4, a5); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_CopyFileExA(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("CopyFileExA(,,,,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_CopyFileExW(LPCWSTR a0, | ||
|  |                              LPCWSTR a1, | ||
|  |                              LPPROGRESS_ROUTINE a2, | ||
|  |                              LPVOID a3, | ||
|  |                              LPBOOL a4, | ||
|  |                              DWORD a5) | ||
|  | { | ||
|  |     _PrintEnter("CopyFileExW(%ls,%ls,%p,%p,%p,%x)\n", a0, a1, a2, a3, a4, a5); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_CopyFileExW(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("CopyFileExW(,,,,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_CreateDirectoryExW(LPCWSTR a0, | ||
|  |                                     LPCWSTR a1, | ||
|  |                                     LPSECURITY_ATTRIBUTES a2) | ||
|  | { | ||
|  |     _PrintEnter("CreateDirectoryExW(%ls,%ls,%p)\n", a0, a1, a2); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_CreateDirectoryExW(a0, a1, a2); | ||
|  |     } __finally { | ||
|  |         _PrintExit("CreateDirectoryExW(,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_CreateDirectoryW(LPCWSTR a0, | ||
|  |                                   LPSECURITY_ATTRIBUTES a1) | ||
|  | { | ||
|  |     _PrintEnter("CreateDirectoryW(%ls,%p)\n", a0, a1); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_CreateDirectoryW(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("CreateDirectoryW(,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HANDLE WINAPI Mine_CreateFileW(LPCWSTR a0, | ||
|  |                                DWORD a1, | ||
|  |                                DWORD a2, | ||
|  |                                LPSECURITY_ATTRIBUTES a3, | ||
|  |                                DWORD a4, | ||
|  |                                DWORD a5, | ||
|  |                                HANDLE a6) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     HANDLE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_CreateFileW(a0, a1, a2, a3, a4, a5, a6); | ||
|  |     } __finally { | ||
|  |         _PrintExit("CreateFileW(%ls,%x,%x,%p,%x,%x,%p) -> %p\n", | ||
|  |                    a0, a1, a2, a3, a4, a5, a6, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_DeleteFileA(LPCSTR a0) | ||
|  | { | ||
|  |     _PrintEnter("DeleteFileA(%hs)\n", a0); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_DeleteFileA(a0); | ||
|  |     } __finally { | ||
|  |         _PrintExit("DeleteFileA() -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_DeleteFileW(LPCWSTR a0) | ||
|  | { | ||
|  |     _PrintEnter("DeleteFileW(%ls)\n", a0); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_DeleteFileW(a0); | ||
|  |     } __finally { | ||
|  |         _PrintExit("DeleteFileW() -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HANDLE WINAPI Mine_FindFirstFileExA(LPCSTR a0, | ||
|  |                                     FINDEX_INFO_LEVELS a1, | ||
|  |                                     LPVOID a2, | ||
|  |                                     FINDEX_SEARCH_OPS a3, | ||
|  |                                     LPVOID a4, | ||
|  |                                     DWORD a5) | ||
|  | { | ||
|  |     _PrintEnter("FindFirstFileExA(%hs,%p,%p,%x,%p,%x)\n", a0, a1, a2, a3, a4, a5); | ||
|  | 
 | ||
|  |     HANDLE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_FindFirstFileExA(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("FindFirstFileExA(,,,,,) -> %p\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HANDLE WINAPI Mine_FindFirstFileExW(LPCWSTR a0, | ||
|  |                                     FINDEX_INFO_LEVELS a1, | ||
|  |                                     LPVOID a2, | ||
|  |                                     FINDEX_SEARCH_OPS a3, | ||
|  |                                     LPVOID a4, | ||
|  |                                     DWORD a5) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  | 
 | ||
|  |     HANDLE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_FindFirstFileExW(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("FindFirstFileExW(%ls,%x,%p,%x,%p,%x) -> %p\n", | ||
|  |                    a0, a1, a2, a3, a4, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD WINAPI Mine_GetFileAttributesW(LPCWSTR a0) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  | 
 | ||
|  |     DWORD rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_GetFileAttributesW(a0); | ||
|  |     } __finally { | ||
|  |         _PrintExit("GetFileAttributesW(%ls) -> %x\n", a0, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD WINAPI Mine_GetModuleFileNameW(HMODULE a0, LPWSTR a1, DWORD a2) | ||
|  | { | ||
|  |     _PrintEnter("GetModuleFileNameW(%p,%p,%x)\n", a0, a1, a2); | ||
|  |     DWORD rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_GetModuleFileNameW(a0, a1, a2); | ||
|  |     } __finally { | ||
|  |         _PrintExit("GetModuleFileNameW(%p,%p:%ls,%p) -> %p\n", a0, a1, a1, a2, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | FARPROC WINAPI Mine_GetProcAddress(HINSTANCE a0, | ||
|  |                                    LPCSTR a1) | ||
|  | { | ||
|  |     WCHAR wzModule[MAX_PATH] = L""; | ||
|  |     PWCHAR pwzModule = wzModule; | ||
|  |     if (Real_GetModuleFileNameW(a0, wzModule, ARRAYSIZE(wzModule)) != 0) { | ||
|  |         if ((pwzModule = wcsrchr(wzModule, '\\')) == NULL) { | ||
|  |             if ((pwzModule = wcsrchr(wzModule, ':')) == NULL) { | ||
|  |                 pwzModule = wzModule; | ||
|  |             } | ||
|  |             else { | ||
|  |                 pwzModule++;                            // Skip ':'
 | ||
|  |             } | ||
|  |         } | ||
|  |         else { | ||
|  |             pwzModule++;                                // Skip '\\'
 | ||
|  |         } | ||
|  |     } | ||
|  |     else { | ||
|  |         wzModule[0] = '\0'; | ||
|  |     } | ||
|  | 
 | ||
|  |     _PrintEnter(NULL); | ||
|  |     FARPROC rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_GetProcAddress(a0, a1); | ||
|  |     } __finally { | ||
|  |         if (pwzModule[0] == 0) { | ||
|  |             _PrintExit("GetProcAddress(%p,%hs) -> %p\n", a0, a1, rv); | ||
|  |         } | ||
|  |         else { | ||
|  |             _PrintExit("GetProcAddress(%p:%ls,%hs) -> %p\n", a0, pwzModule, a1, rv); | ||
|  |         } | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HMODULE WINAPI Mine_LoadLibraryExW(LPCWSTR a0, | ||
|  |                                    HANDLE a1, | ||
|  |                                    DWORD a2) | ||
|  | { | ||
|  |     _PrintEnter("LoadLibraryExW(%ls,%p,%x)\n", a0, a1, a2); | ||
|  | 
 | ||
|  |     HMODULE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_LoadLibraryExW(a0, a1, a2); | ||
|  |     } __finally { | ||
|  |         _PrintExit("LoadLibraryExW(,,) -> %p\n", rv); | ||
|  |         if (rv) { | ||
|  |             InstanceEnumerate(rv); | ||
|  |         } | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_MoveFileA(LPCSTR a0, | ||
|  |                            LPCSTR a1) | ||
|  | { | ||
|  |     _PrintEnter("MoveFileA(%hs,%hs)\n", a0, a1); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_MoveFileA(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("MoveFileA(,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_MoveFileExA(LPCSTR a0, | ||
|  |                              LPCSTR a1, | ||
|  |                              DWORD a2) | ||
|  | { | ||
|  |     _PrintEnter("MoveFileExA(%hs,%hs,%x)\n", a0, a1, a2); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_MoveFileExA(a0, a1, a2); | ||
|  |     } __finally { | ||
|  |         _PrintExit("MoveFileExA(,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_MoveFileExW(LPCWSTR a0, | ||
|  |                              LPCWSTR a1, | ||
|  |                              DWORD a2) | ||
|  | { | ||
|  |     _PrintEnter("MoveFileExW(%ls,%ls,%x)\n", a0, a1, a2); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_MoveFileExW(a0, a1, a2); | ||
|  |     } __finally { | ||
|  |         _PrintExit("MoveFileExW(,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL WINAPI Mine_MoveFileW(LPCWSTR a0, | ||
|  |                            LPCWSTR a1) | ||
|  | { | ||
|  |     _PrintEnter("MoveFileW(%ls,%ls)\n", a0, a1); | ||
|  | 
 | ||
|  |     BOOL rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_MoveFileW(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("MoveFileW(,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HFILE WINAPI Mine_OpenFile(LPCSTR a0, | ||
|  |                            LPOFSTRUCT a1, | ||
|  |                            UINT a2) | ||
|  | { | ||
|  |     _PrintEnter("OpenFile(%hs,%p,%x)\n", a0, a1, a2); | ||
|  | 
 | ||
|  |     HFILE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_OpenFile(a0, a1, a2); | ||
|  |     } __finally { | ||
|  |         _PrintExit("OpenFile(,,) -> %p\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegCreateKeyExA(HKEY a0, | ||
|  |                                  LPCSTR a1, | ||
|  |                                  DWORD a2, | ||
|  |                                  LPSTR a3, | ||
|  |                                  DWORD a4, | ||
|  |                                  REGSAM a5, | ||
|  |                                  LPSECURITY_ATTRIBUTES a6, | ||
|  |                                  PHKEY a7, | ||
|  |                                  LPDWORD a8) | ||
|  | { | ||
|  |     _PrintEnter("RegCreateKeyExA(%p,%hs,%x,%hs,%x,%x,%p,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7, a8); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegCreateKeyExA(a0, a1, a2, a3, a4, a5, a6, a7, a8); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegCreateKeyExA(,,,,,,,,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegCreateKeyExW(HKEY a0, | ||
|  |                                  LPCWSTR a1, | ||
|  |                                  DWORD a2, | ||
|  |                                  LPWSTR a3, | ||
|  |                                  DWORD a4, | ||
|  |                                  REGSAM a5, | ||
|  |                                  LPSECURITY_ATTRIBUTES a6, | ||
|  |                                  PHKEY a7, | ||
|  |                                  LPDWORD a8) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegCreateKeyExW(a0, a1, a2, a3, a4, a5, a6, a7, a8); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegCreateKeyExW(%p,%ls,%x,%ls,%x,%x,%p,%p,%p) -> %x\n", | ||
|  |                    a0, a1, a2, a3, a4, a5, a6, a7, a8, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegDeleteKeyA(HKEY a0, | ||
|  |                                LPCSTR a1) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegDeleteKeyA(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegDeleteKeyA(%p,%hs) -> %x\n", a0, a1, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegDeleteKeyW(HKEY a0, | ||
|  |                                LPCWSTR a1) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegDeleteKeyW(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegDeleteKeyW(%p,%ls) -> %x\n", a0, a1, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegDeleteValueA(HKEY a0, | ||
|  |                                  LPCSTR a1) | ||
|  | { | ||
|  |     _PrintEnter("RegDeleteValueA(%p,%hs)\n", a0, a1); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegDeleteValueA(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegDeleteValueA(,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegDeleteValueW(HKEY a0, | ||
|  |                                  LPCWSTR a1) | ||
|  | { | ||
|  |     _PrintEnter("RegDeleteValueW(%p,%ls)\n", a0, a1); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegDeleteValueW(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegDeleteValueW(,) -> %x\n", rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegEnumKeyExA(HKEY a0, | ||
|  |                                DWORD a1, | ||
|  |                                LPSTR a2, | ||
|  |                                LPDWORD a3, | ||
|  |                                LPDWORD a4, | ||
|  |                                LPSTR a5, | ||
|  |                                LPDWORD a6, | ||
|  |                                LPFILETIME a7) | ||
|  | { | ||
|  |     _PrintEnter("RegEnumKeyExA(%p,%x,%p,%p,%p,%hs,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegEnumKeyExA(a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegEnumKeyExA(,,%hs,,,%hs,,) -> %x\n", a2, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegEnumKeyExW(HKEY a0, | ||
|  |                                DWORD a1, | ||
|  |                                LPWSTR a2, | ||
|  |                                LPDWORD a3, | ||
|  |                                LPDWORD a4, | ||
|  |                                LPWSTR a5, | ||
|  |                                LPDWORD a6, | ||
|  |                                struct _FILETIME* a7) | ||
|  | { | ||
|  |     _PrintEnter("RegEnumKeyExW(%p,%x,%p,%p,%p,%ls,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegEnumKeyExW(a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegEnumKeyExW(,,%ls,,,%ls,,) -> %x\n", a2, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegEnumValueA(HKEY a0, | ||
|  |                                DWORD a1, | ||
|  |                                LPSTR a2, | ||
|  |                                LPDWORD a3, | ||
|  |                                LPDWORD a4, | ||
|  |                                LPDWORD a5, | ||
|  |                                LPBYTE a6, | ||
|  |                                LPDWORD a7) | ||
|  | { | ||
|  |     _PrintEnter("RegEnumValueA(%p,%x,%p,%p,%p,%p,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegEnumValueA(a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegEnumValueA(,,%hs,,,,,) -> %x\n", a2, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegEnumValueW(HKEY a0, | ||
|  |                                DWORD a1, | ||
|  |                                LPWSTR a2, | ||
|  |                                LPDWORD a3, | ||
|  |                                LPDWORD a4, | ||
|  |                                LPDWORD a5, | ||
|  |                                LPBYTE a6, | ||
|  |                                LPDWORD a7) | ||
|  | { | ||
|  |     _PrintEnter("RegEnumValueW(%p,%x,%p,%p,%p,%p,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegEnumValueW(a0, a1, a2, a3, a4, a5, a6, a7); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegEnumValueW(,,%ls,,,,,) -> %x\n", a2, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegOpenKeyExA(HKEY a0, | ||
|  |                                LPCSTR a1, | ||
|  |                                DWORD a2, | ||
|  |                                REGSAM a3, | ||
|  |                                PHKEY a4) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegOpenKeyExA(a0, a1, a2, a3, a4); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegOpenKeyExA(%p,%hs,%x,%x,%p) -> %x\n", | ||
|  |                    a0, a1, a2, a3, a4, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegOpenKeyExW(HKEY a0, | ||
|  |                                LPCWSTR a1, | ||
|  |                                DWORD a2, | ||
|  |                                REGSAM a3, | ||
|  |                                PHKEY a4) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegOpenKeyExW(a0, a1, a2, a3, a4); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegOpenKeyExW(%p,%ls,%x,%x,%p) -> %x\n", | ||
|  |                    a0, a1, a2, a3, a4, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegQueryInfoKeyA(HKEY a0, | ||
|  |                                   LPSTR a1, | ||
|  |                                   LPDWORD a2, | ||
|  |                                   LPDWORD a3, | ||
|  |                                   LPDWORD a4, | ||
|  |                                   LPDWORD a5, | ||
|  |                                   LPDWORD a6, | ||
|  |                                   LPDWORD a7, | ||
|  |                                   LPDWORD a8, | ||
|  |                                   LPDWORD a9, | ||
|  |                                   LPDWORD a10, | ||
|  |                                   LPFILETIME a11) | ||
|  | { | ||
|  |     _PrintEnter("RegQueryInfoKeyA(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\n", | ||
|  |                 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegQueryInfoKeyA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegQueryInfoKeyA(,%hs,,,,,,,,,,) -> %x\n", a1, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegQueryInfoKeyW(HKEY a0, | ||
|  |                                   LPWSTR a1, | ||
|  |                                   LPDWORD a2, | ||
|  |                                   LPDWORD a3, | ||
|  |                                   LPDWORD a4, | ||
|  |                                   LPDWORD a5, | ||
|  |                                   LPDWORD a6, | ||
|  |                                   LPDWORD a7, | ||
|  |                                   LPDWORD a8, | ||
|  |                                   LPDWORD a9, | ||
|  |                                   LPDWORD a10, | ||
|  |                                   LPFILETIME a11) | ||
|  | { | ||
|  |     _PrintEnter("RegQueryInfoKeyW(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\n", | ||
|  |                 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegQueryInfoKeyW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegQueryInfoKeyW(,%ls,,,,,,,,,,) -> %x\n", a1, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegQueryValueExA(HKEY a0, | ||
|  |                                   LPCSTR a1, | ||
|  |                                   LPDWORD a2, | ||
|  |                                   LPDWORD a3, | ||
|  |                                   LPBYTE a4, | ||
|  |                                   LPDWORD a5) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  | 
 | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegQueryValueExA(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegQueryValueExA(%p,%hs,%p,%p,%p,%p) -> %x\n", | ||
|  |                    a0, a1, a2, a3, a4, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegQueryValueExW(HKEY a0, | ||
|  |                                   LPCWSTR a1, | ||
|  |                                   LPDWORD a2, | ||
|  |                                   LPDWORD a3, | ||
|  |                                   LPBYTE a4, | ||
|  |                                   LPDWORD a5) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegQueryValueExW(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegQueryValueExW(%p,%ls,%p,%p,%p,%p) -> %x\n", | ||
|  |                     a0, a1, a2, a3, a4, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegSetValueExA(HKEY a0, | ||
|  |                                 LPCSTR a1, | ||
|  |                                 DWORD a2, | ||
|  |                                 DWORD a3, | ||
|  |                                 BYTE* a4, | ||
|  |                                 DWORD a5) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegSetValueExA(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegSetValueExA(%p,%hs,%x,%x,%p,%x) -> %x\n", | ||
|  |                    a0, a1, a2, a3, a4, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI Mine_RegSetValueExW(HKEY a0, | ||
|  |                                    LPCWSTR a1, | ||
|  |                                    DWORD a2, | ||
|  |                                    DWORD a3, | ||
|  |                                    BYTE* a4, | ||
|  |                                    DWORD a5) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     LONG rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real_RegSetValueExW(a0, a1, a2, a3, a4, a5); | ||
|  |     } __finally { | ||
|  |         _PrintExit("RegSetValueExW(%p,%ls,%x,%x,%p,%x) -> %x\n", | ||
|  |                    a0, a1, a2, a3, a4, a5, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HFILE WINAPI Mine__lcreat(LPCSTR a0, int a1) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     HFILE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real__lcreat(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintExit("_lcreat(%hs,%x) -> %p\n", a0, a1, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | HFILE WINAPI Mine__lopen(LPCSTR a0, int a1) | ||
|  | { | ||
|  |     _PrintEnter(NULL); | ||
|  |     HFILE rv = 0; | ||
|  |     __try { | ||
|  |         rv = Real__lopen(a0, a1); | ||
|  |     } __finally { | ||
|  |         _PrintEnter("_lopen(%hs,%x) -> %p\n", a0, a1, rv); | ||
|  |     }; | ||
|  |     return rv; | ||
|  | } | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////
 | ||
|  | // AttachDetours
 | ||
|  | //
 | ||
|  | PCHAR DetRealName(PCHAR psz) | ||
|  | { | ||
|  |     PCHAR pszBeg = psz; | ||
|  |     // Move to end of name.
 | ||
|  |     while (*psz) { | ||
|  |         psz++; | ||
|  |     } | ||
|  |     // Move back through A-Za-z0-9 names.
 | ||
|  |     while (psz > pszBeg && | ||
|  |            ((psz[-1] >= 'A' && psz[-1] <= 'Z') || | ||
|  |             (psz[-1] >= 'a' && psz[-1] <= 'z') || | ||
|  |             (psz[-1] >= '0' && psz[-1] <= '9'))) { | ||
|  |         psz--; | ||
|  |     } | ||
|  |     return psz; | ||
|  | } | ||
|  | 
 | ||
|  | VOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz) | ||
|  | { | ||
|  |     LONG l = DetourAttach(ppbReal, pbMine); | ||
|  |     if (l != 0) { | ||
|  |         Syelog(SYELOG_SEVERITY_NOTICE, | ||
|  |                "Attach failed: `%s': error %d\n", DetRealName(psz), l); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | VOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz) | ||
|  | { | ||
|  |     LONG l = DetourDetach(ppbReal, pbMine); | ||
|  |     if (l != 0) { | ||
|  |         Syelog(SYELOG_SEVERITY_NOTICE, | ||
|  |                "Detach failed: `%s': error %d\n", DetRealName(psz), l); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)
 | ||
|  | #define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)
 | ||
|  | 
 | ||
|  | LONG AttachDetours(VOID) | ||
|  | { | ||
|  |     DetourTransactionBegin(); | ||
|  |     DetourUpdateThread(GetCurrentThread()); | ||
|  | 
 | ||
|  |     ATTACH(CloseHandle); | ||
|  |     ATTACH(CopyFileExA); | ||
|  |     ATTACH(CopyFileExW); | ||
|  |     ATTACH(CreateDirectoryExW); | ||
|  |     ATTACH(CreateDirectoryW); | ||
|  |     ATTACH(CreateFileW); | ||
|  |     ATTACH(CreateProcessW); | ||
|  |     ATTACH(DeleteFileA); | ||
|  |     ATTACH(DeleteFileW); | ||
|  |     ATTACH(FindFirstFileExA); | ||
|  |     ATTACH(FindFirstFileExW); | ||
|  |     ATTACH(GetFileAttributesW); | ||
|  |     ATTACH(GetModuleFileNameW); | ||
|  |     ATTACH(GetProcAddress); | ||
|  |     ATTACH(GetSystemTimeAsFileTime); | ||
|  |     ATTACH(LoadLibraryExW); | ||
|  |     ATTACH(MoveFileA); | ||
|  |     ATTACH(MoveFileExA); | ||
|  |     ATTACH(MoveFileExW); | ||
|  |     ATTACH(MoveFileW); | ||
|  |     ATTACH(OpenFile); | ||
|  |     ATTACH(RegCreateKeyExA); | ||
|  |     ATTACH(RegCreateKeyExW); | ||
|  |     ATTACH(RegDeleteKeyA); | ||
|  |     ATTACH(RegDeleteKeyW); | ||
|  |     ATTACH(RegDeleteValueA); | ||
|  |     ATTACH(RegDeleteValueW); | ||
|  |     ATTACH(RegEnumKeyExA); | ||
|  |     ATTACH(RegEnumKeyExW); | ||
|  |     ATTACH(RegEnumValueA); | ||
|  |     ATTACH(RegEnumValueW); | ||
|  |     ATTACH(RegOpenKeyExA); | ||
|  |     ATTACH(RegOpenKeyExW); | ||
|  |     ATTACH(RegQueryInfoKeyA); | ||
|  |     ATTACH(RegQueryInfoKeyW); | ||
|  |     ATTACH(RegQueryValueExA); | ||
|  |     ATTACH(RegQueryValueExW); | ||
|  |     ATTACH(RegSetValueExA); | ||
|  |     ATTACH(RegSetValueExW); | ||
|  |     ATTACH(SetNamedPipeHandleState); | ||
|  |     ATTACH(WaitNamedPipeW); | ||
|  |     ATTACH(WriteFile); | ||
|  |     ATTACH(_lcreat); | ||
|  |     ATTACH(_lopen); | ||
|  | 
 | ||
|  |     return DetourTransactionCommit(); | ||
|  | } | ||
|  | 
 | ||
|  | LONG DetachDetours(VOID) | ||
|  | { | ||
|  |     DetourTransactionBegin(); | ||
|  |     DetourUpdateThread(GetCurrentThread()); | ||
|  | 
 | ||
|  |     DETACH(CloseHandle); | ||
|  |     DETACH(CopyFileExA); | ||
|  |     DETACH(CopyFileExW); | ||
|  |     DETACH(CreateDirectoryExW); | ||
|  |     DETACH(CreateDirectoryW); | ||
|  |     DETACH(CreateFileW); | ||
|  |     DETACH(CreateProcessW); | ||
|  |     DETACH(DeleteFileA); | ||
|  |     DETACH(DeleteFileW); | ||
|  |     DETACH(FindFirstFileExA); | ||
|  |     DETACH(FindFirstFileExW); | ||
|  |     DETACH(GetFileAttributesW); | ||
|  |     DETACH(GetModuleFileNameW); | ||
|  |     DETACH(GetProcAddress); | ||
|  |     DETACH(GetSystemTimeAsFileTime); | ||
|  |     DETACH(LoadLibraryExW); | ||
|  |     DETACH(MoveFileA); | ||
|  |     DETACH(MoveFileExA); | ||
|  |     DETACH(MoveFileExW); | ||
|  |     DETACH(MoveFileW); | ||
|  |     DETACH(OpenFile); | ||
|  |     DETACH(RegCreateKeyExA); | ||
|  |     DETACH(RegCreateKeyExW); | ||
|  |     DETACH(RegDeleteKeyA); | ||
|  |     DETACH(RegDeleteKeyW); | ||
|  |     DETACH(RegDeleteValueA); | ||
|  |     DETACH(RegDeleteValueW); | ||
|  |     DETACH(RegEnumKeyExA); | ||
|  |     DETACH(RegEnumKeyExW); | ||
|  |     DETACH(RegEnumValueA); | ||
|  |     DETACH(RegEnumValueW); | ||
|  |     DETACH(RegOpenKeyExA); | ||
|  |     DETACH(RegOpenKeyExW); | ||
|  |     DETACH(RegQueryInfoKeyA); | ||
|  |     DETACH(RegQueryInfoKeyW); | ||
|  |     DETACH(RegQueryValueExA); | ||
|  |     DETACH(RegQueryValueExW); | ||
|  |     DETACH(RegSetValueExA); | ||
|  |     DETACH(RegSetValueExW); | ||
|  |     DETACH(SetNamedPipeHandleState); | ||
|  |     DETACH(WaitNamedPipeW); | ||
|  |     DETACH(WriteFile); | ||
|  |     DETACH(_lcreat); | ||
|  |     DETACH(_lopen); | ||
|  | 
 | ||
|  |     return DetourTransactionCommit(); | ||
|  | } | ||
|  | //
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////// Logging System.
 | ||
|  | //
 | ||
|  | static BOOL s_bLog = 1; | ||
|  | static LONG s_nTlsIndent = -1; | ||
|  | static LONG s_nTlsThread = -1; | ||
|  | static LONG s_nThreadCnt = 0; | ||
|  | 
 | ||
|  | VOID _PrintEnter(const CHAR *psz, ...) | ||
|  | { | ||
|  |     DWORD dwErr = GetLastError(); | ||
|  | 
 | ||
|  |     LONG nIndent = 0; | ||
|  |     LONG nThread = 0; | ||
|  |     if (s_nTlsIndent >= 0) { | ||
|  |         nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent); | ||
|  |         TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1)); | ||
|  |     } | ||
|  |     if (s_nTlsThread >= 0) { | ||
|  |         nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (s_bLog && psz) { | ||
|  |         CHAR szBuf[1024]; | ||
|  |         PCHAR pszBuf = szBuf; | ||
|  |         PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1; | ||
|  |         LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0; | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10)); | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10)); | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10)); | ||
|  |         *pszBuf++ = ' '; | ||
|  |         while (nLen-- > 0) { | ||
|  |             *pszBuf++ = ' '; | ||
|  |         } | ||
|  | 
 | ||
|  |         va_list  args; | ||
|  |         va_start(args, psz); | ||
|  | 
 | ||
|  |         while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) { | ||
|  |             // Copy characters.
 | ||
|  |         } | ||
|  |         *pszEnd = '\0'; | ||
|  |         SyelogV(SYELOG_SEVERITY_INFORMATION, | ||
|  |                 szBuf, args); | ||
|  | 
 | ||
|  |         va_end(args); | ||
|  |     } | ||
|  |     SetLastError(dwErr); | ||
|  | } | ||
|  | 
 | ||
|  | VOID _PrintExit(const CHAR *psz, ...) | ||
|  | { | ||
|  |     DWORD dwErr = GetLastError(); | ||
|  | 
 | ||
|  |     LONG nIndent = 0; | ||
|  |     LONG nThread = 0; | ||
|  |     if (s_nTlsIndent >= 0) { | ||
|  |         nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1; | ||
|  |         ASSERT(nIndent >= 0); | ||
|  |         TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent); | ||
|  |     } | ||
|  |     if (s_nTlsThread >= 0) { | ||
|  |         nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (s_bLog && psz) { | ||
|  |         CHAR szBuf[1024]; | ||
|  |         PCHAR pszBuf = szBuf; | ||
|  |         PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1; | ||
|  |         LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0; | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10)); | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10)); | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10)); | ||
|  |         *pszBuf++ = ' '; | ||
|  |         while (nLen-- > 0) { | ||
|  |             *pszBuf++ = ' '; | ||
|  |         } | ||
|  | 
 | ||
|  |         va_list  args; | ||
|  |         va_start(args, psz); | ||
|  | 
 | ||
|  |         while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) { | ||
|  |             // Copy characters.
 | ||
|  |         } | ||
|  |         *pszEnd = '\0'; | ||
|  |         SyelogV(SYELOG_SEVERITY_INFORMATION, | ||
|  |                 szBuf, args); | ||
|  | 
 | ||
|  |         va_end(args); | ||
|  |     } | ||
|  |     SetLastError(dwErr); | ||
|  | } | ||
|  | 
 | ||
|  | VOID _Print(const CHAR *psz, ...) | ||
|  | { | ||
|  |     DWORD dwErr = GetLastError(); | ||
|  | 
 | ||
|  |     LONG nIndent = 0; | ||
|  |     LONG nThread = 0; | ||
|  |     if (s_nTlsIndent >= 0) { | ||
|  |         nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent); | ||
|  |     } | ||
|  |     if (s_nTlsThread >= 0) { | ||
|  |         nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (s_bLog && psz) { | ||
|  |         CHAR szBuf[1024]; | ||
|  |         PCHAR pszBuf = szBuf; | ||
|  |         PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1; | ||
|  |         LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0; | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10)); | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10)); | ||
|  |         *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10)); | ||
|  |         *pszBuf++ = ' '; | ||
|  |         while (nLen-- > 0) { | ||
|  |             *pszBuf++ = ' '; | ||
|  |         } | ||
|  | 
 | ||
|  |         va_list  args; | ||
|  |         va_start(args, psz); | ||
|  | 
 | ||
|  |         while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) { | ||
|  |             // Copy characters.
 | ||
|  |         } | ||
|  |         *pszEnd = '\0'; | ||
|  |         SyelogV(SYELOG_SEVERITY_INFORMATION, | ||
|  |                 szBuf, args); | ||
|  | 
 | ||
|  |         va_end(args); | ||
|  |     } | ||
|  | 
 | ||
|  |     SetLastError(dwErr); | ||
|  | } | ||
|  | 
 | ||
|  | VOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine) | ||
|  | { | ||
|  |     Syelog(SYELOG_SEVERITY_FATAL, | ||
|  |            "ASSERT(%s) failed in %s, line %d.\n", pszMsg, pszFile, nLine); | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | PIMAGE_NT_HEADERS NtHeadersForInstance(HINSTANCE hInst) | ||
|  | { | ||
|  |     PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hInst; | ||
|  |     __try { | ||
|  |         if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { | ||
|  |             SetLastError(ERROR_BAD_EXE_FORMAT); | ||
|  |             return NULL; | ||
|  |         } | ||
|  | 
 | ||
|  |         PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + | ||
|  |                                                           pDosHeader->e_lfanew); | ||
|  |         if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { | ||
|  |             SetLastError(ERROR_INVALID_EXE_SIGNATURE); | ||
|  |             return NULL; | ||
|  |         } | ||
|  |         if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) { | ||
|  |             SetLastError(ERROR_EXE_MARKED_INVALID); | ||
|  |             return NULL; | ||
|  |         } | ||
|  |         return pNtHeader; | ||
|  |     } __except(EXCEPTION_EXECUTE_HANDLER) { | ||
|  |     } | ||
|  |     SetLastError(ERROR_EXE_MARKED_INVALID); | ||
|  | 
 | ||
|  |     return NULL; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL InstanceEnumerate(HINSTANCE hInst) | ||
|  | { | ||
|  |     WCHAR wzDllName[MAX_PATH]; | ||
|  | 
 | ||
|  |     PIMAGE_NT_HEADERS pinh = NtHeadersForInstance(hInst); | ||
|  |     if (pinh && Real_GetModuleFileNameW(hInst, wzDllName, ARRAYSIZE(wzDllName))) { | ||
|  |         Syelog(SYELOG_SEVERITY_INFORMATION, | ||
|  |                "### %08lx: %-43.43ls %08x\n", | ||
|  |                hInst, wzDllName, pinh->OptionalHeader.CheckSum); | ||
|  |         return TRUE; | ||
|  |     } | ||
|  |     return FALSE; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL ProcessEnumerate() | ||
|  | { | ||
|  |     Syelog(SYELOG_SEVERITY_INFORMATION, | ||
|  |            "######################################################### Binaries\n"); | ||
|  |     for (HINSTANCE hInst = NULL; (hInst = DetourEnumerateModules(hInst)) != NULL;) { | ||
|  |         InstanceEnumerate(hInst); | ||
|  |     } | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | // DLL module information
 | ||
|  | //
 | ||
|  | BOOL ThreadAttach(HMODULE hDll) | ||
|  | { | ||
|  |     (void)hDll; | ||
|  | 
 | ||
|  |     if (s_nTlsIndent >= 0) { | ||
|  |         TlsSetValue(s_nTlsIndent, (PVOID)0); | ||
|  |     } | ||
|  |     if (s_nTlsThread >= 0) { | ||
|  |         LONG nThread = InterlockedIncrement(&s_nThreadCnt); | ||
|  |         TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread); | ||
|  |     } | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL ThreadDetach(HMODULE hDll) | ||
|  | { | ||
|  |     (void)hDll; | ||
|  | 
 | ||
|  |     if (s_nTlsIndent >= 0) { | ||
|  |         TlsSetValue(s_nTlsIndent, (PVOID)0); | ||
|  |     } | ||
|  |     if (s_nTlsThread >= 0) { | ||
|  |         TlsSetValue(s_nTlsThread, (PVOID)0); | ||
|  |     } | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL ProcessAttach(HMODULE hDll) | ||
|  | { | ||
|  |     s_bLog = FALSE; | ||
|  |     s_nTlsIndent = TlsAlloc(); | ||
|  |     s_nTlsThread = TlsAlloc(); | ||
|  | 
 | ||
|  |     s_hInst = hDll; | ||
|  |     Real_GetModuleFileNameA(s_hInst, s_szDllPath, ARRAYSIZE(s_szDllPath)); | ||
|  | 
 | ||
|  |     SyelogOpen("trcreg" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION); | ||
|  |     ProcessEnumerate(); | ||
|  | 
 | ||
|  |     LONG error = AttachDetours(); | ||
|  |     if (error != NO_ERROR) { | ||
|  |         Syelog(SYELOG_SEVERITY_FATAL, "### Error attaching detours: %d\n", error); | ||
|  |     } | ||
|  | 
 | ||
|  |     ThreadAttach(hDll); | ||
|  | 
 | ||
|  |     s_bLog = TRUE; | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL ProcessDetach(HMODULE hDll) | ||
|  | { | ||
|  |     ThreadDetach(hDll); | ||
|  |     s_bLog = FALSE; | ||
|  | 
 | ||
|  |     LONG error = DetachDetours(); | ||
|  |     if (error != NO_ERROR) { | ||
|  |         Syelog(SYELOG_SEVERITY_FATAL, "### Error detaching detours: %d\n", error); | ||
|  |     } | ||
|  | 
 | ||
|  |     Syelog(SYELOG_SEVERITY_NOTICE, "### Closing.\n"); | ||
|  |     SyelogClose(FALSE); | ||
|  | 
 | ||
|  |     if (s_nTlsIndent >= 0) { | ||
|  |         TlsFree(s_nTlsIndent); | ||
|  |     } | ||
|  |     if (s_nTlsThread >= 0) { | ||
|  |         TlsFree(s_nTlsThread); | ||
|  |     } | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved) | ||
|  | { | ||
|  |     (void)hModule; | ||
|  |     (void)lpReserved; | ||
|  | 
 | ||
|  |     if (DetourIsHelperProcess()) { | ||
|  |         return TRUE; | ||
|  |     } | ||
|  | 
 | ||
|  |     switch (dwReason) { | ||
|  |       case DLL_PROCESS_ATTACH: | ||
|  |         DetourRestoreAfterWith(); | ||
|  |         return ProcessAttach(hModule); | ||
|  |       case DLL_PROCESS_DETACH: | ||
|  |         return ProcessDetach(hModule); | ||
|  |       case DLL_THREAD_ATTACH: | ||
|  |         return ThreadAttach(hModule); | ||
|  |       case DLL_THREAD_DETACH: | ||
|  |         return ThreadDetach(hModule); | ||
|  |     } | ||
|  |     return TRUE; | ||
|  | } | ||
|  | //
 | ||
|  | ///////////////////////////////////////////////////////////////// End of File.
 |