MiFreePagesFromMdl

VOID __stdcall MiFreePagesFromMdl(MDL *MemoryDescriptorList, UINT64 Flags){
  __int16 MdlFlags; 
  int v4; 
  UINT64 ByteCount; 
  void *MappedSystemVa; 
  PVOID v7; 
  __int64 v8; 
  UINT64 *v9; 
  unsigned __int64 i; 
  void *v11; 
  void *v12; 
  __int16 v13; 
  ULONG_PTR *v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  UINT64 v17; 
  int v18; 
  ULONG_PTR v19; 
  __int64 v20; 
  char *v21; 
  unsigned __int64 v22; 
  ULONG_PTR *v23; 
  unsigned __int8 v24; 
  unsigned int v25; 
  int v26; 
  _QWORD *v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  __int64 v30; 
  UINT64 v31; 
  UINT64 *v32; 
  __int64 v33; 
  ULONG_PTR *v34; 
  ULONG_PTR *v35; 
  __int64 v36; 
  ULONG_PTR *v37; 
  UINT8 OldIrql; 
  UINT64 Flagsa; 
  char *v40; 
  int v41; 
  LODWORD(Flagsa) = Flags;
  MdlFlags = MemoryDescriptorList->MdlFlags;
  OldIrql = 0;
  v34 = 0i64;
  v4 = 1;
  v41 = 1;
  if( (MdlFlags & 0x200) != 0 )
  {
    LODWORD(Flagsa) = Flags & 0xFFFFFFFE;
    MiRetardMdl(MemoryDescriptorList);
    goto LABEL_11;
  }
  if( (Flags & 1) != 0 )
  {
    if( (MdlFlags & 1) != 0 )
    {
      ByteCount = MemoryDescriptorList->ByteCount;
      MappedSystemVa = MemoryDescriptorList->MappedSystemVa;
LABEL_8:
      KeZeroPages(MappedSystemVa, ByteCount);
      goto LABEL_11;
    }
    v7 = MmMapLockedPagesSpecifyCache(MemoryDescriptorList, 0, MmCached, 0i64, 0, 0x40000020u);
    v8 = MemoryDescriptorList->ByteCount;
    if( v7 )
    {
      ByteCount = (unsigned int)v8;
      MappedSystemVa = v7;
      goto LABEL_8;
    }
    v9 = (UINT64 *)&MemoryDescriptorList[1];
    for( i = ((unsigned __int64)((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)
             + v8
             + 4095) >> 12; i; --i )
    {
      LODWORD(v11) = MiMapPageInHyperSpaceWorker(*v9, &OldIrql, 0x80000000ui64);
      v12 = v11;
      KeZeroPages(v11, 0x1000ui64);
      MiUnmapPageInHyperSpaceWorker(v12, OldIrql, 0x80000000ui64);
      ++v9;
    }
  }
LABEL_11:
  v13 = MemoryDescriptorList->MdlFlags;
  if( (v13 & 1) != 0 )
  {
    MmUnmapLockedPages(MemoryDescriptorList->MappedSystemVa, MemoryDescriptorList);
    v13 = MemoryDescriptorList->MdlFlags;
  }
  if( (v13 & 0x801) != 0 )
    KeBugCheckEx(0x1Au, 0x1238ui64, (ULONG_PTR)MemoryDescriptorList, v13, 0i64);
  v14 = (ULONG_PTR *)&MemoryDescriptorList[1];
  v15 = 0i64;
  v16 = (((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)
       + (unsigned __int64)MemoryDescriptorList->ByteCount
       + 4095) >> 12;
  v17 = 0i64;
  v18 = 1;
  if( !v16 )
    goto LABEL_57;
  do
  {
    v19 = *v14;
    v37 = v14;
    v20 = 48 * *v14;
    v36 = v20;
    v21 = (char *)MmGetPfnDb() + v20;
    v22 = *((_QWORD *)v21 + 5);
    v40 = v21;
    if( (v22 & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64 )
      KeBugCheckEx(0x1Au, 0x1236ui64, (ULONG_PTR)MemoryDescriptorList, (ULONG_PTR)v14, v19);
    v23 = *(ULONG_PTR **)(qword_140C4E388 + 8 * ((v22 >> 39) & 0x3FF));
    v35 = v23;
    if( ((v22 >> 60) & 7) == 3 )
    {
      v24 = MiLockPageInline((INT64)v21);
      v21 = v40;
      *((_QWORD *)v40 + 5) &= 0x8FFFFFFFFFFFFFFFui64;
      _InterlockedAnd64((volatile signed __int64 *)v21 + 3, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v24);
      _InterlockedDecrement64(&qword_140C4DD40);
      v4 = v41;
      v20 = v36;
      v23 = v35;
    }
    if( v17 )
    {
      LODWORD(v40) = 0;
      if( v34 != v23 )
      {
        v26 = 1;
        goto LABEL_42;
      }
      v27 = (_QWORD *)qword_140C4EBC0;
      if( qword_140C4EBC0 && ((*((_QWORD *)v21 + 5) >> 60) & 7) == 1 )
      {
        v28 = v20 / 48;
        while( v27 )
        {
          v29 = v27[3];
          if( v28 < v29 )
          {
            v27 = (_QWORD *)*v27;
          }
          else
          {
            if( v28 - v29 < v27[4] )
              goto LABEL_41;
            v27 = (_QWORD *)v27[1];
          }
        }
      }
      if( (unsigned __int8)v21[34] >> 6 == v4 )
      {
        v30 = *(v14 - 1);
        if( *v14 == v30 + 1 )
        {
          if( v17 != 1 && v18 != 1 )
          {
            v26 = (int)v40;
            goto LABEL_45;
          }
          v18 = 1;
LABEL_36:
          ++v17;
          goto LABEL_54;
        }
        if( *v14 == v30 - 1 && (v17 == 1 || !v18) )
        {
          v18 = 0;
          goto LABEL_36;
        }
      }
LABEL_41:
      v26 = (int)v40;
LABEL_42:
      if( v18 == 1 )
      {
        v31 = v14[-v17];
LABEL_46:
        v15 += MiFreeMdlPageRun(v31, v17, (unsigned int)Flagsa);
        if( v26 )
        {
          if( v15 )
          {
            if( v34 == &MiSystemPartition )
              _InterlockedExchangeAdd64(&qword_140C4ECF8, -v15);
            v15 = 0i64;
          }
          v34 = v35;
        }
        v17 = 1i64;
        v25 = *((unsigned __int8 *)MmGetPfnDb() + v36 + 34);
        goto LABEL_53;
      }
LABEL_45:
      v31 = *(v14 - 1);
      goto LABEL_46;
    }
    v25 = (unsigned __int8)v21[34];
    v17 = 1i64;
    v34 = v23;
LABEL_53:
    v4 = v25 >> 6;
    v41 = v4;
LABEL_54:
    ++v14;
    --v16;
  }
  while( v16 );
  if( v18 == 1 )
  {
LABEL_57:
    v32 = &v14[-v17];
    goto LABEL_58;
  }
  v32 = v37;
LABEL_58:
  v33 = MiFreeMdlPageRun(*v32, v17, (unsigned int)Flagsa) + v15;
  if( v33 && v34 == &MiSystemPartition )
    _InterlockedExchangeAdd64(&qword_140C4ECF8, -v33);
  MemoryDescriptorList->MdlFlags &= ~2u;
}

Referenced by:

BgpFwAllocateMemory
EtwpAllocatePartitionMemory
EtwpAllocateTraceBuffer
EtwpFreePartitionMemory
EtwpFreeTraceBuffer
HalAllocateCommonBufferVector
HalFreeCommonBufferThin
HalFreeCommonBufferVector
HalpAllocateCommonBufferThin
HalpDmaAllocateMapRegisters
HalpDmaFreeChildAdapter
KiComputeNumaCosts
MiAllocatePartitionPhysicalPages
MiAllocateUserPhysicalPages
MiFreeCombineMdls
MiFreePhysicalPageChain
MiReturnMdlExcess
MmFreePagesFromMdl
MmFreePagesFromMdlEx
NtFreeUserPhysicalPages
PpmHeteroInitializeHgsSupport
ST_STORE::StDmLazyRegionsWorker
ST_STORE::StReleaseRegion