⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdppc.c

📁 See Hanoi.cpp for the implementation of this cla
💻 C
📖 第 1 页 / 共 3 页
字号:
	    // 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 + -