GLBasic forum

Other languages => GLBasic - de => Topic started by: Heiko on 2009-Apr-19

Title: Br?uchte man Hilfe von jemandem der richtig gut C++ kann...
Post by: Heiko on 2009-Apr-19
Also eins vorweg, ich eigne mir grad C++ an......
Paar einfache dx sachen klappen auch schon....
Aber ich komme grad mit der WinAPI ins stottern.
Und zwar folgendes, ich m?chte ein addon in dll form f?r xors3d programmieren.
Theoretisch wird nach dem start der xors engine IDirect3D9 gehooked(gemopst sozusagen) und wieder zur?ckgegeben nachdem meine routinen durch sind.
Ich hab einiges an codes gefunden....aber soweit ich das herauslesen konnte, wird dort sozusagen ein zeiger ?bergeben, welcher einfach alles enth?lt, was man
"zeichnen" m?chte.
Nun ist es ja so, da? die dll sp?ter einen gewissen befehlssatz haben soll....
Also kann man den hook nicht in nur einer funktion durchziehen...
Man w?rde eine Art StartDraw() und ein EndDraw() brauchen.
Dazwischen k?nnte man dann die anderen funktionen der library nutzen(loadimage, drawimage etc.)
Ich hab ein paar, meiner meinung nach, gute quellcodes gefunden, die jedoch nicht den zweck erf?llen eine StartDraw und eine EndDraw(bis dahin bleibt der hook erhalten) bereitzustellen.
Klar, ich k?nnte nat?rlich nun probieren bis ich schwarz werde, und da kam mir doch die gl?nzende Idee, ich werf das Thema hier in die runde.
Anbei zwei quellcodes, die vielversprechend ausschauen.Und vielleicht kann mir jemand ja helfen, wenigstens diese zwei Funktionen hinzubiegen.W?re schon toll.

code1:
Code (glbasic) Select
// 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;
}


code2:
Code (glbasic) Select
/ 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);
}