KiFreezeTargetExecution
VOID __stdcall KiFreezeTargetExecution(_KTRAP_FRAME *TrapFrame, _KEXCEPTION_FRAME *ExceptionFrame){
__int16 v4;
bool v5;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
__int64 v8;
volatile signed __int32 *v9;
__int64 v10;
volatile signed __int32 *v11;
unsigned __int64 v12;
unsigned __int64 v13;
_EXCEPTION_RECORD result;
int v15;
memset((INT64)&result, 0i64);
if( KiFreezeExecutionLock || KiFreezeLockBackup || (KiBugCheckActive & 3) != 0 )
{
if( ViVerifierEnabled )
VfStopBranchTracing();
v4 = v15;
_disable();
v5 = (v4 & 0x200) != 0;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
CurrentPrcb = KeGetCurrentPrcb();
KeSaveSupervisorState(*((_QWORD *)CurrentPrcb + 216), KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
KiStartDebugAccumulation((__int64)CurrentPrcb);
*((_DWORD *)CurrentPrcb + 2914) = 2;
LOBYTE(v8) = 1;
((void(__fastcall *)(__int64, _QWORD))off_140C00738[0])(v8, 0i64);
if( TrapFrame )
{
KiSaveProcessorState(TrapFrame, (KTRAP_FRAME *)ExceptionFrame);
}
else
{
RtlCaptureContext(*((PCONTEXT *)CurrentPrcb + 4280));
KiSaveProcessorControlState((_KPROCESSOR_STATE *)((char *)CurrentPrcb + 256));
}
v9 = (volatile signed __int32 *)*((_QWORD *)CurrentPrcb + 4247);
if( v9 )
_InterlockedOr(v9, 0x20000u);
KeQueryPerformanceCounter(0i64);
while( (*((_DWORD *)CurrentPrcb + 2914) & 0xF) == 2 )
{
if( CurrentPrcb == (struct _KPRCB *)KiDebuggerOwner )
{
memset((INT64)&result, 0i64);
result.ExceptionCode = -2147483641;
result.ExceptionRecord = &result;
result.ExceptionAddress = *(void **)(*((_QWORD *)CurrentPrcb + 4280) + 248i64);
if( KdpReportExceptionStateChange(&result, *((_CONTEXT **)CurrentPrcb + 4280), 0) != 3 )
KiSetDebuggerOwner(KiFreezeOwner);
}
KiCheckStall(CurrentPrcb, 1u);
}
v11 = (volatile signed __int32 *)*((_QWORD *)CurrentPrcb + 4247);
if( v11 )
_InterlockedAnd(v11, 0xFFFDFFFF);
LOBYTE(v10) = KiResumeForReboot;
((void(__fastcall *)(_QWORD, __int64))off_140C00738[0])(0i64, v10);
if( TrapFrame )
KiRestoreProcessorState(TrapFrame);
else
KiRestoreProcessorControlState((INT64)CurrentPrcb + 256);
v12 = __readcr4();
if( (v12 & 0x20080) != 0 )
{
__writecr4(v12 ^ 0x80);
__writecr4(v12);
}
else
{
v13 = __readcr3();
__writecr3(v13);
}
*((_DWORD *)CurrentPrcb + 2914) = 0;
KiEndDebugAccumulation(CurrentPrcb);
KeRestoreSupervisorState(*((_QWORD *)CurrentPrcb + 216), KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
__writecr8(CurrentIrql);
if( v5 )
_enable();
if( ViVerifierEnabled )
VfStartBranchTracing();
}
}Referenced by:
KiCheckForFreezeExecution