241 |
|
return false; |
242 |
|
} |
243 |
|
|
244 |
+ |
void* DDrPatch_ExecutableASM(char* from, char* nextInst, const unsigned char* code, int length) |
245 |
+ |
{ |
246 |
+ |
char* newCode = malloc(length+5); |
247 |
+ |
if (!DDrPatch_NOOP(newCode, length+5)) |
248 |
+ |
return (void*)-1; |
249 |
+ |
|
250 |
+ |
memcpy(newCode, code, length); |
251 |
+ |
if (!DDrPatch_MakeJump(&newCode[length], nextInst)) |
252 |
+ |
return (void*)-1; |
253 |
+ |
|
254 |
+ |
DWORD oldp; |
255 |
+ |
if (!VirtualProtect(newCode, length+5, PAGE_EXECUTE_READWRITE, &oldp)) { |
256 |
+ |
STARTUPMESSAGE("ExecASM: Could not mark page for new code as executable: from address 0x%08x", from); |
257 |
+ |
return (void*)-1; |
258 |
+ |
} |
259 |
+ |
|
260 |
+ |
if (!DDrPatch_MakeJump(from, newCode)) |
261 |
+ |
return (void*)-1; |
262 |
+ |
|
263 |
+ |
return newCode; |
264 |
+ |
} |
265 |
|
|
266 |
|
void DDrPatch_PrintDisasm(void* addr, int instLimit, int sizeLimit) |
267 |
|
{ |