HvpDropPagedBins
NTSTATUS __stdcall HvpDropPagedBins(_HHIVE *Hive){
void *v1;
unsigned int v2;
unsigned int Length;
unsigned int i;
INT64 CellMap;
_BYTE *v7;
__int64 v8;
unsigned __int64 v9;
NTSTATUS v10;
__int64 FreeBin;
void *BugCheckParameter4;
INT64 v14;
v14 = 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((INT64)Hive, i);
v7 = (_BYTE *)CellMap;
if( !CellMap )
KeBugCheckEx(0x51u, 1ui64, (ULONG_PTR)Hive, i, 0x1456ui64);
v8 = *(_QWORD *)(CellMap + 8);
if( (v8 & 8) != 0 )
break;
v9 = v8 & 0xFFFFFFFFFFFFFFF0ui64;
v2 = *(_DWORD *)(v9 + 8);
v10 = HvpAllocateBin((INT64)Hive, v2, 0i64, 0x35324D43ui64, &v14);
if( v10 < 0 )
goto LABEL_11;
memmove((UINT8 *)v14, (UINT8 *)v9, v2);
FreeBin = HvpMapEntryGetFreeBin(v7);
HvpPointMapEntriesToBuffer((UINT64)Hive, v14, v2, i, 1, FreeBin);
v14 = 0i64;
CmpReleaseGlobalQuota(v2);
}
}
if( _InterlockedExchangeAdd(&CmpPreloadedHivesCount, 0xFFFFFFFF) == 1 )
MmFreeBootRegistry();
Hive->HiveFlags &= ~0x10u;
v10 = 0;
LABEL_11:
if( v14 )
HvpFreeBin(Hive, v2, (HSTORAGE_TYPE)v14, v1, BugCheckParameter4);
return v10;
}Referenced by:
CmpLoadHiveThread
CmpMountPreloadedHives