--- Daodan/src/Daodan_Patch.c 2014/03/16 20:06:52 983 +++ Daodan/src/Daodan_Patch.c 2014/04/06 17:06:02 993 @@ -44,23 +44,23 @@ void* DDrPatch_MakeDetour(void* from, vo /* DISASM MyDisasm; int i = 0; - DDrStartupMessage(""); - DDrStartupMessage(""); + STARTUPMESSAGE("", 0); + STARTUPMESSAGE("", 0); memset (&MyDisasm, 0, sizeof(DISASM)); MyDisasm.EIP = (UIntPtr) from; i = 0; - DDrStartupMessage("Orig before @ 0x%06x", from); + STARTUPMESSAGE("Orig before @ 0x%06x", from); while (i<10){ len = Disasm(&MyDisasm); if (len != UNKNOWN_OPCODE) { - DDrStartupMessage("%s, Opcode: 0x%x, len: %d, branch: %d, to: 0x%06x", MyDisasm.CompleteInstr, MyDisasm.Instruction.Opcode, len, MyDisasm.Instruction.BranchType, MyDisasm.Instruction.AddrValue); - DDrStartupMessage(" Cat: 0x%04x, prefix count: %d", MyDisasm.Instruction.Category & 0xffff, MyDisasm.Prefix.Number ); + STARTUPMESSAGE("%s, Opcode: 0x%x, len: %d, branch: %d, to: 0x%06x", MyDisasm.CompleteInstr, MyDisasm.Instruction.Opcode, len, MyDisasm.Instruction.BranchType, MyDisasm.Instruction.AddrValue); + STARTUPMESSAGE(" Cat: 0x%04x, prefix count: %d", MyDisasm.Instruction.Category & 0xffff, MyDisasm.Prefix.Number ); MyDisasm.EIP += (UIntPtr)len; i++; } }; - DDrStartupMessage(""); + STARTUPMESSAGE("", 0); */ DISASM disasm; @@ -77,7 +77,7 @@ void* DDrPatch_MakeDetour(void* from, vo if (len != UNKNOWN_OPCODE) { if ((disasm.Instruction.Category & 0xffff) == CONTROL_TRANSFER) { if (disasm.Prefix.Number > 0) { - DDrStartupMessage("Daodan: Detour: Branch in trampoline area from address 0x%08x with prefixes", from); + STARTUPMESSAGE("Detour: Branch in trampoline area from address 0x%08x with prefixes", from); return (void*)-1; } branches++; @@ -144,7 +144,7 @@ void* DDrPatch_MakeDetour(void* from, vo } break; default: - DDrStartupMessage("Daodan: Detour: Unknown branch in trampoline area from address 0x%08x", from); + STARTUPMESSAGE("Detour: Unknown branch in trampoline area from address 0x%08x", from); return (void*)-1; } } else { @@ -154,65 +154,72 @@ void* DDrPatch_MakeDetour(void* from, vo disasm.EIP += (UIntPtr)len; } else { - DDrStartupMessage("Daodan: Detour: Unknown opcode in trampoline area from address 0x%08x", from); + STARTUPMESSAGE("Detour: Unknown opcode in trampoline area from address 0x%08x", from); return (void*)-1; } } if (branches > 1) { - DDrStartupMessage("Daodan: Detour: Too many branches in trampoline'd code from address 0x%08x: %d", from, branches); + STARTUPMESSAGE("Detour: Too many branches in trampoline'd code from address 0x%08x: %d", from, branches); return (void*)-1; } DDrPatch_MakeJump(&trampoline[pos], (void*)disasm.EIP); DDrPatch_NOOP(from, (void*)disasm.EIP - from); + + DWORD oldp; + if (!VirtualProtect(trampoline, 40, PAGE_EXECUTE_READWRITE, &oldp)) { + STARTUPMESSAGE("Detour: Could not mark page for trampoline as executable: from address 0x%08x", from); + return (void*)-1; + } DDrPatch_MakeJump(from, to); /* memset (&MyDisasm, 0, sizeof(DISASM)); MyDisasm.EIP = (UIntPtr) trampoline; i = 0; - DDrStartupMessage("Trampoline @ 0x%06x", trampoline); + STARTUPMESSAGE("Trampoline @ 0x%06x", trampoline); while (i<10){ len = Disasm(&MyDisasm); if (len != UNKNOWN_OPCODE) { - DDrStartupMessage(MyDisasm.CompleteInstr); + STARTUPMESSAGE("%s", MyDisasm.CompleteInstr); MyDisasm.EIP += (UIntPtr)len; i++; } }; - DDrStartupMessage(""); + STARTUPMESSAGE("", 0); memset (&MyDisasm, 0, sizeof(DISASM)); MyDisasm.EIP = disasm.EIP; i = 0; - DDrStartupMessage("Orig after @ 0x%06x", disasm.EIP); + STARTUPMESSAGE("Orig after @ 0x%06x", disasm.EIP); while (i<7){ len = Disasm(&MyDisasm); if (len != UNKNOWN_OPCODE) { - DDrStartupMessage(MyDisasm.CompleteInstr); + STARTUPMESSAGE("%s", MyDisasm.CompleteInstr); MyDisasm.EIP += (UIntPtr)len; i++; } }; - DDrStartupMessage(""); + STARTUPMESSAGE("", 0); memset (&MyDisasm, 0, sizeof(DISASM)); MyDisasm.EIP = (UIntPtr) from; i = 0; - DDrStartupMessage("Orig start after @ 0x%06x", from); + STARTUPMESSAGE("Orig start after @ 0x%06x", from); while (i<3){ len = Disasm(&MyDisasm); if (len != UNKNOWN_OPCODE) { - DDrStartupMessage(MyDisasm.CompleteInstr); + STARTUPMESSAGE("%s", MyDisasm.CompleteInstr); MyDisasm.EIP += (UIntPtr)len; i++; } }; - DDrStartupMessage(""); - DDrStartupMessage(""); - DDrStartupMessage(""); - */ + STARTUPMESSAGE("", 0); + STARTUPMESSAGE("", 0); + STARTUPMESSAGE("", 0); +*/ + return trampoline; }