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