📄 mdppc.c
字号:
// end of the scope as the new control PC address and call // the termination handler. if (ScopeTable->ScopeRecord[Index].JumpTarget != 0) { if (TargetPc == ScopeTable->ScopeRecord[Index].JumpTarget) break; } else { DispatcherContext->ControlPc = ScopeTable->ScopeRecord[Index].EndAddress + 4; TerminationHandler = (TERMINATION_HANDLER)ScopeTable->ScopeRecord[Index].HandlerAddress; __C_ExecuteTerminationHandler(TRUE, TerminationHandler, (ULONG)EstablisherFrame); } } } } // Continue search for exception or termination handlers. return ExceptionContinueSearch;}typedef PCONTEXT LPCONTEXT;BOOL DoThreadGetContext(HANDLE hTh, LPCONTEXT lpContext) { PTHREAD pth; if (!(pth = HandleToThread(hTh))) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (lpContext->ContextFlags & ~(CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (pth->pThrdDbg && pth->pThrdDbg->psavedctx) { ULONG ulOldAky = CurAKey; SETCURKEY((DWORD)-1); if (lpContext->ContextFlags & CONTEXT_CONTROL) { lpContext->Msr = pth->pThrdDbg->psavedctx->Msr; lpContext->Iar = pth->pThrdDbg->psavedctx->Iar; lpContext->Lr = pth->pThrdDbg->psavedctx->Lr; lpContext->Ctr = pth->pThrdDbg->psavedctx->Ctr; } if (lpContext->ContextFlags & CONTEXT_INTEGER) { lpContext->Gpr0 = pth->pThrdDbg->psavedctx->Gpr0; lpContext->Gpr1 = pth->pThrdDbg->psavedctx->Gpr1; lpContext->Gpr2 = pth->pThrdDbg->psavedctx->Gpr2; lpContext->Gpr3 = pth->pThrdDbg->psavedctx->Gpr3; lpContext->Gpr4 = pth->pThrdDbg->psavedctx->Gpr4; lpContext->Gpr5 = pth->pThrdDbg->psavedctx->Gpr5; lpContext->Gpr6 = pth->pThrdDbg->psavedctx->Gpr6; lpContext->Gpr7 = pth->pThrdDbg->psavedctx->Gpr7; lpContext->Gpr8 = pth->pThrdDbg->psavedctx->Gpr8; lpContext->Gpr9 = pth->pThrdDbg->psavedctx->Gpr9; lpContext->Gpr10 = pth->pThrdDbg->psavedctx->Gpr10; lpContext->Gpr11 = pth->pThrdDbg->psavedctx->Gpr11; lpContext->Gpr12 = pth->pThrdDbg->psavedctx->Gpr12; lpContext->Gpr13 = pth->pThrdDbg->psavedctx->Gpr13; lpContext->Gpr14 = pth->pThrdDbg->psavedctx->Gpr14; lpContext->Gpr15 = pth->pThrdDbg->psavedctx->Gpr15; lpContext->Gpr16 = pth->pThrdDbg->psavedctx->Gpr16; lpContext->Gpr17 = pth->pThrdDbg->psavedctx->Gpr17; lpContext->Gpr18 = pth->pThrdDbg->psavedctx->Gpr18; lpContext->Gpr19 = pth->pThrdDbg->psavedctx->Gpr19; lpContext->Gpr20 = pth->pThrdDbg->psavedctx->Gpr20; lpContext->Gpr21 = pth->pThrdDbg->psavedctx->Gpr21; lpContext->Gpr22 = pth->pThrdDbg->psavedctx->Gpr22; lpContext->Gpr23 = pth->pThrdDbg->psavedctx->Gpr23; lpContext->Gpr24 = pth->pThrdDbg->psavedctx->Gpr24; lpContext->Gpr25 = pth->pThrdDbg->psavedctx->Gpr25; lpContext->Gpr26 = pth->pThrdDbg->psavedctx->Gpr26; lpContext->Gpr27 = pth->pThrdDbg->psavedctx->Gpr27; lpContext->Gpr28 = pth->pThrdDbg->psavedctx->Gpr28; lpContext->Gpr29 = pth->pThrdDbg->psavedctx->Gpr29; lpContext->Gpr30 = pth->pThrdDbg->psavedctx->Gpr30; lpContext->Gpr31 = pth->pThrdDbg->psavedctx->Gpr31; lpContext->Cr = pth->pThrdDbg->psavedctx->Cr; lpContext->Xer = pth->pThrdDbg->psavedctx->Xer; } if (lpContext->ContextFlags & CONTEXT_FLOATING_POINT) { } if (lpContext->ContextFlags & CONTEXT_DEBUG_REGISTERS) { } SETCURKEY(ulOldAky); } else { if (lpContext->ContextFlags & CONTEXT_CONTROL) { lpContext->Msr = pth->ctx.Msr; lpContext->Iar = pth->ctx.Iar; lpContext->Lr = pth->ctx.Lr; lpContext->Ctr = pth->ctx.Ctr; } if (lpContext->ContextFlags & CONTEXT_INTEGER) { lpContext->Gpr0 = pth->ctx.Gpr0; lpContext->Gpr1 = pth->ctx.Gpr1; lpContext->Gpr2 = pth->ctx.Gpr2; lpContext->Gpr3 = pth->ctx.Gpr3; lpContext->Gpr4 = pth->ctx.Gpr4; lpContext->Gpr5 = pth->ctx.Gpr5; lpContext->Gpr6 = pth->ctx.Gpr6; lpContext->Gpr7 = pth->ctx.Gpr7; lpContext->Gpr8 = pth->ctx.Gpr8; lpContext->Gpr9 = pth->ctx.Gpr9; lpContext->Gpr10 = pth->ctx.Gpr10; lpContext->Gpr11 = pth->ctx.Gpr11; lpContext->Gpr12 = pth->ctx.Gpr12; lpContext->Gpr13 = pth->ctx.Gpr13; lpContext->Gpr14 = pth->ctx.Gpr14; lpContext->Gpr15 = pth->ctx.Gpr15; lpContext->Gpr16 = pth->ctx.Gpr16; lpContext->Gpr17 = pth->ctx.Gpr17; lpContext->Gpr18 = pth->ctx.Gpr18; lpContext->Gpr19 = pth->ctx.Gpr19; lpContext->Gpr20 = pth->ctx.Gpr20; lpContext->Gpr21 = pth->ctx.Gpr21; lpContext->Gpr22 = pth->ctx.Gpr22; lpContext->Gpr23 = pth->ctx.Gpr23; lpContext->Gpr24 = pth->ctx.Gpr24; lpContext->Gpr25 = pth->ctx.Gpr25; lpContext->Gpr26 = pth->ctx.Gpr26; lpContext->Gpr27 = pth->ctx.Gpr27; lpContext->Gpr28 = pth->ctx.Gpr28; lpContext->Gpr29 = pth->ctx.Gpr29; lpContext->Gpr30 = pth->ctx.Gpr30; lpContext->Gpr31 = pth->ctx.Gpr31; lpContext->Cr = pth->ctx.Cr; lpContext->Xer = pth->ctx.Xer; } if (lpContext->ContextFlags & CONTEXT_FLOATING_POINT) { } if (lpContext->ContextFlags & CONTEXT_DEBUG_REGISTERS) { } } return TRUE;}BOOL DoThreadSetContext(HANDLE hTh, const CONTEXT *lpContext) { PTHREAD pth; if (!(pth = HandleToThread(hTh))) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (lpContext->ContextFlags & ~(CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (pth->pThrdDbg && pth->pThrdDbg->psavedctx) { ULONG ulOldAky = CurAKey; SETCURKEY((DWORD)-1); if (lpContext->ContextFlags & CONTEXT_CONTROL) { pth->pThrdDbg->psavedctx->Msr = (pth->pThrdDbg->psavedctx->Msr & 0xfffff9ff) | (lpContext->Msr & 0x00000600); pth->pThrdDbg->psavedctx->Iar = lpContext->Iar; pth->pThrdDbg->psavedctx->Lr = lpContext->Lr; pth->pThrdDbg->psavedctx->Ctr = lpContext->Ctr; } if (lpContext->ContextFlags & CONTEXT_INTEGER) { pth->pThrdDbg->psavedctx->Gpr0 = lpContext->Gpr0; pth->pThrdDbg->psavedctx->Gpr1 = lpContext->Gpr1; pth->pThrdDbg->psavedctx->Gpr2 = lpContext->Gpr2; pth->pThrdDbg->psavedctx->Gpr3 = lpContext->Gpr3; pth->pThrdDbg->psavedctx->Gpr4 = lpContext->Gpr4; pth->pThrdDbg->psavedctx->Gpr5 = lpContext->Gpr5; pth->pThrdDbg->psavedctx->Gpr6 = lpContext->Gpr6; pth->pThrdDbg->psavedctx->Gpr7 = lpContext->Gpr7; pth->pThrdDbg->psavedctx->Gpr8 = lpContext->Gpr8; pth->pThrdDbg->psavedctx->Gpr9 = lpContext->Gpr9; pth->pThrdDbg->psavedctx->Gpr10 = lpContext->Gpr10; pth->pThrdDbg->psavedctx->Gpr11 = lpContext->Gpr11; pth->pThrdDbg->psavedctx->Gpr12 = lpContext->Gpr12; pth->pThrdDbg->psavedctx->Gpr13 = lpContext->Gpr13; pth->pThrdDbg->psavedctx->Gpr14 = lpContext->Gpr14; pth->pThrdDbg->psavedctx->Gpr15 = lpContext->Gpr15; pth->pThrdDbg->psavedctx->Gpr16 = lpContext->Gpr16; pth->pThrdDbg->psavedctx->Gpr17 = lpContext->Gpr17; pth->pThrdDbg->psavedctx->Gpr18 = lpContext->Gpr18; pth->pThrdDbg->psavedctx->Gpr19 = lpContext->Gpr19; pth->pThrdDbg->psavedctx->Gpr20 = lpContext->Gpr20; pth->pThrdDbg->psavedctx->Gpr21 = lpContext->Gpr21; pth->pThrdDbg->psavedctx->Gpr22 = lpContext->Gpr22; pth->pThrdDbg->psavedctx->Gpr23 = lpContext->Gpr23; pth->pThrdDbg->psavedctx->Gpr24 = lpContext->Gpr24; pth->pThrdDbg->psavedctx->Gpr25 = lpContext->Gpr25; pth->pThrdDbg->psavedctx->Gpr26 = lpContext->Gpr26; pth->pThrdDbg->psavedctx->Gpr27 = lpContext->Gpr27; pth->pThrdDbg->psavedctx->Gpr28 = lpContext->Gpr28; pth->pThrdDbg->psavedctx->Gpr29 = lpContext->Gpr29; pth->pThrdDbg->psavedctx->Gpr30 = lpContext->Gpr30; pth->pThrdDbg->psavedctx->Gpr31 = lpContext->Gpr31; pth->pThrdDbg->psavedctx->Cr = lpContext->Cr; pth->pThrdDbg->psavedctx->Xer = lpContext->Xer; } if (lpContext->ContextFlags & CONTEXT_FLOATING_POINT) { } if (lpContext->ContextFlags & CONTEXT_DEBUG_REGISTERS) { } SETCURKEY(ulOldAky); } else { if (lpContext->ContextFlags & CONTEXT_CONTROL) { pth->ctx.Msr = (pth->ctx.Msr & 0xfffff9ff) | (lpContext->Msr & 0x00000600); pth->ctx.Iar = lpContext->Iar; pth->ctx.Lr = lpContext->Lr; pth->ctx.Ctr = lpContext->Ctr; } if (lpContext->ContextFlags & CONTEXT_INTEGER) { pth->ctx.Gpr0 = lpContext->Gpr0; pth->ctx.Gpr1 = lpContext->Gpr1; pth->ctx.Gpr2 = lpContext->Gpr2; pth->ctx.Gpr3 = lpContext->Gpr3; pth->ctx.Gpr4 = lpContext->Gpr4; pth->ctx.Gpr5 = lpContext->Gpr5; pth->ctx.Gpr6 = lpContext->Gpr6; pth->ctx.Gpr7 = lpContext->Gpr7; pth->ctx.Gpr8 = lpContext->Gpr8; pth->ctx.Gpr9 = lpContext->Gpr9; pth->ctx.Gpr10 = lpContext->Gpr10; pth->ctx.Gpr11 = lpContext->Gpr11; pth->ctx.Gpr12 = lpContext->Gpr12; pth->ctx.Gpr13 = lpContext->Gpr13; pth->ctx.Gpr14 = lpContext->Gpr14; pth->ctx.Gpr15 = lpContext->Gpr15; pth->ctx.Gpr16 = lpContext->Gpr16; pth->ctx.Gpr17 = lpContext->Gpr17; pth->ctx.Gpr18 = lpContext->Gpr18; pth->ctx.Gpr19 = lpContext->Gpr19; pth->ctx.Gpr20 = lpContext->Gpr20; pth->ctx.Gpr21 = lpContext->Gpr21; pth->ctx.Gpr22 = lpContext->Gpr22; pth->ctx.Gpr23 = lpContext->Gpr23; pth->ctx.Gpr24 = lpContext->Gpr24; pth->ctx.Gpr25 = lpContext->Gpr25; pth->ctx.Gpr26 = lpContext->Gpr26; pth->ctx.Gpr27 = lpContext->Gpr27; pth->ctx.Gpr28 = lpContext->Gpr28; pth->ctx.Gpr29 = lpContext->Gpr29; pth->ctx.Gpr30 = lpContext->Gpr30; pth->ctx.Gpr31 = lpContext->Gpr31; pth->ctx.Cr = lpContext->Cr; pth->ctx.Xer = lpContext->Xer; } if (lpContext->ContextFlags & CONTEXT_FLOATING_POINT) { } if (lpContext->ContextFlags & CONTEXT_DEBUG_REGISTERS) { } } return TRUE;}//// Walk the HAL KVA Memory Map and find the KVA for// a given physical address.//PVOID Phys2Virt(DWORD pfn){ int i = 0; DWORD va; // Virtual Base Address of section DWORD pa; // Physical Base Address of section DWORD pau; // Physical Address Upper Bound of section DWORD pfnmb; // PFN rounded down to 1MB // // The end of the table is marked by an entry with a ZERO size. // while( OEMMemoryMap[i].Size ) { va = OEMMemoryMap[i].KernelVirtualAddress & 0x1FF00000; pa = OEMMemoryMap[i].PhysicalAddress & 0xFFF00000; pau = pa + (OEMMemoryMap[i].Size << 20) - 1; pfnmb = pfn & 0xfff00000; if ((pfnmb >= pa) && (pfnmb <= pau)) { return ((PVOID) ((pfn - pa) + va + 0x80000000)); } i++; } DEBUGMSG(ZONE_PHYSMEM, (TEXT("Phys2Virt() : PFN (0x%08X) not found!\r\n"), pfn)); return ((PVOID) (pfn | 0xFFF00000));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -