source: Daodan/src/Daodan_Patch.c @ 351

Last change on this file since 351 was 351, checked in by rossy, 11 years ago

almost windowed mode

File size: 2.2 KB
Line 
1#include "Daodan_Patch.h"
2#include <windows.h>
3#include <stdlib.h>
4#include <string.h>
5
6bool DDrPatch_MakeJump(void* from, void* to)
7{
8        DWORD oldp;
9       
10        if (VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &oldp))
11        {
12                *(char*)from++ = 0xe9; // jmp rel32
13                *(int*)from = (unsigned int)to - (unsigned int)from - 4;
14                VirtualProtect(from, 5, oldp, &oldp);
15                return true;
16        }
17        else
18                return false;
19}
20
21bool DDrPatch_MakeCall(void* from, void* to)
22{
23        DWORD oldp;
24       
25        if (VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &oldp))
26        {
27                *(char*)from++ = 0xe8; // call rel32
28                *(int*)from = (unsigned int)to - (unsigned int)from - 4;
29                VirtualProtect(from, 5, oldp, &oldp);
30                return true;
31        }
32        else
33                return false;
34}
35
36bool DDrPatch_String(char* dest, const char* string, int length)
37{
38        DWORD oldp;
39       
40        if (VirtualProtect(dest, length, PAGE_EXECUTE_READWRITE, &oldp))
41        {
42                memcpy(dest, string, length);
43                VirtualProtect(dest, length, oldp, &oldp);
44                return true;
45        }
46        else
47                return false;
48}
49
50bool DDrPatch_Byte(char* dest, char value)
51{
52        DWORD oldp;
53       
54        if (VirtualProtect(dest, 1, PAGE_EXECUTE_READWRITE, &oldp))
55        {
56                *dest = value;
57                VirtualProtect(dest, 1, oldp, &oldp);
58                return true;
59        }
60        else
61                return false;
62}
63
64bool DDrPatch_Int32(int* dest, int value)
65{
66        DWORD oldp;
67       
68        if (VirtualProtect(dest, 4, PAGE_EXECUTE_READWRITE, &oldp))
69        {
70                *dest = value;
71                VirtualProtect(dest, 4, oldp, &oldp);
72                return true;
73        }
74        else
75                return false;
76}
77
78bool DDrPatch_Int16(short* dest, short value)
79{
80        DWORD oldp;
81       
82        if (VirtualProtect(dest, 2, PAGE_EXECUTE_READWRITE, &oldp))
83        {
84                *dest = value;
85                VirtualProtect(dest, 2, oldp, &oldp);
86                return true;
87        }
88        else
89                return false;
90}
91
92bool DDrPatch_StrDup(int* dest, const char* value)
93{
94        DWORD oldp;
95       
96        if (VirtualProtect(dest, 4, PAGE_EXECUTE_READWRITE, &oldp))
97        {
98                *dest = (int)strdup(value);
99                VirtualProtect(dest, 4, oldp, &oldp);
100                return true;
101        }
102        else
103                return false;
104}
105
106bool DDrPatch_NOOP(char* dest, unsigned int length)
107{
108        DWORD oldp;
109       
110        if (VirtualProtect(dest, length, PAGE_EXECUTE_READWRITE, &oldp))
111        {
112                memset(dest, 0x90, length);
113                VirtualProtect(dest, length, oldp, &oldp);
114                return true;
115        }
116        else
117                return false;
118}
Note: See TracBrowser for help on using the repository browser.