IopLiveDumpMarkRequiredDumpData

__int64 __fastcall IopLiveDumpMarkRequiredDumpData(__int64 a1, __int64 (__fastcall *a2)(_QWORD, __int64, __int64)){
  int v2; 
  INT64 MillisecondCounter; 
  __int64 result; 
  unsigned int v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  INT64 v10; 
  unsigned __int16 *v11[2]; 
  __int16 v12; 
  int v13; 
  __int16 v14; 
  __int64(__fastcall *v15[5])(_QWORD, __int64, __int64); 
  __int64 v16; 
  int v17; 
  v2 = *(_DWORD *)(a1 + 80);
  v15[3] = 0i64;
  v16 = 0i64;
  v13 = 0;
  MillisecondCounter = 0i64;
  v14 = 0;
  v17 = 0;
  if( (v2 & 0x80u) != 0 )
    MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
  LODWORD(v16) = v16 | 1;
  v15[2] = (__int64(__fastcall *)(_QWORD, __int64, __int64))(a1 + 544);
  v15[4] = a2;
  v15[0] = (__int64(__fastcall *)(_QWORD, __int64, __int64))IoSetDumpRange;
  v15[1] = 0i64;
  result = MmAddRangeToCrashDump(v15, (unsigned __int64)&KdDebuggerDataBlock, 896i64);
  if( (int)result >= 0 )
  {
    result = MmAddRangeToCrashDump(v15, (unsigned __int64)&KiProcessorBlock, 8i64 * (unsigned int)KeNumberProcessors_0);
    if( (int)result >= 0 )
    {
      result = IopLiveDumpMarkLoadedModuleList(v15);
      if( (int)result >= 0 )
      {
        v11[1] = (unsigned __int16 *)KeActiveProcessors.Bitmap[0];
        v11[0] = (unsigned __int16 *)&KeActiveProcessors;
        v12 = 0;
        while( !(unsigned int)KeEnumerateNextProcessor(&v17, v11) )
        {
          result = IopLiveDumpMarkProcessorData(v15, v17);
          if( (int)result < 0 )
            return result;
        }
        result = MmAddPrivateDataToCrashDump(v15, 2);
        if( (int)result >= 0 )
        {
          result = MmAddRangeToCrashDump(v15, 0xFFFFF78000000000ui64, 1824i64);
          if( (int)result >= 0 )
          {
            result = MmAddPrivateDataToCrashDump(v15, 4);
            if( (int)result >= 0 )
            {
              result = MmAddPrivateDataToCrashDump(v15, 8);
              v7 = result;
              if( (int)result >= 0 )
              {
                if( *(_DWORD *)a1 != 351
                  || *(_QWORD *)(a1 + 8) != 2i64
                  || (v8 = *(_QWORD *)(a1 + 16), result = MmAddRangeToCrashDump(v15, v8, 56i64), (int)result >= 0)
                  && (result = IopLiveDumpMarkDeviceNode(v15, *(_QWORD *)(v8 + 48)), v7 = result, (int)result >= 0)
                  && ((v9 = *(_QWORD *)(a1 + 32)) == 0
                   || (result = IopLiveDumpMarkDeviceNode(v15, v9), v7 = result, (int)result >= 0)) )
                {
                  if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
                  {
                    v10 = IopLiveDumpGetMillisecondCounter(0);
                    IopLiveDumpTraceMarkRequiredDumpDataDuration((GUID *)a1, v10 - MillisecondCounter);
                  }
                  return v7;
                }
              }
            }
          }
        }
      }
    }
  }
  return result;
}

Referenced by:

IopLiveDumpEndMirroringCallback