HvpRemapAndEnlistHiveBins

NTSTATUS __stdcall HvpRemapAndEnlistHiveBins(_HHIVE *Hive){
  VOID *v1; 
  char *v2; 
  unsigned int Length; 
  unsigned int v4; 
  char v5; 
  unsigned int v7; 
  unsigned int i; 
  _HBIN *v9; 
  UINT64 v10; 
  unsigned int Size; 
  int v12; 
  int v13; 
  _HMAP_ENTRY *v15; 
  _HBIN *v16; 
  UINT64 v17; 
  unsigned int v18; 
  NTSTATUS Bin; 
  unsigned int j; 
  VOID *v21; 
  VOID *v22; 
  _HHIVE *v23; 
  int v24; 
  _HBIN *Tag; 
  _HBIN **v26; 
  UINT8 v27; 
  _HBIN **v28; 
  unsigned int v29; 
  UINT64 TemporaryBin; 
  INT64 v31; 
  _HMAP_ENTRY *CellMap; 

  v31 = 0i64;
  v2 = 0i64;
  Length = Hive->Storage[0].Length;
  v4 = 0;
  v5 = 0;
  TemporaryBin = 0i64;
  v29 = Length;
  if( (Hive->HiveFlags & 0x20000) != 0 )
    v7 = LODWORD(Hive->ViewMap.StorageEndFileOffset) - 4096;
  else
    v7 = 0;
  for( i = 0; i < v7; Length = v29 )
  {
    CellMap = HvpGetCellMap(Hive, i);
    v9 = (_HBIN *)(CellMap->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
    if( !HvpValidateLoadedBin(v9, i, Length) )
    {
      if( !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
        return -1073741492;
      if( !HvpMarkDirty((ULONG_PTR)Hive, v10, 0x1000ui64, CmHiveDirtyNormal) )
        return -1073741670;
      memset(v9, 0i64, 0x1000u);
      v9->Size = 4096;
      v9->Signature = 1852400232;
      v9->FileOffset = i & 0x7FFFFFFF;
      v5 = 1;
      v9[1].Signature = 4064;
    }
    Size = v9->Size;
    if( Size != 4096 )
    {
      v4 = v9->Size;
      if( i + Size > v7 )
        break;
      v13 = HvpViewMapPromoteRangeToMapping((_XSTATE_CONFIGURATION *)&Hive->ViewMap, i, Size, &v31);
      if( v13 < 0 )
        return v13;
      HvpPointMapEntriesToBuffer(Hive, v31, v4, i, 0, 0i64);
      v9 = (_HBIN *)(CellMap->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
    }
    LOBYTE(v12) = HvpEnlistFreeCells(Hive, v9, i);
    v13 = v12;
    if( v12 == 1073741833 )
    {
      v5 = 1;
    }
    else if( v12 < 0 )
    {
      return v13;
    }
    i += v9->Size;
  }
  while( i < Length )
  {
    v15 = HvpGetCellMap(Hive, i);
    v16 = (_HBIN *)(v15->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
    if( !HvpValidateLoadedBin(v16, i, Length) )
    {
      if( !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
        return -1073741492;
      if( !HvpMarkDirty((ULONG_PTR)Hive, v17, 0x1000ui64, CmHiveDirtyNormal) )
        return -1073741670;
      memset(v16, 0i64, 0x1000u);
      v16->Size = 4096;
      v16->Signature = 1852400232;
      v16->FileOffset = i & 0x7FFFFFFF;
      v5 = 1;
      v16[1].Signature = 4064;
    }
    v18 = v16->Size;
    if( v18 != 4096 )
    {
      v4 = v16->Size;
      Bin = HvpAllocateBin(Hive, v18, 0, 0x31334D43ui64, (UINT64)&TemporaryBin, v26, v28);
      v2 = (char *)TemporaryBin;
      v13 = Bin;
      if( Bin < 0 )
        goto LABEL_12;
      for( j = 0; j < v4; v15->MemAlloc = 0 )
      {
        v15 = HvpGetCellMap(Hive, j + i);
        v21 = (VOID *)(v15->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
        memmove(&v2[j], v21, 0x1000u);
        if( (v15->PermanentBinAddress & 8) != 0 )
          HvpFreeBin(Hive, 0x1000ui64, v21, v22, Tag);
        else
          CmpReleaseGlobalQuota(0x1000u);
        j += 4096;
        v15->BlockOffset = 0i64;
        v15->PermanentBinAddress = 0i64;
      }
      if( !HvIsRangeDirty((INT64)Hive, i, v4) )
      {
        v13 = HvpProtectBin(v23, v4, (_HSTORAGE_TYPE)v2, 0i64, Tag, v27);
        if( v13 < 0 )
          goto LABEL_12;
      }
      HvpPointMapEntriesToBuffer(Hive, (UINT64)v2, v4, i, 1, 0i64);
      v16 = (_HBIN *)(v15->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
      v2 = 0i64;
      TemporaryBin = 0i64;
    }
    LOBYTE(v24) = HvpEnlistFreeCells(Hive, v16, i);
    v13 = v24;
    if( v24 == 1073741833 )
    {
      v5 = 1;
    }
    else if( v24 < 0 )
    {
      return v13;
    }
    i += v16->Size;
    Length = v29;
  }
  if( v5 )
    return 1073741833;
  v13 = 0;
LABEL_12:
  if( v2 )
    HvpFreeBin(Hive, v4, v2, v1, Tag);
  return v13;
}

Referenced by:

No references.