Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
// dllmain.cpp : Defines the entry point for the DLL application. #include "stdafx.h" #include <winsock2.h> /* Fake export function */ extern "C" __declspec(dllexport) void fakeexportfunction() { return ; } // Functions to be Hooked/Detoured IDirect3D9 * (WINAPI * Real_Direct3DCreate9)(UINT SDKVersion) = Direct3DCreate9; // Functions that replace Hooked/Detoured version IDirect3D9 * WINAPI Hook_Direct3DCreate9(UINT a0) { Beep(1000, 1000); IDirect3D9 * rv; __try { rv = Real_Direct3DCreate9(a0); } __finally { OutputDebugString(TEXT("Direct3DCreate9\n")); } OutputDebugString(TEXT("Direct3DCreate9\n")); return rv; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { LONG error; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)Real_Direct3DCreate9, Hook_Direct3DCreate9); error = DetourTransactionCommit(); if (error == NO_ERROR) OutputDebugString(TEXT("Attached Hooks\n")); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)Real_Direct3DCreate9, Hook_Direct3DCreate9); error = DetourTransactionCommit(); OutputDebugString(TEXT("Detached Hooks\n")); break; } return TRUE; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/ D3d hook #include <windows.h> #include <cstdio> #include <d3d9.h> #include <d3dx9.h> typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); // typedef EndScene_t pEndScene; void InitHook(); void *DetourFunc(BYTE *src, const BYTE *dst, const int len); HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice) { // das ist das entscheidende: Wenn normalerweise EndScene aufgerufen wird, wird diese Funktion von dem Programm aufgerufen // hier kommen deine Sachen hin die man drawn mit pDevice. // und dann noch zurück zum originalen EndScene, diese muss ja auch aufgerufen werden return pEndScene(pDevice); } int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0); break; } return true; } void InitHook() { HMODULE hModule = NULL; while( !hModule ) { hModule = GetModuleHandleA( "d3d9.dll" ); // Handle zur DLL holen Sleep( 100 ); // 100ms warten } // 0x4FDD71B0 ist die Addresse für EndScene in d3d9.dll pEndScene = ( EndScene_t )DetourFunc((PBYTE) 0x4FDD71B0,(PBYTE)hkEndScene, 5); // hier ist der hook } void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // detour, muss man nicht wirklich verstehen. Der Code ersetzt das alte endScene durch unseres. Ist von gd { 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); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
IDirect3DDevice9 *dev = get_device_from_irgentwoher(); endscene_t endscene = reinterpret_cast<endscene_t>(&dev->EndScene); endscene_t orig = detour(endscene, myendscene); // in der hookfunc // endscene bearbeiten return orig(dev); |
Anonymous
unregistriert
Quellcode |
|
1 2 3 4 5 6 |
Init3D() // 3d engine code Init2D(getdevice von 3D engine) // start des hooks(es gibt einen Getdevice befehl in der 3d engine) DrawRect(w,h,x,y) //irgendeine draw funktion als bsp. DeInit2D() Device zurück an 3D Engine geben Flip() // 3D Engine render alles |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
LPDIRECT3DDEVICE9 Device; LPDIRECT3DDEVICE9 CDirect3D::GetDevice(void) { return Device; } |
Werbeanzeige