IopLiveDumpProcessCorralStateChange
VOID __stdcall IopLiveDumpProcessCorralStateChange(
_LIVEDUMP_CORRAL_CONTEXT *CorralContext,
_LIVEDUMP_PROCESSOR_PRIVATE_CONTEXT *PrivateContext){
unsigned int v4;
unsigned int v5;
unsigned int v6;
unsigned int v7;
unsigned int v8;
unsigned int v9;
unsigned int v10;
__int16 v11;
UINT64 SpinCount;
LODWORD(SpinCount) = 0;
while( CorralContext[3] == PrivateContext->CurrentState )
KeYieldProcessorEx(&SpinCount);
v4 = CorralContext[3];
PrivateContext->CurrentState = v4;
v5 = v4 - 2;
if( v5 )
{
v6 = v5 - 1;
if( v6 )
{
v7 = v6 - 1;
if( v7 )
{
v8 = v7 - 1;
if( v8 )
{
v9 = v8 - 1;
if( v9 )
{
v10 = v9 - 1;
if( v10 )
{
if( v10 == 1 && *(&PrivateContext->SavedInterruptEnableFlag + 1) )
{
KeRestoreSupervisorState(
(INT64)KeGetCurrentPrcb()->ExtendedSupervisorState,
KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
*(&PrivateContext->SavedInterruptEnableFlag + 1) = 0;
}
}
else if( SaveSupervisorState )
{
KeSaveSupervisorState(
(INT64)KeGetCurrentPrcb()->ExtendedSupervisorState,
KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
*(&PrivateContext->SavedInterruptEnableFlag + 1) = 1;
}
}
else if( PrivateContext->SavedInterruptEnableFlag )
{
_enable();
}
}
else
{
KeResumeClockTimerSafe();
}
}
else
{
IopLiveDumpBufferDumpData(CorralContext, PrivateContext);
}
}
else
{
KeSuspendClockTimerSafe();
}
}
else
{
_disable();
PrivateContext->SavedInterruptEnableFlag = (v11 & 0x200) != 0;
}
_InterlockedIncrement(CorralContext + 4);
}Referenced by:
IopLiveDumpCorralDpc
IopLiveDumpInitiateCorralStateChange