| 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 | 
   | 
 { |