[272] | 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 | }
|
---|