IopLiveDumpPopulateBitmapForDump

char __fastcall IopLiveDumpPopulateBitmapForDump(__int64 a1, __int64 a2){
  int v3; 
  INT64 v4; 
  UINT64 v5; 
  UINT64 *v6; 
  UINT64 SetBits; 
  UINT64 v8; 
  INT64 v9; 
  UINT64 v10; 
  UINT64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  int v14; 
  UINT64 v15; 
  INT64 v16; 
  UINT64 NextForwardRunClear; 
  UINT64 v19; 
  INT64 v20[2]; 
  UINT64 v21; 
  UINT64 v22; 
  INT64 MillisecondCounter; 
  INT64 a3; 
  v22 = 0i64;
  a3 = 0i64;
  MillisecondCounter = 0i64;
  v3 = *(_DWORD *)(a1 + 80);
  *(_OWORD *)v20 = 0i64;
  if( (v3 & 0x80u) != 0 )
    MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
  v4 = a1 + 544;
  v5 = *(_QWORD *)(a1 + 544);
  v19 = v5;
  IopLiveDumpRemoveSystemCacheFromDump(a1, a2, &a3);
  v6 = (UINT64 *)(a1 + 600);
  if( a1 != -600 )
  {
    do
    {
      SetBits = RtlFindSetBitsEx(v6, 1ui64, 0i64);
      if( SetBits != -1i64 )
      {
        do
        {
          NextForwardRunClear = RtlFindNextForwardRunClearEx((INT64)v6, SetBits, &v22);
          if( NextForwardRunClear )
            v5 = v22;
          v8 = v5 - SetBits;
          if( (*(_DWORD *)(a1 + 80) & 1) != 0 )
          {
            RtlSetBitsEx(v4, SetBits, v8);
          }
          else
          {
            v9 = *(_QWORD *)(a1 + 552);
            v20[0] = SetBits + v8;
            v10 = SetBits;
            v20[1] = v9;
            v21 = SetBits;
            do
            {
              v11 = RtlFindNextForwardRunClearEx((INT64)v20, v10, &v21);
              if( !v11 )
                break;
              v12 = *(_QWORD *)(a1 + 688);
              if( v11 > v12 )
              {
                *(_DWORD *)(a1 + 80) |= 2u;
                v11 = v12;
              }
              v13 = v21;
              if( v11 )
              {
                RtlSetBitsEx((INT64)v20, v21, v11);
                *(_QWORD *)(a1 + 688) -= v11;
              }
              v14 = *(_DWORD *)(a1 + 80);
              if( (v14 & 2) != 0 )
                return v14;
              v10 = v11 + v13;
              v21 = v10;
            }
            while( v10 < SetBits + v8 );
            v4 = a1 + 544;
          }
          v15 = v8 + NextForwardRunClear;
          v5 = v19;
          SetBits += v15;
        }
        while( SetBits < v19 );
      }
      if( v6 == (UINT64 *)(a1 + 600) && (*(_DWORD *)(a1 + 40) & 4) != 0 )
        v6 = (UINT64 *)(a1 + 656);
      else
        v6 = 0i64;
    }
    while( v6 );
  }
  v14 = *(_DWORD *)(a1 + 80);
  if( (v14 & 0x80u) != 0 )
  {
    v16 = IopLiveDumpGetMillisecondCounter(0);
    LOBYTE(v14) = IopLiveDumpTracePopulateBitmapForDumpDuration((GUID *)a1, v16 - MillisecondCounter, a3);
  }
  return v14;
}

Referenced by:

IopLiveDumpEndMirroringCallback