Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Viele Fehler im Code

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.10.2008, 18:12 Uhr
~Eoleon
Gast


Servus!

Also ich hab hier ne dll liegen, die die Auflösung eines Spiels (diablo2) erhöht.
Zu der dll wurde der Source-Code geliefert.
Im Spiel ist die maximale Auflösung 800x600. Die dll ändert die Auflösung in 1300x700. Ich möchte die Auflösung in 1024x768 haben. Also dacht ich mir, klar, den Source leicht abändern und mit Dev-C++ ne dll kompilieren. Tja falsch gedacht, ich bekomme einige Fehlermeldungen. Ist aber komisch, denn wenn es der originale Source ist, dann hat es beim ehemaligen Entwickler ja geklappt...

Hoffe ihr könnt mir weiterhelfen:

Code:
#include <windows.h>

    #define     STD_CALL_LEN                    0x05
    #define        INST_NOP                        0x90
    #define        INST_CALL                        0xE8
    #define        INST_JMP                        0xE9
    #define        INST_JMPR                        0xEB
    #define        INST_RET                        0xC3


DWORD     PatchJMP(DWORD dwAddr, DWORD dwFuncAddr, DWORD dwSize);
BOOL     WriteBytes(LPVOID dwAddr, LPCVOID pd, DWORD dwSize);

void KeyHookIntercept();
void __fastcall KeyHook(BYTE keycode, BYTE repeat);

DWORD KeyJumpBack=0x6FB4F7A5;

BOOL WINAPI DllMain(HINSTANCE hDll,DWORD dwReason,LPVOID lpReserved)
{
    if(dwReason==DLL_PROCESS_ATTACH)
    {
        PatchJMP((DWORD)((DWORD)LoadLibraryA("D2Client.dll")+0x6FB4F7A0-0x6fab0000),(DWORD)KeyHookIntercept,5);
    }
    return true;
}

DWORD ChangeWindowCall=0x6F8ECAC0;

void __declspec(naked) __fastcall NewResolution(DWORD Size)
{
    __asm
    {
        push ecx
        call ChangeWindowCall
        retn
    }

}

DWORD NewJump=0x6FB3F800;

void __declspec(naked) __fastcall NewSize(DWORD H,DWORD W)
{
    __asm
    {
        MOV DWORD PTR DS:[0x6FBCD528],ecx
        MOV DWORD PTR DS:[0x6FBCD524],edx-40
        MOV DWORD PTR DS:[0x6FBCC324],edx
        MOV DWORD PTR DS:[0x6FB8C6E8],ECX
        MOV DWORD PTR DS:[0x6FB8C6E4],EDX
        MOV DWORD PTR DS:[0x6FB8C6E0],ECX
        ret
    }
}

void ToggleResolution(int x,int y,int mode)
{
    NewResolution(mode);
    NewSize(x,y);
}

bool Resized=false;

void __fastcall KeyHook(BYTE keycode, BYTE repeat)
{
    if(repeat)
        return;
    if(keycode==VK_SUBTRACT)
        if(!Resized) {
        ToggleResolution(1024,768,3);
        Resized=true;
        }
        else {
        ToggleResolution(800,600,2);
        Resized=false;
        }
}

void __declspec(naked) KeyHookIntercept()
{
    __asm
    {
        __asm
        {
        //edi = ptr to (hwnd, msg, wparam, lparam)
        mov eax, [esp+4]
        mov cl,[eax+0x04+4] //nVirtKey (wparam)
        mov dl,[eax+0x08+3+4] //lKeyData (lparam)
        and dl,0x40 //bit 30 of lKeyData (lparam)
        call KeyHook
        //original code
        PUSH EDI                                 ; D2CLIENT.6FB16EC0
        MOV EDI,DWORD PTR SS:[ESP+8]
        jmp KeyJumpBack
        }
    }
}

// Patch

DWORD PatchJMP(DWORD dwAddr, DWORD dwFuncAddr, DWORD dwSize)
{
    if(IsBadReadPtr((void*)dwAddr,dwSize))
    return (FALSE);
    BYTE* ptData=(BYTE*)malloc(dwSize); //make memory
    *ptData=INST_JMP; // add call instruction (one byte)
    dwFuncAddr-=(dwAddr+STD_CALL_LEN); // invert addr
    memcpy(ptData+sizeof(BYTE),&dwFuncAddr,sizeof(DWORD)); // add function addr
    if(dwSize>STD_CALL_LEN) //pad extra bytes with nops
    memset(ptData+STD_CALL_LEN,INST_NOP,dwSize-STD_CALL_LEN);
    DWORD dwRet=WriteBytes((void*)dwAddr,ptData,dwSize);
    free(ptData);
    return dwRet;
}

BOOL WriteBytes(LPVOID dwAddr, LPCVOID pd, DWORD dwSize)
{
    DWORD dwOldProtect;
    if(VirtualProtect(dwAddr, dwSize, PAGE_READWRITE,  &dwOldProtect)) //change memory access rights
    {
        memcpy(dwAddr, pd, dwSize); // copy data
        return VirtualProtect(dwAddr, dwSize, dwOldProtect, &dwOldProtect); //restore old access rights
    }
    return FALSE;
}



Danke schonmal

Gruß,

Eoleon.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.10.2008, 18:46 Uhr
0xdeadbeef
Gott
(Operator)


Ich hege die Vermutung, dass das vor allem an dem ganzen __asm-Gelumpe liegt, das völlig unstandardisiert und dementsprechend compilergebunden ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.10.2008, 01:32 Uhr
~Eoleon
Gast


Also kann ichs wohl vergessen, wenn ich nich weiß, welcher Compiler der Kerl benutzt hat?! Mist.. Naja danke für die schnelle Antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.10.2008, 17:03 Uhr
0xdeadbeef
Gott
(Operator)


Das sieht mir sehr nach Visual C++ aus. Mit Sicherheit sagen kann ich das aber auch nicht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.10.2008, 20:55 Uhr
Pablo
Supertux
(Operator)


hat jedenfalls nichts mit ANSI C zu tun, verschied deswegen mal ins Windows Forum
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.10.2008, 16:49 Uhr
mmc20
puss in boots


zumindest compilierts fehlerfrei mit dem VisualC 6.0 (VS2008 hab ich nicht probiert) (die 6.0 dürfte auch so alt(oder noch älter) sein wie diablo2)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.10.2008, 18:49 Uhr
CppProgrammer



Unter VisualStudio 2005 kompilierts ebenfalls.

Musste nur noch per Hand #include <cstdlib> einfügen, weil malloc() und free() sonst nicht definiert gewesen wären.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.10.2008, 18:53 Uhr
mmc20
puss in boots


jo genau, ich hatte zum testen einfach ein new/delete draus gemacht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: