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