MiReturnMdlExcess
VOID __stdcall MiReturnMdlExcess(INT64 rcx0){
unsigned int *v1;
_MI_PARTITION *v3;
unsigned __int64 v4;
UINT64 v5;
UINT64 v6;
int v7;
_MI_PFN_CACHE_ATTRIBUTE v8;
UINT64 v9;
_WORD *Pool;
_WORD *v11;
UINT64 v12;
v1 = *(unsigned int **)(rcx0 + 64);
v3 = *(_MI_PARTITION **)rcx0;
v4 = (unsigned __int64)v1[10] >> 12;
v5 = *(_QWORD *)(rcx0 + 40) - v4;
MiReleaseNonPagedResources(*(_MI_PARTITION **)rcx0, v5);
if( v3 == &Irp )
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 569, -(__int64)v5);
if( !v4 )
goto LABEL_4;
v7 = *(_DWORD *)(rcx0 + 8);
if( (v7 & 4) != 0 )
{
if( (v7 & 0x40) == 0 )
{
MiInitializeMdlBatchPages(rcx0);
MiInitializeMdlPages((ULONG_PTR)v1, *(unsigned int *)(rcx0 + 8), v8, v9, v12);
}
MiFreePagesFromMdl(v1, 0i64, v6);
LABEL_4:
ExFreePoolWithTag(v1, 0);
*(_QWORD *)(rcx0 + 64) = 0i64;
return;
}
if( v5 > 0x800 )
{
Pool = MiAllocatePool(64i64, 8 * v4 + 48, 0x69646D4Dui64);
v11 = Pool;
if( Pool )
{
*(_QWORD *)Pool = 0i64;
Pool[4] = 8 * (v4 + 6);
*((_DWORD *)Pool + 10) = (_DWORD)v4 << 12;
Pool[5] = 0;
*((_QWORD *)Pool + 4) = 0i64;
*((_DWORD *)Pool + 11) = 0;
memmove(Pool + 24, (const VOID *)(*(_QWORD *)(rcx0 + 64) + 48i64), 8 * v4);
ExFreePoolWithTag(*(PVOID *)(rcx0 + 64), 0);
*(_QWORD *)(rcx0 + 64) = v11;
}
}
}Referenced by:
MiAllocatePagesForMdl