183 lines
6.2 KiB
C++
183 lines
6.2 KiB
C++
|
/******************************************************************************
|
||
|
|
||
|
Copyright (c) 1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
WindowDetours.cpp
|
||
|
|
||
|
Abstract:
|
||
|
This file contains the trampolines for the detour of System functions.
|
||
|
|
||
|
Revision History:
|
||
|
Davide Massarenti (dmassare) 10/31/99
|
||
|
created
|
||
|
|
||
|
******************************************************************************/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef std::map<HWND, DWORD> WindowsMap;
|
||
|
typedef WindowsMap::iterator WindowsIter;
|
||
|
|
||
|
static WindowsMap s_mapWindows;
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DETOUR_TRAMPOLINE( HWND WINAPI Trampoline_CreateWindowExA( DWORD ,
|
||
|
LPCSTR ,
|
||
|
LPCSTR ,
|
||
|
DWORD ,
|
||
|
int ,
|
||
|
int ,
|
||
|
int ,
|
||
|
int ,
|
||
|
HWND ,
|
||
|
HMENU ,
|
||
|
HANDLE ,
|
||
|
LPVOID ), CreateWindowExA );
|
||
|
|
||
|
HWND WINAPI Detour_CreateWindowExA( DWORD dwExStyle ,
|
||
|
LPCSTR lpClassName , // pointer to registered class name
|
||
|
LPCSTR lpWindowName, // pointer to window name
|
||
|
DWORD dwStyle , // window style
|
||
|
int x , // horizontal position of window
|
||
|
int y , // vertical position of window
|
||
|
int nWidth , // window width
|
||
|
int nHeight , // window height
|
||
|
HWND hWndParent , // handle to parent or owner window
|
||
|
HMENU hMenu , // menu handle or child identifier
|
||
|
HANDLE hInstance , // handle to application instance
|
||
|
LPVOID lpParam ) // window-creation data
|
||
|
{
|
||
|
HWND hwnd;
|
||
|
|
||
|
hwnd = Trampoline_CreateWindowExA( dwExStyle ,
|
||
|
lpClassName ,
|
||
|
lpWindowName,
|
||
|
dwStyle ,
|
||
|
x ,
|
||
|
y ,
|
||
|
nWidth ,
|
||
|
nHeight ,
|
||
|
hWndParent ,
|
||
|
hMenu ,
|
||
|
hInstance ,
|
||
|
lpParam );
|
||
|
|
||
|
DebugLog( "%%%% CreateWindowExA %08lx : '%s'\n", hwnd, lpWindowName ? lpWindowName : "" );
|
||
|
|
||
|
if(hwnd)
|
||
|
{
|
||
|
s_mapWindows[hwnd] = ::GetCurrentThreadId();
|
||
|
}
|
||
|
|
||
|
return hwnd;
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DETOUR_TRAMPOLINE( HWND WINAPI Trampoline_CreateWindowExW( DWORD ,
|
||
|
LPCWSTR ,
|
||
|
LPCWSTR ,
|
||
|
DWORD ,
|
||
|
int ,
|
||
|
int ,
|
||
|
int ,
|
||
|
int ,
|
||
|
HWND ,
|
||
|
HMENU ,
|
||
|
HANDLE ,
|
||
|
LPVOID ), CreateWindowExW );
|
||
|
|
||
|
HWND WINAPI Detour_CreateWindowExW( DWORD dwExStyle ,
|
||
|
LPCWSTR lpClassName , // pointer to registered class name
|
||
|
LPCWSTR lpWindowName, // pointer to window name
|
||
|
DWORD dwStyle , // window style
|
||
|
int x , // horizontal position of window
|
||
|
int y , // vertical position of window
|
||
|
int nWidth , // window width
|
||
|
int nHeight , // window height
|
||
|
HWND hWndParent , // handle to parent or owner window
|
||
|
HMENU hMenu , // menu handle or child identifier
|
||
|
HANDLE hInstance , // handle to application instance
|
||
|
LPVOID lpParam ) // window-creation data
|
||
|
{
|
||
|
HWND hwnd;
|
||
|
|
||
|
hwnd = Trampoline_CreateWindowExW( dwExStyle ,
|
||
|
lpClassName ,
|
||
|
lpWindowName,
|
||
|
dwStyle ,
|
||
|
x ,
|
||
|
y ,
|
||
|
nWidth ,
|
||
|
nHeight ,
|
||
|
hWndParent ,
|
||
|
hMenu ,
|
||
|
hInstance ,
|
||
|
lpParam );
|
||
|
|
||
|
DebugLog( L"%%%% CreateWindowExW %08lx : '%s'\n", hwnd, lpWindowName ? lpWindowName : L"" );
|
||
|
|
||
|
if(hwnd)
|
||
|
{
|
||
|
s_mapWindows[hwnd] = ::GetCurrentThreadId();
|
||
|
}
|
||
|
|
||
|
return hwnd;
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DETOUR_TRAMPOLINE( BOOL WINAPI Trampoline_DestroyWindow( HWND ), DestroyWindow );
|
||
|
|
||
|
BOOL WINAPI Detour_DestroyWindow( HWND hWnd ) // handle to window to destroy
|
||
|
{
|
||
|
BOOL res;
|
||
|
WindowsIter it;
|
||
|
|
||
|
DebugLog( "%%%% DestroyWindow %08lx\n", hWnd );
|
||
|
|
||
|
it = s_mapWindows.find( hWnd );
|
||
|
if(it != s_mapWindows.end())
|
||
|
{
|
||
|
if(it->second != ::GetCurrentThreadId())
|
||
|
{
|
||
|
// Window destroyed from the wrong thread!!
|
||
|
DebugBreak();
|
||
|
}
|
||
|
|
||
|
s_mapWindows.erase( it );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Window already destroyed!!
|
||
|
DebugBreak();
|
||
|
}
|
||
|
|
||
|
res = Trampoline_DestroyWindow( hWnd );
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void WindowDetours_Setup()
|
||
|
{
|
||
|
DetourFunctionWithTrampoline( (PBYTE)Trampoline_CreateWindowExA, (PBYTE)Detour_CreateWindowExA );
|
||
|
DetourFunctionWithTrampoline( (PBYTE)Trampoline_CreateWindowExW, (PBYTE)Detour_CreateWindowExW );
|
||
|
|
||
|
DetourFunctionWithTrampoline( (PBYTE)Trampoline_DestroyWindow , (PBYTE)Detour_DestroyWindow );
|
||
|
}
|
||
|
|
||
|
void WindowDetours_Remove()
|
||
|
{
|
||
|
DetourRemoveWithTrampoline( (PBYTE)Trampoline_CreateWindowExA, (PBYTE)Detour_CreateWindowExA );
|
||
|
DetourRemoveWithTrampoline( (PBYTE)Trampoline_CreateWindowExW, (PBYTE)Detour_CreateWindowExW );
|
||
|
|
||
|
DetourRemoveWithTrampoline( (PBYTE)Trampoline_DestroyWindow , (PBYTE)Detour_DestroyWindow );
|
||
|
}
|