#include "Windows.h"
#include <iostream>
#include <tchar.h>
#define TEST_DLL
#include "test_dll.h"
#include "detours.h"
#pragma comment(lib, "detours")
HANDLE _DllHandle;
HHOOK _hInjectionHook;
LRESULT CALLBACK WinHookCallBack(int nCode, WPARAM wParam, LPARAM lParam);
//=============================================================================
int (WINAPI *Real_DrawTextExA)(HDC hdc, LPSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) = DrawTextExA;
int WINAPI Mine_DrawTextExA (HDC hdc, LPSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams){
char dllstrA[100] = "Mine_DrawTextExA";
return Real_DrawTextExA(hdc, dllstrA, -1, lprc, dwDTFormat, NULL);
}
int (WINAPI *Real_DrawTextExW)(HDC hdc, LPWSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) = DrawTextExW;
int WINAPI Mine_DrawTextExW (HDC hdc, LPWSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams){
wchar_t dllstrW[100]=L"Mine_DrawTextExW";
return Real_DrawTextExW(hdc, dllstrW, -1, lprc, dwDTFormat, NULL);
}
//=============================================================================
BOOL (WINAPI *Real_ExtTextOutA)(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lprc, LPCSTR lpString, UINT cbCount, const INT *lpDx)= ExtTextOutA;
BOOL WINAPI Mine_ExtTextOutA (HDC hdc, int X, int Y, UINT fuOptions, const RECT *lprc, LPCSTR lpString, UINT cbCount, const INT *lpDx){
char dllstrA[100] = "Mine_ExtTextOutA";
int slen = strnlen(dllstrA,maxlinelen);
return Real_ExtTextOutA( hdc, X, Y, fuOptions, lprc, dllstrA, slen, lpDx );
}
BOOL (WINAPI *Real_ExtTextOutW)(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lprc, LPCWSTR lpString, UINT cbCount, const INT *lpDx)= ExtTextOutW;
BOOL WINAPI Mine_ExtTextOutW (HDC hdc, int X, int Y, UINT fuOptions, const RECT *lprc, LPCWSTR lpString, UINT cbCount, const INT *lpDx){
wchar_t dllstrW[100] = L"Mine_ExtTextOutW";
int slen = wcsnlen(dllstrW,maxlinelen);
return Real_ExtTextOutW( hdc, X, Y, fuOptions, lprc, dllstrW, slen, lpDx );
}
//=============================================================================
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
{
_DllHandle = hModule;
DetourTransactionBegin();
DetourUpdateThread(::GetCurrentThread());
DetourAttach(&(PVOID&)Real_DrawTextExA, Mine_DrawTextExA);
DetourAttach(&(PVOID&)Real_DrawTextExW, Mine_DrawTextExW);
DetourAttach(&(PVOID&)Real_ExtTextOutA, Mine_ExtTextOutA);
DetourAttach(&(PVOID&)Real_ExtTextOutW, Mine_ExtTextOutW);
DetourTransactionCommit();
break;
}
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH:
{
DetourTransactionBegin();
DetourUpdateThread(::GetCurrentThread());
DetourDetach(&(PVOID&)Real_DrawTextExA, Mine_DrawTextExA);
DetourDetach(&(PVOID&)Real_DrawTextExW, Mine_DrawTextExW);
DetourDetach(&(PVOID&)Real_ExtTextOutA, Mine_ExtTextOutA);
DetourDetach(&(PVOID&)Real_ExtTextOutW, Mine_ExtTextOutW);
DetourTransactionCommit();
break;
}
}
return TRUE;
}
//=============================================================================
LRESULT CALLBACK WinHookCallBack(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return (CallNextHookEx (_hInjectionHook,nCode,wParam,lParam));
return 0;
}
//=============================================================================
int SetHook(DWORD dwThreadId){
_hInjectionHook=SetWindowsHookEx(WH_GETMESSAGE, WinHookCallBack, (HINSTANCE)_DllHandle, 0);
return _hInjectionHook ? 1 : 0;
}
//=============================================================================