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