ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/Daodan/src/Daodan_Patch.c
Revision: 272
Committed: Tue Mar 17 09:06:00 2009 UTC (16 years, 6 months ago) by rossy
Content type: text/x-csrc
File size: 1693 byte(s)
Log Message:
directory structure

File Contents

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