1783 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			1783 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C++
		
	
	
	
| //////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| //  Detours Test Program (trcssl.cpp of trcssl.dll)
 | |
| //
 | |
| //  Microsoft Research Detours Package
 | |
| //
 | |
| //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | |
| //
 | |
| #define _WIN32_WINNT        0x0400
 | |
| #define WIN32
 | |
| #define NT
 | |
| #define SECURITY_WIN32
 | |
| #define _WINSOCK_DEPRECATED_NO_WARNINGS
 | |
| 
 | |
| #define DBG_TRACE   0
 | |
| 
 | |
| #if _MSC_VER >= 1300
 | |
| #include <winsock2.h>
 | |
| #endif
 | |
| #include <windows.h>
 | |
| #include <security.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 WCHAR s_wzDllPath[MAX_PATH];
 | |
| 
 | |
| VOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData);
 | |
| 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;
 | |
| }
 | |
| 
 | |
| DWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0,
 | |
|                                          LPWSTR a1,
 | |
|                                          DWORD a2)
 | |
|     = GetModuleFileNameW;
 | |
| 
 | |
| BOOL (WINAPI * Real_CreateProcessW)(LPCWSTR a0,
 | |
|                                     LPWSTR a1,
 | |
|                                     LPSECURITY_ATTRIBUTES a2,
 | |
|                                     LPSECURITY_ATTRIBUTES a3,
 | |
|                                     BOOL a4,
 | |
|                                     DWORD a5,
 | |
|                                     LPVOID a6,
 | |
|                                     LPCWSTR a7,
 | |
|                                     LPSTARTUPINFOW a8,
 | |
|                                     LPPROCESS_INFORMATION a9)
 | |
|     = CreateProcessW;
 | |
| 
 | |
| #if _MSC_VER < 1300
 | |
| SOCKET (WINAPI * Real_WSAAccept)(SOCKET a0,
 | |
|                                  sockaddr* a1,
 | |
|                                  LPINT a2,
 | |
|                                  LPCONDITIONPROC a3,
 | |
|                                  DWORD a4)
 | |
|     = WSAAccept;
 | |
| #else
 | |
| SOCKET (WINAPI * Real_WSAAccept)(SOCKET a0,
 | |
|                                  sockaddr* a1,
 | |
|                                  LPINT a2,
 | |
|                                  LPCONDITIONPROC a3,
 | |
|                                  DWORD_PTR a4)
 | |
|     = WSAAccept;
 | |
| #endif
 | |
| 
 | |
| INT (WINAPI * Real_WSAAddressToStringA)(LPSOCKADDR a0,
 | |
|                                         DWORD a1,
 | |
|                                         LPWSAPROTOCOL_INFOA a2,
 | |
|                                         LPSTR a3,
 | |
|                                         LPDWORD a4)
 | |
|     = WSAAddressToStringA;
 | |
| 
 | |
| INT (WINAPI * Real_WSAAddressToStringW)(LPSOCKADDR a0,
 | |
|                                         DWORD a1,
 | |
|                                         LPWSAPROTOCOL_INFOW a2,
 | |
|                                         LPWSTR a3,
 | |
|                                         LPDWORD a4)
 | |
|     = WSAAddressToStringW;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSAAsyncGetHostByAddr)(HWND a0,
 | |
|                                              u_int a1,
 | |
|                                              CONST char* a2,
 | |
|                                              int a3,
 | |
|                                              int a4,
 | |
|                                              char* a5,
 | |
|                                              int a6)
 | |
|     = WSAAsyncGetHostByAddr;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSAAsyncGetHostByName)(HWND a0,
 | |
|                                              u_int a1,
 | |
|                                              CONST char* a2,
 | |
|                                              char* a3,
 | |
|                                              int a4)
 | |
|     = WSAAsyncGetHostByName;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSAAsyncGetProtoByName)(HWND a0,
 | |
|                                               u_int a1,
 | |
|                                               CONST char* a2,
 | |
|                                               char* a3,
 | |
|                                               int a4)
 | |
|     = WSAAsyncGetProtoByName;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSAAsyncGetProtoByNumber)(HWND a0,
 | |
|                                                 u_int a1,
 | |
|                                                 int a2,
 | |
|                                                 char* a3,
 | |
|                                                 int a4)
 | |
|     = WSAAsyncGetProtoByNumber;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSAAsyncGetServByName)(HWND a0,
 | |
|                                              u_int a1,
 | |
|                                              CONST char* a2,
 | |
|                                              CONST char* a3,
 | |
|                                              char* a4,
 | |
|                                              int a5)
 | |
|     = WSAAsyncGetServByName;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSAAsyncGetServByPort)(HWND a0,
 | |
|                                              u_int a1,
 | |
|                                              int a2,
 | |
|                                              CONST char* a3,
 | |
|                                              char* a4,
 | |
|                                              int a5)
 | |
|     = WSAAsyncGetServByPort;
 | |
| 
 | |
| int (WINAPI * Real_WSACancelAsyncRequest)(HANDLE a0)
 | |
|     = WSACancelAsyncRequest;
 | |
| 
 | |
| int (WINAPI * Real_WSACancelBlockingCall)(void)
 | |
|     = WSACancelBlockingCall;
 | |
| 
 | |
| int (WINAPI * Real_WSACleanup)(void)
 | |
|     = WSACleanup;
 | |
| 
 | |
| BOOL (WINAPI * Real_WSACloseEvent)(HANDLE a0)
 | |
|     = WSACloseEvent;
 | |
| 
 | |
| int (WINAPI * Real_WSAConnect)(SOCKET a0,
 | |
|                                CONST sockaddr* a1,
 | |
|                                int a2,
 | |
|                                LPWSABUF a3,
 | |
|                                LPWSABUF a4,
 | |
|                                LPQOS a5,
 | |
|                                LPQOS a6)
 | |
|     = WSAConnect;
 | |
| 
 | |
| HANDLE (WINAPI * Real_WSACreateEvent)(void)
 | |
|     = WSACreateEvent;
 | |
| 
 | |
| int (WINAPI * Real_WSADuplicateSocketA)(SOCKET a0,
 | |
|                                         DWORD a1,
 | |
|                                         LPWSAPROTOCOL_INFOA a2)
 | |
|     = WSADuplicateSocketA;
 | |
| 
 | |
| int (WINAPI * Real_WSADuplicateSocketW)(SOCKET a0,
 | |
|                                         DWORD a1,
 | |
|                                         LPWSAPROTOCOL_INFOW a2)
 | |
|     = WSADuplicateSocketW;
 | |
| 
 | |
| INT (WINAPI * Real_WSAEnumNameSpaceProvidersA)(LPDWORD a0,
 | |
|                                                LPWSANAMESPACE_INFOA a1)
 | |
|     = WSAEnumNameSpaceProvidersA;
 | |
| 
 | |
| INT (WINAPI * Real_WSAEnumNameSpaceProvidersW)(LPDWORD a0,
 | |
|                                                LPWSANAMESPACE_INFOW a1)
 | |
|     = WSAEnumNameSpaceProvidersW;
 | |
| 
 | |
| int (WINAPI * Real_WSAEnumNetworkEvents)(SOCKET a0,
 | |
|                                          HANDLE a1,
 | |
|                                          LPWSANETWORKEVENTS a2)
 | |
|     = WSAEnumNetworkEvents;
 | |
| 
 | |
| int (WINAPI * Real_WSAEnumProtocolsA)(LPINT a0,
 | |
|                                       LPWSAPROTOCOL_INFOA a1,
 | |
|                                       LPDWORD a2)
 | |
|     = WSAEnumProtocolsA;
 | |
| 
 | |
| int (WINAPI * Real_WSAEnumProtocolsW)(LPINT a0,
 | |
|                                       LPWSAPROTOCOL_INFOW a1,
 | |
|                                       LPDWORD a2)
 | |
|     = WSAEnumProtocolsW;
 | |
| 
 | |
| BOOL (WINAPI * Real_WSAGetOverlappedResult)(SOCKET a0,
 | |
|                                             LPWSAOVERLAPPED a1,
 | |
|                                             LPDWORD a2,
 | |
|                                             BOOL a3,
 | |
|                                             LPDWORD a4)
 | |
|     = WSAGetOverlappedResult;
 | |
| 
 | |
| BOOL (WINAPI * Real_WSAIsBlocking)(void)
 | |
|     = WSAIsBlocking;
 | |
| 
 | |
| SOCKET (WINAPI * Real_WSAJoinLeaf)(SOCKET a0,
 | |
|                                    CONST sockaddr* a1,
 | |
|                                    int a2,
 | |
|                                    LPWSABUF a3,
 | |
|                                    LPWSABUF a4,
 | |
|                                    LPQOS a5,
 | |
|                                    LPQOS a6,
 | |
|                                    DWORD a7)
 | |
|     = WSAJoinLeaf;
 | |
| 
 | |
| INT (WINAPI * Real_WSAProviderConfigChange)(LPHANDLE a0,
 | |
|                                             LPWSAOVERLAPPED a1,
 | |
|                                             LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)
 | |
|     = WSAProviderConfigChange;
 | |
| 
 | |
| int (WINAPI * Real_WSARecv)(SOCKET a0,
 | |
|                             LPWSABUF a1,
 | |
|                             DWORD a2,
 | |
|                             LPDWORD a3,
 | |
|                             LPDWORD a4,
 | |
|                             LPWSAOVERLAPPED a5,
 | |
|                             LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)
 | |
|     = WSARecv;
 | |
| 
 | |
| int (WINAPI * Real_WSARecvDisconnect)(SOCKET a0,
 | |
|                                       LPWSABUF a1)
 | |
|     = WSARecvDisconnect;
 | |
| 
 | |
| int (WINAPI * Real_WSARecvFrom)(SOCKET a0,
 | |
|                                 LPWSABUF a1,
 | |
|                                 DWORD a2,
 | |
|                                 LPDWORD a3,
 | |
|                                 LPDWORD a4,
 | |
|                                 sockaddr* a5,
 | |
|                                 LPINT a6,
 | |
|                                 LPWSAOVERLAPPED a7,
 | |
|                                 LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
 | |
|     = WSARecvFrom;
 | |
| 
 | |
| BOOL (WINAPI * Real_WSAResetEvent)(HANDLE a0)
 | |
|     = WSAResetEvent;
 | |
| 
 | |
| int (WINAPI * Real_WSASend)(SOCKET a0,
 | |
|                             LPWSABUF a1,
 | |
|                             DWORD a2,
 | |
|                             LPDWORD a3,
 | |
|                             DWORD a4,
 | |
|                             LPWSAOVERLAPPED a5,
 | |
|                             LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)
 | |
|     = WSASend;
 | |
| 
 | |
| int (WINAPI * Real_WSASendDisconnect)(SOCKET a0,
 | |
|                                       LPWSABUF a1)
 | |
|     = WSASendDisconnect;
 | |
| 
 | |
| int (WINAPI * Real_WSASendTo)(SOCKET a0,
 | |
|                               LPWSABUF a1,
 | |
|                               DWORD a2,
 | |
|                               LPDWORD a3,
 | |
|                               DWORD a4,
 | |
|                               CONST sockaddr* a5,
 | |
|                               int a6,
 | |
|                               LPWSAOVERLAPPED a7,
 | |
|                               LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
 | |
|     = WSASendTo;
 | |
| 
 | |
| INT (WINAPI * Real_WSAStringToAddressA)(LPSTR a0,
 | |
|                                         INT a1,
 | |
|                                         LPWSAPROTOCOL_INFOA a2,
 | |
|                                         LPSOCKADDR a3,
 | |
|                                         LPINT a4)
 | |
|     = WSAStringToAddressA;
 | |
| 
 | |
| INT (WINAPI * Real_WSAStringToAddressW)(LPWSTR a0,
 | |
|                                         INT a1,
 | |
|                                         LPWSAPROTOCOL_INFOW a2,
 | |
|                                         LPSOCKADDR a3,
 | |
|                                         LPINT a4)
 | |
|     = WSAStringToAddressW;
 | |
| 
 | |
| DWORD (WINAPI * Real_WSAWaitForMultipleEvents)(DWORD a0,
 | |
|                                                CONST HANDLE * a1,
 | |
|                                                BOOL a2,
 | |
|                                                DWORD a3,
 | |
|                                                BOOL a4)
 | |
|     = WSAWaitForMultipleEvents;
 | |
| 
 | |
| SOCKET (WINAPI * Real_accept)(SOCKET a0,
 | |
|                               sockaddr* a1,
 | |
|                               int* a2)
 | |
|     = accept;
 | |
| 
 | |
| int (WINAPI * Real_closesocket)(SOCKET a0)
 | |
|     = closesocket;
 | |
| 
 | |
| int (WINAPI * Real_connect)(SOCKET a0,
 | |
|                             CONST sockaddr* a1,
 | |
|                             int a2)
 | |
|     = connect;
 | |
| 
 | |
| int (WINAPI * Real_listen)(SOCKET a0,
 | |
|                            int a1)
 | |
|     = listen;
 | |
| 
 | |
| int (WINAPI * Real_recv)(SOCKET a0,
 | |
|                          char* a1,
 | |
|                          int a2,
 | |
|                          int a3)
 | |
|     = recv;
 | |
| 
 | |
| int (WINAPI * Real_recvfrom)(SOCKET a0,
 | |
|                              char* a1,
 | |
|                              int a2,
 | |
|                              int a3,
 | |
|                              sockaddr* a4,
 | |
|                              int* a5)
 | |
|     = recvfrom;
 | |
| 
 | |
| int (WINAPI * Real_send)(SOCKET a0,
 | |
|                          CONST char* a1,
 | |
|                          int a2,
 | |
|                          int a3)
 | |
|     = send;
 | |
| 
 | |
| int (WINAPI * Real_sendto)(SOCKET a0,
 | |
|                            CONST char* a1,
 | |
|                            int a2,
 | |
|                            int a3,
 | |
|                            CONST sockaddr* a4,
 | |
|                            int a5)
 | |
|     = sendto;
 | |
| 
 | |
| int (WINAPI * Real_shutdown)(SOCKET a0,
 | |
|                              int a1)
 | |
|     = shutdown;
 | |
| 
 | |
| SECURITY_STATUS (SEC_ENTRY * Real_EncryptMessage)( PCtxtHandle         phContext,
 | |
|                                                    unsigned long       fQOP,
 | |
|                                                    PSecBufferDesc      pMessage,
 | |
|                                                    unsigned long       MessageSeqNo)
 | |
|     = EncryptMessage;
 | |
| 
 | |
| SECURITY_STATUS (SEC_ENTRY * Real_DecryptMessage)( PCtxtHandle         phContext,
 | |
|                                                    PSecBufferDesc      pMessage,
 | |
|                                                    unsigned long       MessageSeqNo,
 | |
|                                                    unsigned long *     pfQOP)
 | |
|     = DecryptMessage;
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| // Detours
 | |
| //
 | |
| 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);
 | |
| 
 | |
|     BOOL rv = 0;
 | |
|     __try {
 | |
|         rv = Real_CreateProcessW(lpApplicationName,
 | |
|                                  lpCommandLine,
 | |
|                                  lpProcessAttributes,
 | |
|                                  lpThreadAttributes,
 | |
|                                  bInheritHandles,
 | |
|                                  dwCreationFlags,
 | |
|                                  lpEnvironment,
 | |
|                                  lpCurrentDirectory,
 | |
|                                  lpStartupInfo,
 | |
|                                  lpProcessInformation);
 | |
|     } __finally {
 | |
|         _PrintExit("CreateProcessW(,,,,,,,,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| #if _MSC_VER < 1300
 | |
| SOCKET WINAPI Mine_WSAAccept(SOCKET a0,
 | |
|                              sockaddr* a1,
 | |
|                              LPINT a2,
 | |
|                              LPCONDITIONPROC a3,
 | |
|                              DWORD a4)
 | |
| #else
 | |
| SOCKET WINAPI Mine_WSAAccept(SOCKET a0,
 | |
|                              sockaddr* a1,
 | |
|                              LPINT a2,
 | |
|                              LPCONDITIONPROC a3,
 | |
|                              DWORD_PTR a4)
 | |
| #endif
 | |
| {
 | |
| 
 | |
|     SOCKET rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAccept(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintEnter("%p: WSAAccept(,%p,%p,%p,%p) -> %p\n", a0, a1, a2, a3, a4, rv);
 | |
|         _PrintExit(NULL);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAAddressToStringA(LPSOCKADDR a0,
 | |
|                                     DWORD a1,
 | |
|                                     LPWSAPROTOCOL_INFOA a2,
 | |
|                                     LPSTR a3,
 | |
|                                     LPDWORD a4)
 | |
| {
 | |
|     _PrintEnter("WSAAddressToStringA(%p,%x,%p,%p,%p)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAddressToStringA(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAddressToStringA(,,,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAAddressToStringW(LPSOCKADDR a0,
 | |
|                                     DWORD a1,
 | |
|                                     LPWSAPROTOCOL_INFOW a2,
 | |
|                                     LPWSTR a3,
 | |
|                                     LPDWORD a4)
 | |
| {
 | |
|     _PrintEnter("WSAAddressToStringW(%p,%x,%p,%p,%p)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAddressToStringW(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAddressToStringW(,,,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSAAsyncGetHostByAddr(HWND a0,
 | |
|                                          u_int a1,
 | |
|                                          char* a2,
 | |
|                                          int a3,
 | |
|                                          int a4,
 | |
|                                          char* a5,
 | |
|                                          int a6)
 | |
| {
 | |
|     _PrintEnter("WSAAsyncGetHostByAddr(%p,%x,%p,%x,%x,%p,%x)\n", a0, a1, a2, a3, a4, a5, a6);
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAsyncGetHostByAddr(a0, a1, a2, a3, a4, a5, a6);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAsyncGetHostByAddr(,,,,,,) -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSAAsyncGetHostByName(HWND a0,
 | |
|                                          u_int a1,
 | |
|                                          char* a2,
 | |
|                                          char* a3,
 | |
|                                          int a4)
 | |
| {
 | |
|     _PrintEnter("WSAAsyncGetHostByName(%p,%x,%p,%p,%x)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAsyncGetHostByName(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAsyncGetHostByName(,,,,) -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSAAsyncGetProtoByName(HWND a0,
 | |
|                                           u_int a1,
 | |
|                                           char* a2,
 | |
|                                           char* a3,
 | |
|                                           int a4)
 | |
| {
 | |
|     _PrintEnter("WSAAsyncGetProtoByName(%p,%x,%p,%p,%x)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAsyncGetProtoByName(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAsyncGetProtoByName(,,,,) -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSAAsyncGetProtoByNumber(HWND a0,
 | |
|                                             u_int a1,
 | |
|                                             int a2,
 | |
|                                             char* a3,
 | |
|                                             int a4)
 | |
| {
 | |
|     _PrintEnter("WSAAsyncGetProtoByNumber(%p,%x,%p,%p,%x)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAsyncGetProtoByNumber(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAsyncGetProtoByNumber(,,,,) -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSAAsyncGetServByName(HWND a0,
 | |
|                                          u_int a1,
 | |
|                                          char* a2,
 | |
|                                          char* a3,
 | |
|                                          char* a4,
 | |
|                                          int a5)
 | |
| {
 | |
|     _PrintEnter("WSAAsyncGetServByName(%p,%x,%p,%p,%p,%x)\n", a0, a1, a2, a3, a4, a5);
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAsyncGetServByName(a0, a1, a2, a3, a4, a5);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAsyncGetServByName(,,,,,) -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSAAsyncGetServByPort(HWND a0,
 | |
|                                          u_int a1,
 | |
|                                          int a2,
 | |
|                                          char* a3,
 | |
|                                          char* a4,
 | |
|                                          int a5)
 | |
| {
 | |
|     _PrintEnter("WSAAsyncGetServByPort(%p,%x,%x,%p,%p,%x)\n", a0, a1, a2, a3, a4, a5);
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAAsyncGetServByPort(a0, a1, a2, a3, a4, a5);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAAsyncGetServByPort(,,,,,) -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSACancelAsyncRequest(HANDLE a0)
 | |
| {
 | |
|     _PrintEnter("WSACancelAsyncRequest(%p)\n", a0);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSACancelAsyncRequest(a0);
 | |
|     } __finally {
 | |
|         _PrintExit("WSACancelAsyncRequest() -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSACancelBlockingCall(void)
 | |
| {
 | |
|     _PrintEnter("WSACancelBlockingCall()\n");
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSACancelBlockingCall();
 | |
|     } __finally {
 | |
|         _PrintExit("WSACancelBlockingCall() -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSACleanup(void)
 | |
| {
 | |
|     _PrintEnter("WSACleanup()\n");
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSACleanup();
 | |
|     } __finally {
 | |
|         _PrintExit("WSACleanup() -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| BOOL WINAPI Mine_WSACloseEvent(HANDLE a0)
 | |
| {
 | |
|     _PrintEnter("WSACloseEvent(%p)\n", a0);
 | |
| 
 | |
|     BOOL rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSACloseEvent(a0);
 | |
|     } __finally {
 | |
|         _PrintExit("WSACloseEvent() -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSAConnect(SOCKET a0,
 | |
|                            sockaddr* a1,
 | |
|                            int a2,
 | |
|                            LPWSABUF a3,
 | |
|                            LPWSABUF a4,
 | |
|                            LPQOS a5,
 | |
|                            LPQOS a6)
 | |
| {
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAConnect(a0, a1, a2, a3, a4, a5, a6);
 | |
|     } __finally {
 | |
|         _PrintEnter("%p: WSAConnect(,%p,%x,%p,%p,%p,%p) -> %x\n",
 | |
|                     a0, a1, a2, a3, a4, a5, a6, rv);
 | |
|         _PrintExit(NULL);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| HANDLE WINAPI Mine_WSACreateEvent(void)
 | |
| {
 | |
|     _PrintEnter("WSACreateEvent()\n");
 | |
| 
 | |
|     HANDLE rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSACreateEvent();
 | |
|     } __finally {
 | |
|         _PrintExit("WSACreateEvent() -> %p\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSADuplicateSocketA(SOCKET a0,
 | |
|                                     DWORD a1,
 | |
|                                     LPWSAPROTOCOL_INFOA a2)
 | |
| {
 | |
|     _PrintEnter("%p: WSADuplicateSocketA(,%x,%p)\n", a0, a1, a2);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSADuplicateSocketA(a0, a1, a2);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSADuplicateSocketA(,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSADuplicateSocketW(SOCKET a0,
 | |
|                                     DWORD a1,
 | |
|                                     LPWSAPROTOCOL_INFOW a2)
 | |
| {
 | |
|     _PrintEnter("%p: WSADuplicateSocketW(,%x,%p)\n", a0, a1, a2);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSADuplicateSocketW(a0, a1, a2);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSADuplicateSocketW(,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAEnumNameSpaceProvidersA(LPDWORD a0,
 | |
|                                            LPWSANAMESPACE_INFOA a1)
 | |
| {
 | |
|     _PrintEnter("WSAEnumNameSpaceProvidersA(%p,%p)\n", a0, a1);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAEnumNameSpaceProvidersA(a0, a1);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAEnumNameSpaceProvidersA(,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAEnumNameSpaceProvidersW(LPDWORD a0,
 | |
|                                            LPWSANAMESPACE_INFOW a1)
 | |
| {
 | |
|     _PrintEnter("WSAEnumNameSpaceProvidersW(%p,%p)\n", a0, a1);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAEnumNameSpaceProvidersW(a0, a1);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAEnumNameSpaceProvidersW(,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSAEnumNetworkEvents(SOCKET a0,
 | |
|                                      HANDLE a1,
 | |
|                                      LPWSANETWORKEVENTS a2)
 | |
| {
 | |
|     _PrintEnter("%p: WSAEnumNetworkEvents(,%p,%p)\n", a0, a1, a2);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAEnumNetworkEvents(a0, a1, a2);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSAEnumNetworkEvents(,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSAEnumProtocolsA(LPINT a0,
 | |
|                                   LPWSAPROTOCOL_INFOA a1,
 | |
|                                   LPDWORD a2)
 | |
| {
 | |
|     _PrintEnter("WSAEnumProtocolsA(%p,%p,%p)\n", a0, a1, a2);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAEnumProtocolsA(a0, a1, a2);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAEnumProtocolsA(,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSAEnumProtocolsW(LPINT a0,
 | |
|                                   LPWSAPROTOCOL_INFOW a1,
 | |
|                                   LPDWORD a2)
 | |
| {
 | |
|     _PrintEnter("WSAEnumProtocolsW(%p,%p,%p)\n", a0, a1, a2);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAEnumProtocolsW(a0, a1, a2);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAEnumProtocolsW(,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| BOOL WINAPI Mine_WSAGetOverlappedResult(SOCKET a0,
 | |
|                                         LPWSAOVERLAPPED a1,
 | |
|                                         LPDWORD a2,
 | |
|                                         BOOL a3,
 | |
|                                         LPDWORD a4)
 | |
| {
 | |
|     _PrintEnter("%p: WSAGetOverlappedResult(,%p,%p,%x,%p)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     BOOL rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAGetOverlappedResult(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSAGetOverlappedResult(,,,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| BOOL WINAPI Mine_WSAIsBlocking(void)
 | |
| {
 | |
|     _PrintEnter("WSAIsBlocking()\n");
 | |
| 
 | |
|     BOOL rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAIsBlocking();
 | |
|     } __finally {
 | |
|         _PrintExit("WSAIsBlocking() -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| SOCKET WINAPI Mine_WSAJoinLeaf(SOCKET a0,
 | |
|                                sockaddr* a1,
 | |
|                                int a2,
 | |
|                                LPWSABUF a3,
 | |
|                                LPWSABUF a4,
 | |
|                                LPQOS a5,
 | |
|                                LPQOS a6,
 | |
|                                DWORD a7)
 | |
| {
 | |
|     _PrintEnter("%p: WSAJoinLeaf(,%p,%x,%p,%p,%p,%p,%x)\n", a0, a1, a2, a3, a4, a5, a6, a7);
 | |
| 
 | |
|     SOCKET rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAJoinLeaf(a0, a1, a2, a3, a4, a5, a6, a7);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSAJoinLeaf(,,,,,,,) -> %p\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAProviderConfigChange(LPHANDLE a0,
 | |
|                                         LPWSAOVERLAPPED a1,
 | |
|                                         LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)
 | |
| {
 | |
|     _PrintEnter("WSAProviderConfigChange(%p,%p,%p)\n", a0, a1, a2);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAProviderConfigChange(a0, a1, a2);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAProviderConfigChange(,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSARecv(SOCKET a0,
 | |
|                         LPWSABUF a1,
 | |
|                         DWORD a2,
 | |
|                         LPDWORD a3,
 | |
|                         LPDWORD a4,
 | |
|                         LPWSAOVERLAPPED a5,
 | |
|                         LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)
 | |
| {
 | |
|     int rv = -1;
 | |
|     __try {
 | |
|         rv = Real_WSARecv(a0, a1, a2, a3, a4, a5, a6);
 | |
|     } __finally {
 | |
|         if (rv == 0) {
 | |
|             _PrintEnter("%p: WSARecv(,%p,%x,%p,%p,%p,%p)\n",
 | |
|                         a0, a1, a2, a3, a4, a5, a6);
 | |
| #if 0
 | |
|             _PrintDump(a0, a1[0].buf, a1[0].len < *a3 ? a1[0].len : *a3);
 | |
| #endif
 | |
|             _PrintExit("%p: WSARecv(,,,,,,) -> %x\n", a0, rv);
 | |
|         }
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSARecvDisconnect(SOCKET a0,
 | |
|                                   LPWSABUF a1)
 | |
| {
 | |
|     _PrintEnter("%p: WSARecvDisconnect(,%p)\n", a0, a1);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSARecvDisconnect(a0, a1);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSARecvDisconnect(,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSARecvFrom(SOCKET a0,
 | |
|                             LPWSABUF a1,
 | |
|                             DWORD a2,
 | |
|                             LPDWORD a3,
 | |
|                             LPDWORD a4,
 | |
|                             sockaddr* a5,
 | |
|                             LPINT a6,
 | |
|                             LPWSAOVERLAPPED a7,
 | |
|                             LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
 | |
| {
 | |
|     _PrintEnter("%p: WSARecvFrom(,%p,%x,%p,%p,%p,%p,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7, a8);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSARecvFrom(,,,,,,,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| BOOL WINAPI Mine_WSAResetEvent(HANDLE a0)
 | |
| {
 | |
|     _PrintEnter("WSAResetEvent(%p)\n", a0);
 | |
| 
 | |
|     BOOL rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAResetEvent(a0);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAResetEvent() -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSASend(SOCKET a0,
 | |
|                         LPWSABUF a1,
 | |
|                         DWORD a2,
 | |
|                         LPDWORD a3,
 | |
|                         DWORD a4,
 | |
|                         LPWSAOVERLAPPED a5,
 | |
|                         LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)
 | |
| {
 | |
|     _PrintEnter("%p: WSASend(,%p,%x,%p,%x,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSASend(a0, a1, a2, a3, a4, a5, a6);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSASend(,,,,,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSASendDisconnect(SOCKET a0,
 | |
|                                   LPWSABUF a1)
 | |
| {
 | |
|     _PrintEnter("%p: WSASendDisconnect(,%p)\n", a0, a1);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSASendDisconnect(a0, a1);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSASendDisconnect(,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_WSASendTo(SOCKET a0,
 | |
|                           LPWSABUF a1,
 | |
|                           DWORD a2,
 | |
|                           LPDWORD a3,
 | |
|                           DWORD a4,
 | |
|                           sockaddr* a5,
 | |
|                           int a6,
 | |
|                           LPWSAOVERLAPPED a7,
 | |
|                           LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
 | |
| {
 | |
|     _PrintEnter("%p: WSASendTo(,%p,%x,%p,%x,%p,%x,%p,%p)\n", a0, a1, a2, a3, a4, a5, a6, a7, a8);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSASendTo(a0, a1, a2, a3, a4, a5, a6, a7, a8);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: WSASendTo(,,,,,,,,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAStringToAddressA(LPSTR a0,
 | |
|                                     INT a1,
 | |
|                                     LPWSAPROTOCOL_INFOA a2,
 | |
|                                     LPSOCKADDR a3,
 | |
|                                     LPINT a4)
 | |
| {
 | |
|     _PrintEnter("WSAStringToAddressA(%p,%x,%p,%p,%p)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAStringToAddressA(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAStringToAddressA(,,,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| INT WINAPI Mine_WSAStringToAddressW(LPWSTR a0,
 | |
|                                     INT a1,
 | |
|                                     LPWSAPROTOCOL_INFOW a2,
 | |
|                                     LPSOCKADDR a3,
 | |
|                                     LPINT a4)
 | |
| {
 | |
|     _PrintEnter("WSAStringToAddressW(%p,%x,%p,%p,%p)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     INT rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAStringToAddressW(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAStringToAddressW(,,,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| DWORD WINAPI Mine_WSAWaitForMultipleEvents(DWORD a0,
 | |
|                                            void** a1,
 | |
|                                            BOOL a2,
 | |
|                                            DWORD a3,
 | |
|                                            BOOL a4)
 | |
| {
 | |
|     _PrintEnter("WSAWaitForMultipleEvents(%x,%p,%x,%x,%x)\n", a0, a1, a2, a3, a4);
 | |
| 
 | |
|     DWORD rv = 0;
 | |
|     __try {
 | |
|         rv = Real_WSAWaitForMultipleEvents(a0, a1, a2, a3, a4);
 | |
|     } __finally {
 | |
|         _PrintExit("WSAWaitForMultipleEvents(,,,,) -> %x\n", rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| SOCKET WINAPI Mine_accept(SOCKET a0,
 | |
|                           sockaddr* a1,
 | |
|                           int* a2)
 | |
| {
 | |
|     SOCKET rv = 0;
 | |
|     __try {
 | |
|         rv = Real_accept(a0, a1, a2);
 | |
|     } __finally {
 | |
|         WCHAR wzAddress[512] = L"";
 | |
|         int err = WSAGetLastError();
 | |
|         if (rv != INVALID_SOCKET) {
 | |
|             DWORD nAddress = ARRAYSIZE(wzAddress);
 | |
|             if (Real_WSAAddressToStringW(a1, *a2, NULL, wzAddress, &nAddress) != 0) {
 | |
|                 wzAddress[0] = 0;
 | |
|             }
 | |
|         }
 | |
|         WSASetLastError(err);
 | |
| 
 | |
|         if (wzAddress[0]) {
 | |
|             _PrintEnter("%p: accept(,%ls,%p) -> %p\n", a0, wzAddress, a2, rv);
 | |
|         }
 | |
|         else {
 | |
|             _PrintEnter("%p: accept(,%p,%p) -> %p\n", a0, a1, a2, rv);
 | |
|         }
 | |
|         _PrintExit(NULL);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_closesocket(SOCKET a0)
 | |
| {
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_closesocket(a0);
 | |
|     } __finally {
 | |
|         _PrintEnter("%p: closesocket() -> %x\n", a0, rv);
 | |
|         _PrintExit(NULL);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_connect(SOCKET a0,
 | |
|                         sockaddr* name,
 | |
|                         int namelen)
 | |
| {
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_connect(a0, name, namelen);
 | |
|     } __finally {
 | |
|         WCHAR wzAddress[512];
 | |
|         DWORD nAddress = ARRAYSIZE(wzAddress);
 | |
|         int err = WSAGetLastError();
 | |
|         if (Real_WSAAddressToStringW(name, namelen, NULL, wzAddress, &nAddress) == 0) {
 | |
|             if (rv == SOCKET_ERROR) {
 | |
|                 _PrintEnter("%p: connect(,%p:%ls,%x) -> %x [%d]\n",
 | |
|                             a0, name, wzAddress, namelen, rv, err);
 | |
|             }
 | |
|             else {
 | |
|                 _PrintEnter("%p: connect(,%p:%ls,%x) -> %x\n",
 | |
|                             a0, name, wzAddress, namelen, rv);
 | |
|             }
 | |
|         }
 | |
|         else {
 | |
|             if (rv == SOCKET_ERROR) {
 | |
|                 _PrintEnter("%p: connect(,%p,%x) -> %x [%d]\n",
 | |
|                             a0, name, namelen, rv, err);
 | |
|             }
 | |
|             else {
 | |
|                 _PrintEnter("%p: connect(,%p,%x) -> %x\n",
 | |
|                             a0, name, namelen, rv);
 | |
|             }
 | |
|         }
 | |
|         WSASetLastError(err);
 | |
|         _PrintExit(NULL);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_listen(SOCKET a0,
 | |
|                        int a1)
 | |
| {
 | |
|     _PrintEnter("%p: listen(,%x)\n", a0, a1);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_listen(a0, a1);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: listen(,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_recv(SOCKET a0,
 | |
|                      char* a1,
 | |
|                      int a2,
 | |
|                      int a3)
 | |
| {
 | |
|     _PrintEnter("%p: recv(,%p,%x,%x)\n", a0, a1, a2, a3);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_recv(a0, a1, a2, a3);
 | |
| #if 0
 | |
|         _PrintDump(a0, a1, rv);
 | |
| #endif
 | |
|     } __finally {
 | |
|         _PrintExit("%p: recv(,%p,,) -> %x\n", a0, a1, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_recvfrom(SOCKET a0,
 | |
|                          char* a1,
 | |
|                          int a2,
 | |
|                          int a3,
 | |
|                          sockaddr* a4,
 | |
|                          int* a5)
 | |
| {
 | |
|     _PrintEnter("%p: recvfrom(,%p,%x,%x,%p,%p)\n", a0, a1, a2, a3, a4, a5);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_recvfrom(a0, a1, a2, a3, a4, a5);
 | |
| #if 0
 | |
|         _PrintDump(a0, a1, rv);
 | |
| #endif
 | |
|     } __finally {
 | |
|         _PrintExit("%p: recvfrom(,%p,,,,) -> %x\n", a0, a1, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| VOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData)
 | |
| {
 | |
|     if (pszData && cbData > 0) {
 | |
|         CHAR szBuffer[256];
 | |
|         PCHAR pszBuffer = szBuffer;
 | |
|         INT cbBuffer = 0;
 | |
|         INT nLines = 0;
 | |
| 
 | |
|         while (cbData > 0) {
 | |
| #if ABBREVIATE
 | |
|             if (nLines > 20) {
 | |
|                 *pszBuffer++ = '.';
 | |
|                 *pszBuffer++ = '.';
 | |
|                 *pszBuffer++ = '.';
 | |
|                 cbBuffer += 3;
 | |
|                 break;
 | |
|             }
 | |
| #endif
 | |
| 
 | |
|             if (*pszData == '\t') {
 | |
|                 *pszBuffer++ = '\\';
 | |
|                 *pszBuffer++ = 't';
 | |
|                 cbBuffer += 2;
 | |
|                 pszData++;
 | |
|                 cbData--;
 | |
|                 continue;
 | |
|             }
 | |
|             if (*pszData == '\r') {
 | |
|                 *pszBuffer++ = '\\';
 | |
|                 *pszBuffer++ = 'r';
 | |
|                 cbBuffer += 2;
 | |
|                 pszData++;
 | |
|                 cbData--;
 | |
|                 continue;
 | |
|             }
 | |
|             else if (*pszData == '\n') {
 | |
|                 *pszBuffer++ = '\\';
 | |
|                 *pszBuffer++ = 'n';
 | |
|                 cbBuffer += 2;
 | |
|                 *pszBuffer++ = '\0';
 | |
|                 _Print("%p:   %hs\n", socket, szBuffer);
 | |
|                 nLines++;
 | |
|                 pszBuffer = szBuffer;
 | |
|                 cbBuffer = 0;
 | |
|                 pszData++;
 | |
|                 cbData--;
 | |
|                 continue;
 | |
|             }
 | |
|             else if (cbBuffer >= 80) {
 | |
|                 *pszBuffer++ = '\0';
 | |
|                 _Print("%p:   %hs\n", socket, szBuffer);
 | |
|                 nLines++;
 | |
|                 pszBuffer = szBuffer;
 | |
|                 cbBuffer = 0;
 | |
|             }
 | |
| 
 | |
|             if (*pszData < ' ' || *pszData >= 127) {
 | |
|                 *pszBuffer++ = '\\';
 | |
|                 *pszBuffer++ = 'x';
 | |
|                 *pszBuffer++ = "0123456789ABCDEF"[(*pszData & 0xf0) >> 4];
 | |
|                 *pszBuffer++ = "0123456789ABCDEF"[(*pszData & 0x0f)];
 | |
|                 cbBuffer += 4;
 | |
|             }
 | |
|             else {
 | |
|                 *pszBuffer++ = *pszData;
 | |
|             }
 | |
|             cbBuffer++;
 | |
|             pszData++;
 | |
|             cbData--;
 | |
|         }
 | |
| 
 | |
|         if (cbBuffer > 0) {
 | |
|             *pszBuffer++ = '\0';
 | |
|             _Print("%p:   %hs\n", socket, szBuffer);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_send(SOCKET a0,
 | |
|                      char* a1,
 | |
|                      int a2,
 | |
|                      int a3)
 | |
| {
 | |
|     _PrintEnter("%p: send(,%p,%x,%x)\n", a0, a1, a2, a3);
 | |
| #if 0
 | |
|     _PrintDump(a0, a1, a2);
 | |
| #endif
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_send(a0, a1, a2, a3);
 | |
|     } __finally {
 | |
|         if (rv == SOCKET_ERROR) {
 | |
|             int err = WSAGetLastError();
 | |
|             _PrintExit("%p: send(,,,) -> %x (%d)\n", a0, rv, err);
 | |
|         }
 | |
|         else {
 | |
|             _PrintExit("%p: send(,,,) -> %x\n", a0, rv);
 | |
|         }
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_sendto(SOCKET a0,
 | |
|                        char* a1,
 | |
|                        int a2,
 | |
|                        int a3,
 | |
|                        sockaddr* a4,
 | |
|                        int a5)
 | |
| {
 | |
|     _PrintEnter("%p: sendto(,%s,%x,%x,%p,%x)\n", a0, a1, a2, a3, a4, a5);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_sendto(a0, a1, a2, a3, a4, a5);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: sendto(%ls,,,,,) -> %x\n", a0, a1, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int WINAPI Mine_shutdown(SOCKET a0,
 | |
|                          int a1)
 | |
| {
 | |
|     _PrintEnter("%p: shutdown(,%x)\n", a0, a1);
 | |
| 
 | |
|     int rv = 0;
 | |
|     __try {
 | |
|         rv = Real_shutdown(a0, a1);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: shutdown(,) -> %x\n", a0, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| SECURITY_STATUS SEC_ENTRY Mine_EncryptMessage( PCtxtHandle         phContext,
 | |
|                                                unsigned long       fQOP,
 | |
|                                                PSecBufferDesc      pMessage,
 | |
|                                                unsigned long       MessageSeqNo)
 | |
| {
 | |
|     _PrintEnter("%p: EncryptMessage(%x,%x,%x)\n", phContext, fQOP, pMessage, MessageSeqNo);
 | |
| 
 | |
|     SECURITY_STATUS rv = 0;
 | |
|     __try {
 | |
|         if (pMessage != NULL) {
 | |
|             for (unsigned b = 0; b < pMessage->cBuffers; b++) {
 | |
|                 PSecBuffer pBuffer = &pMessage->pBuffers[b];
 | |
|                 if ((pBuffer->BufferType & 0xfff) == 1) {
 | |
|                     _Print("%p:  Type=%08x Size=%d\n", phContext,
 | |
|                            pBuffer->BufferType,
 | |
|                            pBuffer->cbBuffer);
 | |
|                     _PrintDump((SOCKET)phContext, (PCHAR)pBuffer->pvBuffer, pBuffer->cbBuffer);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         rv = Real_EncryptMessage(phContext, fQOP, pMessage, MessageSeqNo);
 | |
|     } __finally {
 | |
|         _PrintExit("%p: EncryptMessage(,) -> %x\n", phContext, rv);
 | |
|     };
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| SECURITY_STATUS SEC_ENTRY Mine_DecryptMessage( PCtxtHandle         phContext,
 | |
|                                                PSecBufferDesc      pMessage,
 | |
|                                                unsigned long       MessageSeqNo,
 | |
|                                                unsigned long *     pfQOP)
 | |
| {
 | |
|     _PrintEnter("%p: DecryptMessage(%x,%x,%x)\n", phContext, pMessage, MessageSeqNo, pfQOP);
 | |
| 
 | |
|     SECURITY_STATUS rv = 0;
 | |
|     __try {
 | |
|         rv = Real_DecryptMessage(phContext, pMessage, MessageSeqNo, pfQOP);
 | |
|         for (unsigned b = 0; b < pMessage->cBuffers; b++) {
 | |
|             PSecBuffer pBuffer = &pMessage->pBuffers[b];
 | |
|             if ((pBuffer->BufferType & 0xfff) == 1) {
 | |
|                 _Print("%p:  Type=%08x Size=%d\n", phContext,
 | |
|                        pBuffer->BufferType,
 | |
|                        pBuffer->cbBuffer);
 | |
|                 _PrintDump((SOCKET)phContext, (PCHAR)pBuffer->pvBuffer, pBuffer->cbBuffer);
 | |
|             }
 | |
|         }
 | |
|     } __finally {
 | |
|         _PrintExit("%p: DecryptMessage(,) -> %x\n", phContext, 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(CreateProcessW);
 | |
|     ATTACH(DecryptMessage);
 | |
|     ATTACH(EncryptMessage);
 | |
|     ATTACH(WSAAccept);
 | |
|     ATTACH(WSAAddressToStringA);
 | |
|     ATTACH(WSAAddressToStringW);
 | |
|     ATTACH(WSAAsyncGetHostByAddr);
 | |
|     ATTACH(WSAAsyncGetHostByName);
 | |
|     ATTACH(WSAAsyncGetProtoByName);
 | |
|     ATTACH(WSAAsyncGetProtoByNumber);
 | |
|     ATTACH(WSAAsyncGetServByName);
 | |
|     ATTACH(WSAAsyncGetServByPort);
 | |
|     ATTACH(WSACancelAsyncRequest);
 | |
|     ATTACH(WSACancelBlockingCall);
 | |
|     ATTACH(WSACleanup);
 | |
|     ATTACH(WSACloseEvent);
 | |
|     ATTACH(WSAConnect);
 | |
|     ATTACH(WSACreateEvent);
 | |
|     ATTACH(WSADuplicateSocketA);
 | |
|     ATTACH(WSADuplicateSocketW);
 | |
|     ATTACH(WSAEnumNameSpaceProvidersA);
 | |
|     ATTACH(WSAEnumNameSpaceProvidersW);
 | |
|     ATTACH(WSAEnumNetworkEvents);
 | |
|     ATTACH(WSAEnumProtocolsA);
 | |
|     ATTACH(WSAEnumProtocolsW);
 | |
|     ATTACH(WSAIsBlocking);
 | |
|     ATTACH(WSAJoinLeaf);
 | |
|     ATTACH(WSAProviderConfigChange);
 | |
|     ATTACH(WSARecv);
 | |
|     ATTACH(WSARecvDisconnect);
 | |
|     ATTACH(WSARecvFrom);
 | |
|     ATTACH(WSAResetEvent);
 | |
|     ATTACH(WSASend);
 | |
|     ATTACH(WSASendDisconnect);
 | |
|     ATTACH(WSASendTo);
 | |
|     ATTACH(WSAStringToAddressA);
 | |
|     ATTACH(WSAStringToAddressW);
 | |
|     ATTACH(WSAWaitForMultipleEvents);
 | |
|     ATTACH(accept);
 | |
|     ATTACH(closesocket);
 | |
|     ATTACH(connect);
 | |
|     ATTACH(listen);
 | |
|     ATTACH(recv);
 | |
|     ATTACH(recvfrom);
 | |
|     ATTACH(send);
 | |
|     ATTACH(sendto);
 | |
|     ATTACH(shutdown);
 | |
| 
 | |
|     return DetourTransactionCommit();
 | |
| }
 | |
| 
 | |
| LONG DetachDetours(VOID)
 | |
| {
 | |
|     DetourTransactionBegin();
 | |
|     DetourUpdateThread(GetCurrentThread());
 | |
| 
 | |
|     DETACH(CreateProcessW);
 | |
|     DETACH(DecryptMessage);
 | |
|     DETACH(EncryptMessage);
 | |
|     DETACH(WSAAccept);
 | |
|     DETACH(WSAAddressToStringA);
 | |
|     DETACH(WSAAddressToStringW);
 | |
|     DETACH(WSAAsyncGetHostByAddr);
 | |
|     DETACH(WSAAsyncGetHostByName);
 | |
|     DETACH(WSAAsyncGetProtoByName);
 | |
|     DETACH(WSAAsyncGetProtoByNumber);
 | |
|     DETACH(WSAAsyncGetServByName);
 | |
|     DETACH(WSAAsyncGetServByPort);
 | |
|     DETACH(WSACancelAsyncRequest);
 | |
|     DETACH(WSACancelBlockingCall);
 | |
|     DETACH(WSACleanup);
 | |
|     DETACH(WSACloseEvent);
 | |
|     DETACH(WSAConnect);
 | |
|     DETACH(WSACreateEvent);
 | |
|     DETACH(WSADuplicateSocketA);
 | |
|     DETACH(WSADuplicateSocketW);
 | |
|     DETACH(WSAEnumNameSpaceProvidersA);
 | |
|     DETACH(WSAEnumNameSpaceProvidersW);
 | |
|     DETACH(WSAEnumNetworkEvents);
 | |
|     DETACH(WSAEnumProtocolsA);
 | |
|     DETACH(WSAEnumProtocolsW);
 | |
|     DETACH(WSAIsBlocking);
 | |
|     DETACH(WSAJoinLeaf);
 | |
|     DETACH(WSAProviderConfigChange);
 | |
|     DETACH(WSARecv);
 | |
|     DETACH(WSARecvDisconnect);
 | |
|     DETACH(WSARecvFrom);
 | |
|     DETACH(WSAResetEvent);
 | |
|     DETACH(WSASend);
 | |
|     DETACH(WSASendDisconnect);
 | |
|     DETACH(WSASendTo);
 | |
|     DETACH(WSAStringToAddressA);
 | |
|     DETACH(WSAStringToAddressW);
 | |
|     DETACH(WSAWaitForMultipleEvents);
 | |
|     DETACH(accept);
 | |
|     DETACH(closesocket);
 | |
|     DETACH(connect);
 | |
|     DETACH(listen);
 | |
|     DETACH(recv);
 | |
|     DETACH(recvfrom);
 | |
|     DETACH(send);
 | |
|     DETACH(sendto);
 | |
|     DETACH(shutdown);
 | |
| 
 | |
|     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);
 | |
| }
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| // 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();
 | |
| 
 | |
|     WCHAR wzExeName[MAX_PATH];
 | |
|     s_hInst = hDll;
 | |
| 
 | |
|     Real_GetModuleFileNameW(hDll, s_wzDllPath, ARRAYSIZE(s_wzDllPath));
 | |
|     Real_GetModuleFileNameW(NULL, wzExeName, ARRAYSIZE(wzExeName));
 | |
| 
 | |
|     SyelogOpen("trcssl" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);
 | |
|     Syelog(SYELOG_SEVERITY_INFORMATION,
 | |
|            "##################################################################\n");
 | |
|     Syelog(SYELOG_SEVERITY_INFORMATION,
 | |
|            "### %ls\n", wzExeName);
 | |
|     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.
 |