IopLiveDumpPopulateBitmapForDump

VOID __stdcall IopLiveDumpPopulateBitmapForDump(_LIVEDUMP_CONTEXT *Context){
  __int64 v1; 
  _LIVEDUMP_CONTEXT v3; 
  __int64 v4; 
  _RTL_BITMAP_EX *v5; 
  UINT64 v6; 
  _LIVEDUMP_CONTEXT *v7; 
  UINT64 SetBits; 
  UINT64 v9; 
  unsigned __int64 *v10; 
  UINT64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  UINT64 v14; 
  UINT64 v15; 
  __int64 v16; 
  UINT64 NextForwardRunClear; 
  UINT64 v18; 
  _RTL_BITMAP_EX BitMapHeader; 
  UINT64 StartingIndex; 
  UINT64 StartingRunIndex; 
  __int64 v22; 
  INT64 v23; 

  StartingRunIndex = 0i64;
  v23 = 0i64;
  v22 = 0i64;
  v3 = Context[20];
  BitMapHeader = 0i64;
  if( (v3 & 0x80u) != 0 )
  {
    LODWORD(v4) = IopLiveDumpGetMillisecondCounter(0);
    v22 = v4;
  }
  v5 = (_RTL_BITMAP_EX *)(Context + 136);
  v6 = *((_QWORD *)Context + 68);
  v18 = v6;
  IopLiveDumpRemoveSystemCacheFromDump((__int64)Context, v1, &v23);
  v7 = Context + 150;
  if( Context != (_LIVEDUMP_CONTEXT *)-600i64 )
  {
    do
    {
      SetBits = RtlFindSetBitsEx((_RTL_BITMAP_EX *)v7, 1ui64, 0i64);
      if( SetBits != -1i64 )
      {
        do
        {
          NextForwardRunClear = RtlFindNextForwardRunClearEx((_RTL_BITMAP_EX *)v7, SetBits, &StartingRunIndex);
          if( NextForwardRunClear )
            v6 = StartingRunIndex;
          v9 = v6 - SetBits;
          if( (Context[20] & 1) != 0 )
          {
            RtlSetBitsEx(v5, SetBits, v9);
          }
          else
          {
            v10 = (unsigned __int64 *)*((_QWORD *)Context + 69);
            BitMapHeader.SizeOfBitMap = SetBits + v9;
            v11 = SetBits;
            BitMapHeader.Buffer = v10;
            StartingIndex = SetBits;
            do
            {
              v12 = RtlFindNextForwardRunClearEx(&BitMapHeader, v11, &StartingIndex);
              if( !v12 )
                break;
              v13 = *((_QWORD *)Context + 86);
              if( v12 > v13 )
              {
                Context[20] |= 2u;
                v12 = v13;
              }
              v14 = StartingIndex;
              if( v12 )
              {
                RtlSetBitsEx(&BitMapHeader, StartingIndex, v12);
                *((_QWORD *)Context + 86) -= v12;
              }
              if( (Context[20] & 2) != 0 )
                return;
              v11 = v12 + v14;
              StartingIndex = v11;
            }
            while( v11 < SetBits + v9 );
            v5 = (_RTL_BITMAP_EX *)(Context + 136);
          }
          v15 = v9 + NextForwardRunClear;
          v6 = v18;
          SetBits += v15;
        }
        while( SetBits < v18 );
      }
      if( v7 == Context + 150 && (Context[10] & 4) != 0 )
        v7 = Context + 164;
      else
        v7 = 0i64;
    }
    while( v7 );
  }
  if( (Context[20] & 0x80u) != 0 )
  {
    LODWORD(v16) = IopLiveDumpGetMillisecondCounter(0);
    IopLiveDumpTracePopulateBitmapForDumpDuration((_GUID *)Context, v16 - v22, v23);
  }
}

Referenced by:

IopLiveDumpEndMirroringCallback