You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
6.4 KiB
182 lines
6.4 KiB
/******************************************************************************
|
|
|
|
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 );
|
|
}
|