IopAddLiveDumpPagesToPartialKernelDump

INT64 __fastcall IopAddLiveDumpPagesToPartialKernelDump(UINT64 BugCheckCode, INT64 a2, UINT64 a3, INT64 a4, UINT64 a5){
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  INT64 result; 
  __int64 v11; 
  _ETW_GUID_ENTRY *v12; 
  UINT64 v13; 
  __int64 *i; 
  _QWORD **v15; 
  _QWORD *v16; 
  __int64 v17[2]; 
  __int128 v18; 
  __int64 v19; 
  _EVENT_HEADER UserEventHeader; 
  int v21; 
  int v22; 
  v22 = HIDWORD(a4);
  *(_QWORD *)&UserEventHeader.EventDescriptor.Id = 0i64;
  v21 = 0;
  v19 = 0i64;
  v7 = BugCheckCode;
  v18 = 0i64;
  v8 = *(_QWORD *)(CrashdmpDumpBlock + 8);
  v9 = *(_QWORD *)(v8 + 48);
  *(_QWORD *)&UserEventHeader.ThreadId = 0i64;
  *(_QWORD *)&UserEventHeader.EventDescriptor.Id = 3i64;
  v17[0] = v9;
  v17[1] = v8 + 56;
  UserEventHeader.TimeStamp.QuadPart = (LONGLONG)v17;
  *(_QWORD *)UserEventHeader.ProviderId.Data4 = &AvailablePagesForPartialDump;
  *(_QWORD *)&UserEventHeader.Size = IoSetDumpRangeForPartialKernelDump;
  *(_QWORD *)&UserEventHeader.ProviderId.Data1 = v8;
  result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)&KdDebuggerDataBlock, 896i64);
  if( (int)result >= 0 )
  {
    result = MmAddRangeToCrashDump(
               &UserEventHeader,
               (unsigned __int64)&KiProcessorBlock,
               8i64 * (unsigned int)KeNumberProcessors_0);
    if( (int)result >= 0 )
    {
      v11 = 0i64;
      if( (_DWORD)KeNumberProcessors_0 )
      {
        while( 1 )
        {
          result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)*(&KiProcessorBlock + v11), 44800i64);
          if( (int)result < 0 )
            break;
          v11 = (unsigned int)(v11 + 1);
          if( (unsigned int)v11 >= (unsigned int)KeNumberProcessors_0 )
            goto LABEL_6;
        }
      }
      else
      {
LABEL_6:
        *((_QWORD *)&v18 + 1) = KeActiveProcessors.Bitmap[0];
        *(_QWORD *)&v18 = &KeActiveProcessors;
        while( !(unsigned int)KeEnumerateNextProcessor(&v21, (unsigned __int16 **)&v18) )
        {
          result = IopMarkPagesForProcessorData(&UserEventHeader, v21);
          if( (int)result < 0 )
            return result;
        }
        result = MmAddPrivateDataToCrashDump(&UserEventHeader, 2);
        if( (int)result >= 0 )
        {
          result = MmAddRangeToCrashDump(&UserEventHeader, 0xFFFFF78000000000ui64, 1824i64);
          if( (int)result >= 0 )
          {
            result = MmAddPrivateDataToCrashDump(&UserEventHeader, 4);
            if( (int)result >= 0 )
            {
              result = MmAddPrivateDataToCrashDump(&UserEventHeader, 8);
              if( (int)result >= 0 )
              {
                if( !MmPhysicalMemoryBlock
                  || (result = MmAddRangeToCrashDump(
                                 &UserEventHeader,
                                 (unsigned __int64)MmPhysicalMemoryBlock,
                                 16 * ((unsigned int)(*(_DWORD *)MmPhysicalMemoryBlock - 1) + 2i64)),
                      (int)result >= 0) )
                {
                  result = MmAddPrivateDataToCrashDump(&UserEventHeader, 32);
                  if( (int)result >= 0 )
                  {
                    if( v7 != 351 || a2 != 2 )
                      goto LABEL_24;
                    result = MmAddRangeToCrashDump(&UserEventHeader, a3, 56i64);
                    if( (int)result < 0 )
                      return result;
                    if( (unsigned int)IopMarkPagesForDeviceNode(&UserEventHeader, *(_QWORD *)(a3 + 48)) == -1073741789 )
                      return 3221225507i64;
                    v12 = (_ETW_GUID_ENTRY *)a5;
                    if( !a5 || (result = IopMarkPagesForDeviceNode(&UserEventHeader, a5), (int)result >= 0) )
                    {
LABEL_24:
                      LOBYTE(result) = ExAddPrivateDataToCrashDump(&UserEventHeader, v12, v13);
                      if( (int)result >= 0 )
                      {
                        for( i = (__int64 *)PsActiveProcessHead; i != &PsActiveProcessHead; i = (__int64 *)*i )
                        {
                          v15 = (_QWORD **)(i + 51);
                          v16 = *v15;
                          result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)(i - 137), 2624i64);
                          if( (int)result < 0 )
                            return result;
                          while( v16 != v15 )
                          {
                            result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)(v16 - 157), 2200i64);
                            if( (int)result < 0 )
                              return result;
                            result = MmAddRangeToCrashDump(&UserEventHeader, *(v16 - 151), *(v16 - 150) - *(v16 - 151));
                            if( (int)result < 0 )
                              return result;
                            v16 = (_QWORD *)*v16;
                          }
                        }
                        result = MmAddPrivateDataToCrashDump(&UserEventHeader, 16);
                        if( (int)result >= 0 )
                        {
                          IopDumpCallAddPagesCallbacks(v7);
                          IoSaveBugCheckProgress(0x21ui64);
                          return MmAddPrivateDataToCrashDump(&UserEventHeader, 1);
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return result;
}

Referenced by:

IoAddPagesForPartialKernelDump