📄 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 + -