MmBuildMdlForNonPagedPool
VOID __stdcall MmBuildMdlForNonPagedPool(_MDL *MemoryDescriptorList){
unsigned __int64 StartVa;
_MDL *v2;
ULONG_PTR v3;
char *v4;
unsigned __int64 v6;
int v7;
ULONG_PTR v8;
int v9;
unsigned __int64 v10;
char *v11;
_MMPTE *Pml4eBase;
__int16 MdlFlags;
_MMPTE *PteBase;
int v15;
__int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
_QWORD *v22;
INT64 BugCheckParameter4;
unsigned __int64 v24;
int v25;
__int64 v26;
INT64 *v27;
INT64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
__int64 i;
__int16 v32;
__int64 v33;
__int64 v34[4];
__int64 v35[14];
int SystemRegionType;
INT64 v37;
UINT64 v38;
unsigned __int64 v39;
StartVa = (unsigned __int64)MemoryDescriptorList->StartVa;
v2 = MemoryDescriptorList + 1;
v3 = 0i64;
v4 = (char *)(StartVa + MemoryDescriptorList->ByteOffset);
MemoryDescriptorList->Process = 0i64;
MemoryDescriptorList->MappedSystemVa = v4;
v38 = 0i64;
v6 = -1i64;
v7 = 0;
v8 = (ULONG_PTR)MmGetPteBase() + ((StartVa >> 9) & 0x7FFFFFFFF8i64);
v9 = 0;
SystemRegionType = 0;
v10 = v8 + 8 * ((((unsigned __int16)v4 & 0xFFF) + (unsigned __int64)MemoryDescriptorList->ByteCount + 4095) >> 12);
v39 = v10;
if( v8 < v10 )
{
v11 = (char *)MmGetPfnDb() + 40;
do
{
Pml4eBase = MmGetPml4eBase();
if( v7 )
{
if( v7 < 2 )
goto LABEL_5;
LABEL_19:
if( (v3 & 1) == 0 )
KeBugCheckEx(0x1Au, 0x1240ui64, (ULONG_PTR)MemoryDescriptorList, v8, v3);
if( v7 == 3 )
MiSetNonPagedPoolNoSteal((_MMPTE *)v8, (UINT64)Pml4eBase);
BugCheckParameter4 = MI_READ_PTE_LOCK_FREE(v8);
v38 = BugCheckParameter4;
v24 = BugCheckParameter4;
v3 = BugCheckParameter4;
if( (BugCheckParameter4 & 1) == 0 )
KeBugCheckEx(0x1Au, 0x1241ui64, (ULONG_PTR)MemoryDescriptorList, v8, BugCheckParameter4);
MiPteInShadowRange((UINT64)&v38);
v6 = (v24 >> 12) & 0xFFFFFFFFFi64;
if( v9 == 12 )
MiQueuePinDriverAddressLog((__int64)((v8 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v3, 1ui64);
}
else
{
PteBase = MmGetPteBase();
v15 = 4;
v16 = 4i64;
v17 = (__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v18 = (unsigned __int64)PteBase + ((v17 >> 9) & 0x7FFFFFFFF8i64);
v34[1] = v18;
v19 = (unsigned __int64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
v34[2] = v19;
v20 = (unsigned __int64)PteBase + ((v19 >> 9) & 0x7FFFFFFFF8i64);
v34[3] = v20;
v21 = (__int64)PteBase + ((v20 >> 9) & 0x7FFFFFFFF8i64);
v35[0] = v21;
while( 1 )
{
v22 = (_QWORD *)v34[v16--];
--v15;
if( (*v22 & 1) == 0 )
goto LABEL_17;
if( (*v22 & 0x80u) != 0i64 )
break;
if( v16 == 1 )
goto LABEL_17;
}
if( !v15 )
{
LABEL_17:
v3 = MI_READ_PTE_LOCK_FREE(v8);
SystemRegionType = MiGetSystemRegionType(v17);
v9 = SystemRegionType;
if( SystemRegionType == 5 )
v7 = 3;
else
v7 = 2;
goto LABEL_19;
}
v35[4] = v21;
v25 = 4;
v35[2] = v19;
v26 = 4i64;
v35[1] = v18;
v35[3] = v20;
do
{
v27 = (INT64 *)v35[v26--];
--v25;
v28 = *v27;
v37 = *v27;
}
while( v26 && (v28 & 0x80u) == 0i64 );
v29 = MI_READ_PTE_LOCK_FREE((INT64)&v37);
v10 = v39;
v6 = (v29 >> 12) & 0xFFFFFFFFFi64;
if( v26 )
{
v30 = v17 >> 12;
for( i = 1i64; v25; --v25 )
{
v32 = v30;
v30 >>= 9;
v33 = i * (v32 & 0x1FF);
i <<= 9;
v6 += v33;
}
}
v3 = v38;
v7 = 1;
v9 = SystemRegionType;
}
v11 = (char *)MmGetPfnDb() + 40;
LABEL_5:
v2->Next = (_MDL *)v6;
MdlFlags = MemoryDescriptorList->MdlFlags;
if( (MdlFlags & 0x800) == 0 && (v6 > 0xFFFFFFFFFi64 || ((*(_QWORD *)&v11[48 * v6] >> 50) & 1) == 0) )
MemoryDescriptorList->MdlFlags = MdlFlags | 0x800;
v2 = (_MDL *)((char *)v2 + 8);
v8 += 8i64;
if( (v8 & 0xFFF) != 0 )
{
if( v7 == 1 )
++v6;
}
else
{
v7 = 0;
}
}
while( v8 < v10 );
}
MemoryDescriptorList->MdlFlags |= 4u;
}Referenced by:
EtwpBuildMdlForTraceBuffer
HalpFlushMapBuffers
HvlGetCoverageData
HvlpDynamicUpdateMicrocode
MiCreateMdl
MmRotatePhysicalView
PopAllocateHiberContext
SMKM_STORE_MGR::SmCompressCtxProcessEntry
SmKmIssueVolumeIo
SmKmStoreFileWriteHeader
VslpLockMdlForTransfer
VslpLockPagesForTransfer