HvpDropPagedBins
NTSTATUS __stdcall HvpDropPagedBins(_HHIVE *Hive){
VOID *v1;
size_t v2;
unsigned int Length;
unsigned int i;
_HMAP_ENTRY *CellMap;
_HMAP_ENTRY *v7;
unsigned __int64 PermanentBinAddress;
_DWORD *v9;
int Bin;
__int64 FreeBin;
VOID *Tag;
_HBIN **a6;
_HBIN **v15;
UINT64 a2;
a2 = 0i64;
v2 = 0;
if( (Hive->HiveFlags & 0x10) == 0 )
return 0;
Length = Hive->Storage[0].Length;
if( Length )
{
for( i = 0; i < Length; i += v2 )
{
CellMap = HvpGetCellMap(Hive, i);
v7 = CellMap;
if( !CellMap )
KeBugCheckEx(0x51u, (PVOID)1, Hive, (PVOID)i, (PVOID)0x1456);
PermanentBinAddress = CellMap->PermanentBinAddress;
if( (PermanentBinAddress & 8) != 0 )
break;
v9 = (_DWORD *)(PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
v2 = v9[2];
Bin = HvpAllocateBin(Hive, v2, 0, 0x35324D43ui64, (UINT64)&a2, a6, v15);
if( Bin < 0 )
goto LABEL_11;
memmove((VOID *)a2, v9, v2);
FreeBin = HvpMapEntryGetFreeBin(v7);
HvpPointMapEntriesToBuffer(Hive, a2, v2, i, 1, FreeBin);
a2 = 0i64;
CmpReleaseGlobalQuota(v2);
}
}
if( _InterlockedExchangeAdd(&CmpPreloadedHivesCount, 0xFFFFFFFF) == 1 )
MmFreeBootRegistry();
Hive->HiveFlags &= ~0x10u;
Bin = 0;
LABEL_11:
if( a2 )
HvpFreeBin(Hive, v2, (VOID *)a2, v1, Tag);
return Bin;
}Referenced by:
CmpLoadHiveThread
CmpMountPreloadedHives