source: Daodan/src/Daodan_Patch.c@ 346

Last change on this file since 346 was 346, checked in by rossy, 15 years ago

parses daodan.ini to add language patches

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