From dce958c74836b2dc7b3022775883e1c0de773d3a Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Sun, 2 Nov 2014 01:45:41 +0100 Subject: [PATCH] fix a bug in MMX get --- TitanEngine/TitanEngine.Debugger.Context.cpp | 40 ++++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp index 390f367..bcc4084 100644 --- a/TitanEngine/TitanEngine.Debugger.Context.cpp +++ b/TitanEngine/TitanEngine.Debugger.Context.cpp @@ -910,35 +910,59 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD } else if(IndexOfRegister == UE_MMX0) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 0)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX1) { - memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 1)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX2) { - memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 2)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX3) { - memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 3)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX4) { - memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 4)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX5) { - memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 5)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX6) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 6)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX7) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 7)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_x87_r0) {