Hallo epvp,
Hab ein Problem und zwar möchte ich ein pinkes Rechteck oben links zeichnen lassen. Aber wenn ich es mithilfe eines Hotkeys anzeigen lassen möchte, sieht man das Rechteck kurz und dann stürzt das Programm ab. Ohne die Hotkey Funktion klappt das super, aber man möchte ja sein d3d menu auch wieder schließen o.O
Hier mein Source Code:
Ich hoffe mir kann jemand helfen :)
Hab ein Problem und zwar möchte ich ein pinkes Rechteck oben links zeichnen lassen. Aber wenn ich es mithilfe eines Hotkeys anzeigen lassen möchte, sieht man das Rechteck kurz und dann stürzt das Programm ab. Ohne die Hotkey Funktion klappt das super, aber man möchte ja sein d3d menu auch wieder schließen o.O
Hier mein Source Code:
Code:
#pragma once
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
typedef HRESULT (D3DAPI* Reset_t)(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
typedef HRESULT (WINAPI* tEndScene)(LPDIRECT3DDEVICE9 pDevice);
tEndScene pEndScene = NULL;
Reset_t pReset = 0;
DWORD dwEndScene;
DWORD dwDrawIndexedPrimitive;
D3DCOLOR txtPink = D3DCOLOR_ARGB(255,255, 0, 255);
void Funktionen();
void *DetourFunc(BYTE *src, const BYTE *dst, const int len);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(;*szMask;++szMask,++pData,++bMask)
if(*szMask=='x' && *pData!=*bMask )
return false;
return (*szMask) == NULL;
}
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i < dwLen; i++)
if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
return (DWORD)(dwAddress+i);
return 0;
}
void Rechteck (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
{
D3DRECT rect = {X, Y, X+L, Y+H};
Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0);
}
HRESULT D3DAPI hkReset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
return pReset(pDevice, pPresentationParameters);
}
HRESULT WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
Rechteck (pDevice, 10, 10, 200, 200, txtPink);
return pEndScene(pDevice);
}
void Funktionen()
{
HMODULE hModule = NULL;
while( !hModule )
{
hModule = GetModuleHandleA( "d3d9.dll" );
Sleep( 100 );
}
bool draw = false;
for(;;) {
__asm pushad;
if(GetAsyncKeyState(VK_INSERT)&1) {
draw = !draw;
}
if (draw)
{
dwEndScene = (DWORD)hModule + 0x871A0;
DWORD* VTableStart = 0;
DWORD FoundByGordon = dwFindPattern((DWORD)hModule, 0x128000,
(PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
memcpy(&VTableStart, (void*)(FoundByGordon+2), 4);
dwDrawIndexedPrimitive = (DWORD)VTableStart[82]; // für mehr: blick in die d3d9.h werfen!
dwEndScene = (DWORD)VTableStart[42];
pEndScene = (tEndScene )DetourFunc((PBYTE) dwEndScene ,(PBYTE)hkEndScene, 5);
}
Sleep(100);
__asm popad;
}
}
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
MessageBoxA(0, "* * * Coded By Michi * * *", "Draw a Box !", 0);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Funktionen, 0, 0, 0);
break;
}
return true;
}
void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}