ExBurnMemory
UINT64 __stdcall ExBurnMemory(
_LOADER_PARAMETER_BLOCK *LoaderBlock,
UINT64 NumberOfPagesToBurn,
_TYPE_OF_MEMORY MemoryTypeForRemovedPages,
_MEMORY_ALLOCATION_DESCRIPTOR *NewMemoryDescriptor){
_LIST_ENTRY *p_MemoryDescriptorListHead;
unsigned __int64 v5;
_LIST_ENTRY *Blink;
int Flink;
unsigned __int64 v8;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
v5 = NumberOfPagesToBurn;
Blink = LoaderBlock->MemoryDescriptorListHead.Blink;
while( 1 )
{
Flink = (int)Blink[1].Flink;
if( Flink == 2 || Flink == 5 )
{
v8 = (unsigned __int64)Blink[2].Flink;
if( v8 )
break;
}
LABEL_7:
Blink = Blink->Blink;
if( Blink == p_MemoryDescriptorListHead )
return NumberOfPagesToBurn - v5;
}
if( v8 <= v5 )
{
LODWORD(Blink[1].Flink) = MemoryTypeForRemovedPages;
v5 -= v8;
if( !v5 )
return NumberOfPagesToBurn - v5;
goto LABEL_7;
}
v10 = (_LIST_ENTRY *)(v8 - v5);
Blink[2].Flink = v10;
NewMemoryDescriptor->BasePage = (unsigned __int64)Blink[1].Blink + (unsigned __int64)v10;
NewMemoryDescriptor->PageCount = v5;
NewMemoryDescriptor->MemoryType = MemoryTypeForRemovedPages;
v11 = Blink->Flink;
if( Blink->Flink->Blink != Blink )
__fastfail(3u);
NewMemoryDescriptor->ListEntry.Flink = v11;
v5 = 0i64;
NewMemoryDescriptor->ListEntry.Blink = Blink;
v11->Blink = &NewMemoryDescriptor->ListEntry;
Blink->Flink = &NewMemoryDescriptor->ListEntry;
return NumberOfPagesToBurn - v5;
}Referenced by:
InitBootProcessor