IopLiveDumpGetCapturePagesNoLock

VOID __stdcall IopLiveDumpGetCapturePagesNoLock(
        _RTL_BITMAP *BitMap,
        _LIVEDUMP_BUFFER_DESCRIPTOR *BufferDescriptor,
        UINT64 *PfnArrary,
        UINT64 *PageCount,
        UINT64 *ChunkIndex){
  UINT64 v5; 
  UINT64 v6; 
  unsigned int v7; 
  _LIVEDUMP_BUFFER_DESCRIPTOR v11; 
  char v12; 
  UINT64 SetBits; 
  __int64 v14; 
  __int64 v15; 
  _QWORD *v16; 

  v5 = -1i64;
  v6 = *((_QWORD *)BufferDescriptor + 6);
  v7 = (unsigned int)PageCount;
  *(_DWORD *)ChunkIndex = 0;
  if( v6 != -1i64 )
  {
    v11 = 0;
    v12 = 1;
    if( (_DWORD)PageCount )
    {
      while( 1 )
      {
        SetBits = RtlFindSetBitsEx((_RTL_BITMAP_EX *)BitMap, 1ui64, v6);
        if( SetBits < v6 || SetBits == -1i64 )
          break;
        v14 = *(unsigned int *)ChunkIndex;
        v6 = SetBits + 1;
        PfnArrary[v14] = SetBits;
        v11 = v14 + 1;
        *(_DWORD *)ChunkIndex = v14 + 1;
        if( (int)v14 + 1 >= v7 )
          goto LABEL_8;
      }
      v11 = *(_DWORD *)ChunkIndex;
      v12 = 0;
    }
LABEL_8:
    if( v12 )
      v5 = PfnArrary[v11 - 1] + 1;
  }
  *((_QWORD *)BufferDescriptor + 6) = v5;
  if( *(_DWORD *)ChunkIndex )
  {
    v15 = *((_QWORD *)BufferDescriptor + 7);
    BufferDescriptor[10] = *(_DWORD *)ChunkIndex;
    *v16 = v15;
    *((_QWORD *)BufferDescriptor + 7) = v15 + 1;
  }
}

Referenced by:

IopLiveDumpBufferDumpData
IopLiveDumpGetNtMergePages