IopLiveDumpCorralProcessors
VOID __stdcall IopLiveDumpCorralProcessors(_LIVEDUMP_CORRAL_CONTEXT *CorralContext){
_GUID *v1;
__int64 v2;
__int64 v4;
__int64 v5;
unsigned __int8 CurrentIrql;
int v7;
_LIVEDUMP_CORRAL_CONTEXT v8;
unsigned int Data1;
__int64 v10;
__int64 v11;
_GROUP_AFFINITY Affinity;
_KAFFINITY_ENUMERATION_CONTEXT Context;
UINT64 ProcIndex;
UINT64 SpinCount;
__int64 v16;
__int64 v17;
v1 = *(_GUID **)CorralContext;
v2 = 0i64;
CorralContext[2] = 0;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
LODWORD(ProcIndex) = 0;
v4 = 0i64;
LODWORD(SpinCount) = 0;
v17 = 0i64;
v16 = 0i64;
CorralContext[3] = 0;
CorralContext[4] = 0;
CorralContext[5] = 0;
*((_QWORD *)CorralContext + 14) = 0i64;
CorralContext[30] = 0;
IopLiveDumpLockPages();
Affinity.Group = (unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6;
*(_DWORD *)Affinity.Reserved = 0;
Affinity.Reserved[2] = 0;
Affinity.Mask = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
KeSetSystemGroupAffinityThread(&Affinity, (PGROUP_AFFINITY)CorralContext + 6);
*((_QWORD *)CorralContext + 14) = 0i64;
CorralContext[3] = 1;
IopLiveDumpTraceSystemQuiesceStart((_LIVEDUMP_CONTEXT *)v1);
if( (v1[5].Data1 & 0x80u) != 0 )
{
LODWORD(v5) = IopLiveDumpGetMillisecondCounter(0);
v4 = v5;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
*((_BYTE *)CorralContext + 88) = CurrentIrql;
KeInitializeDpc((PRKDPC)(CorralContext + 6), (PKDEFERRED_ROUTINE)IopLiveDumpCorralDpc, CorralContext);
*((_BYTE *)CorralContext + 25) = 2;
Context.CurrentMask = KeActiveProcessors.Bitmap[0];
Context.Affinity = &KeActiveProcessors;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v7 )
break;
if( (_DWORD)ProcIndex == CorralContext[28] )
{
_InterlockedAdd(CorralContext + 4, 1u);
}
else
{
v8 = CorralContext[4];
if( !*((_QWORD *)CorralContext + 10) )
*((_WORD *)CorralContext + 13) = ProcIndex + 1280;
KeInsertQueueDpc((UINT64)(CorralContext + 6), 0i64, 0i64);
LODWORD(SpinCount) = 0;
while( v8 == CorralContext[4] )
KeYieldProcessorEx(&SpinCount);
}
}
CorralContext[5] = CorralContext[4];
Data1 = v1[5].Data1;
if( (Data1 & 0x80u) != 0 )
{
LODWORD(v10) = IopLiveDumpGetMillisecondCounter(0);
v11 = v10;
Data1 = v1[5].Data1;
v2 = v11 - v4;
}
if( (Data1 & 0x100) == 0 )
IopLiveDumpInitiateCorralStateChange(CorralContext, 2ui64);
PoAllProcIntrDisabled = 1;
IopLiveDumpInitiateCorralStateChange(CorralContext, 7ui64);
IopLiveDumpInitiateCorralStateChange(CorralContext, 3ui64);
CorralContext[2] |= 1u;
if( (v1[5].Data1 & 0x80u) != 0 )
IopLiveDumpTraceCorralProcessorsDuration(*(_GUID **)CorralContext, v2, 0i64, v17, v16);
}Referenced by:
IopLiveDumpEndMirroringCallback