HvUnCOWReconciledPages

VOID __stdcall HvUnCOWReconciledPages(INT64 a1){
  _RTL_BITMAP *v2; 
  unsigned int SizeOfBitMap; 
  __int64 v4; 
  int *v5; 
  int v6; 
  int v7; 
  _ETHREAD *v8; 
  unsigned int v9; 
  unsigned int *Buffer; 
  unsigned int v11; 
  unsigned int *v12; 
  int v13; 
  int v14; 
  unsigned int i; 
  unsigned int v16; 
  INT64 v17; 
  unsigned int v18; 
  unsigned int *v19; 
  unsigned int *v20; 
  unsigned int *v21; 
  int v22; 
  int v23; 
  unsigned int j; 
  unsigned int *v25; 
  unsigned int *v26; 

  if( (*(_DWORD *)(a1 + 160) & 0x20000) != 0 )
  {
    v2 = (_RTL_BITMAP *)(a1 + 1728);
    if( *(struct _KTHREAD **)(a1 + 4232) == KeGetCurrentThread() )
      RtlMergeBitMaps((_RTL_BITMAP *)(a1 + 1728), (_RTL_BITMAP *)(a1 + 1680));
    SizeOfBitMap = v2->SizeOfBitMap;
    v4 = 0i64;
    while( SizeOfBitMap )
    {
      v5 = (int *)&v2->Buffer[v4];
      v6 = *v5;
      if( SizeOfBitMap < 0x20 )
      {
        v22 = 1 << SizeOfBitMap;
        SizeOfBitMap = 0;
        v7 = (v22 - 1) ^ v6;
      }
      else
      {
        SizeOfBitMap -= 32;
        v7 = ~v6;
      }
      *v5 = v7;
      v4 = (unsigned int)(v4 + 1);
    }
    RtlMergeBitMaps(v2, (_RTL_BITMAP *)(a1 + 88));
    RtlMergeBitMaps(v2, (_RTL_BITMAP *)(a1 + 112));
    v8 = *(_ETHREAD **)(a1 + 4232);
    if( v8 && v8 != (_ETHREAD *)KeGetCurrentThread() )
      RtlMergeBitMaps(v2, (_RTL_BITMAP *)(a1 + 1680));
    v9 = v2->SizeOfBitMap;
    if( v2->SizeOfBitMap )
    {
      Buffer = v2->Buffer;
      v11 = 0;
      v12 = &Buffer[(unsigned __int64)(v9 - 1) >> 5];
      if( Buffer != v12 && *Buffer == -1 )
      {
        v11 = 32;
        for( ++Buffer; Buffer < v12 && *Buffer == -1; ++Buffer )
          v11 += 32;
      }
      for( ; v11 < v9; ++v11 )
      {
        if( !_bittest((const signed __int32 *)v2->Buffer, v11) )
          break;
      }
      v13 = 0;
      if( Buffer != v12 )
      {
        v14 = v11 & 0x1F;
        if( (*Buffer & ~*((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == 0 )
        {
          v13 = 32 - v14;
          if( v14 == 33 )
            goto LABEL_26;
          v26 = Buffer + 1;
          while( v26 < v12 && !*v26 )
          {
            ++v26;
            v13 += 32;
            if( v13 == -1 )
              goto LABEL_26;
          }
        }
      }
      for( i = v13 + v11; i < v2->SizeOfBitMap; ++v13 )
      {
        if( _bittest((const signed __int32 *)v2->Buffer, i) )
          break;
        if( v13 == -1 )
          break;
        ++i;
      }
      while( 1 )
      {
        while( 1 )
        {
LABEL_26:
          if( !v13 )
            return;
          v16 = ((v11 << 9) + (v13 << 9)) & 0xFFFFF000;
          v17 = ((v11 << 9) + 4095) & 0xFFFFF000;
          if( (_DWORD)v17 != v16 )
            HvpViewMapUnCOWAndSealRange(a1 + 216, v17, v16 - (unsigned int)v17);
          v18 = v2->SizeOfBitMap;
          v11 += v13;
          if( v2->SizeOfBitMap <= v11 )
            return;
          v19 = v2->Buffer;
          v20 = &v19[(unsigned __int64)(v18 - 1) >> 5];
          v21 = &v19[(unsigned __int64)v11 >> 5];
          if( v21 != v20 && (*v21 | *((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == -1 )
          {
            v11 = v11 - (v11 & 0x1F) + 32;
            for( ++v21; v21 < v20 && *v21 == -1; ++v21 )
              v11 += 32;
          }
          for( ; v11 < v18; ++v11 )
          {
            if( !_bittest((const signed __int32 *)v2->Buffer, v11) )
              break;
          }
          v13 = 0;
          if( v21 != v20 )
          {
            v23 = v11 & 0x1F;
            if( (*v21 & ~*((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == 0 )
              break;
          }
LABEL_42:
          for( j = v13 + v11; j < v2->SizeOfBitMap; ++v13 )
          {
            if( _bittest((const signed __int32 *)v2->Buffer, j) )
              break;
            if( v13 == -1 )
              break;
            ++j;
          }
        }
        v13 = 32 - v23;
        if( v23 != 33 )
        {
          v25 = v21 + 1;
          while( v25 < v20 && !*v25 )
          {
            ++v25;
            v13 += 32;
            if( v13 == -1 )
              goto LABEL_26;
          }
          goto LABEL_42;
        }
      }
    }
  }
}

Referenced by:

CmpFlushHive