MxReleaseFreeDescriptor

VOID __stdcall MxReleaseFreeDescriptor(_MX_ALLOCATION_DESCRIPTOR *Md, _TYPE_OF_MEMORY MemoryType){
  int v3; 
  unsigned __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  _MEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor; 

  MemoryDescriptor.ListEntry.Flink = 0i64;
  MemoryDescriptor.ListEntry.Blink = 0i64;
  v3 = 0;
  *((_DWORD *)&MemoryDescriptor.MemoryType + 1) = 0;
  v4 = *(_QWORD *)Md;
  v5 = *((_QWORD *)Md + 3);
  MemoryDescriptor.BasePage = v4;
  MemoryDescriptor.MemoryType = MemoryType;
  if( v5 != -1 )
  {
    MemoryDescriptor.PageCount = v5 - v4 + 512;
    MxCreateFreePfns(&MemoryDescriptor);
    v3 = 1;
  }
  v6 = *((_QWORD *)Md + 2);
  if( v6 != -1 )
  {
    v7 = *(_QWORD *)Md;
    if( (v6 & 0xFFFFFFFFFFFFFE00ui64) > *(_QWORD *)Md )
      v7 = v6 & 0xFFFFFFFFFFFFFE00ui64;
    if( (v6 & 0xFFFFFFFFFFFFFE00ui64) <= *(_QWORD *)Md )
      v3 = 1;
    MemoryDescriptor.BasePage = v7;
    MemoryDescriptor.PageCount = v6 - v7 + 1;
    MxCreateFreePfns(&MemoryDescriptor);
    if( !v3 )
    {
      v8 = *(_QWORD *)Md & 0x1FFi64;
      if( (*(_QWORD *)Md & 0x1FF) != 0 )
      {
        MemoryDescriptor.BasePage = *(_QWORD *)Md;
        MemoryDescriptor.PageCount = 512 - v8;
        MxCreateFreePfns(&MemoryDescriptor);
      }
    }
  }
}

Referenced by:

MiCreateFreePfns