MmBuildMdlForNonPagedPool
VOID *__stdcall MmBuildMdlForNonPagedPool(PMDL MemoryDescriptorList){
unsigned __int64 StartVa;
PMDL v2;
UINT64 v3;
void *v4;
unsigned __int64 v6;
VOID *result;
int v8;
unsigned __int64 v9;
NTSTATUS v10;
unsigned __int64 v11;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
_MMPTE *Pml4eBase;
__int16 MdlFlags;
_MMPTE *PteBase;
int v16;
__int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
__int64 v22;
_QWORD *v23;
UINT64 v24;
UINT64 BugCheckParameter4;
UINT64 v26;
int v27;
__int64 v28;
INT64 *v29;
INT64 v30;
unsigned __int64 v31;
unsigned __int64 v32;
unsigned __int64 v33;
__int64 v34;
__int16 v35;
__int64 v36;
__int64 v37[4];
__int64 v38[14];
NTSTATUS SystemRegionType;
INT64 v40;
UINT64 v41;
unsigned __int64 v42;
StartVa = (unsigned __int64)MemoryDescriptorList->StartVa;
v2 = MemoryDescriptorList + 1;
v3 = 0i64;
v4 = (void *)(StartVa + MemoryDescriptorList->ByteOffset);
MemoryDescriptorList->Process = 0i64;
MemoryDescriptorList->MappedSystemVa = v4;
v41 = 0i64;
v6 = -1i64;
result = MmGetPteBase();
v8 = 0;
v9 = (unsigned __int64)result + ((StartVa >> 9) & 0x7FFFFFFFF8i64);
v10 = 0;
SystemRegionType = 0;
v11 = v9 + 8 * ((((unsigned __int16)v4 & 0xFFF) + (unsigned __int64)MemoryDescriptorList->ByteCount + 4095) >> 12);
v42 = v11;
if( v9 < v11 )
{
p_u4 = &MmGetPfnDb()->u4;
do
{
Pml4eBase = MmGetPml4eBase();
result = (VOID *)0xFFFFFFFFFi64;
if( v8 )
{
if( v8 < 2 )
goto LABEL_5;
LABEL_19:
if( (v3 & 1) == 0 )
KeBugCheckEx(0x1Au, (PVOID)0x1240, MemoryDescriptorList, (PVOID)v9, (PVOID)v3);
if( v8 == 3 )
MiSetNonPagedPoolNoSteal((_MMPTE *)v9, (UINT64)Pml4eBase);
LODWORD(BugCheckParameter4) = MI_READ_PTE_LOCK_FREE(v9);
v41 = BugCheckParameter4;
v26 = BugCheckParameter4;
v3 = BugCheckParameter4;
if( (BugCheckParameter4 & 1) == 0 )
KeBugCheckEx(0x1Au, (PVOID)0x1241, MemoryDescriptorList, (PVOID)v9, (PVOID)BugCheckParameter4);
MiPteInShadowRange((UINT64)&v41);
result = (VOID *)0xFFFFFFFFFi64;
v6 = (v26 >> 12) & 0xFFFFFFFFFi64;
if( v10 == 12 )
{
MiQueuePinDriverAddressLog((__int64)((v9 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v3, 1ui64);
result = (VOID *)0xFFFFFFFFFi64;
}
}
else
{
PteBase = MmGetPteBase();
v16 = 4;
v17 = 4i64;
v18 = (__int64)((v9 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v19 = (unsigned __int64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
v37[1] = v19;
v20 = (unsigned __int64)PteBase + ((v19 >> 9) & 0x7FFFFFFFF8i64);
v37[2] = v20;
v21 = (unsigned __int64)PteBase + ((v20 >> 9) & 0x7FFFFFFFF8i64);
v37[3] = v21;
v22 = (__int64)PteBase + ((v21 >> 9) & 0x7FFFFFFFF8i64);
v38[0] = v22;
while( 1 )
{
v23 = (_QWORD *)v37[v17--];
--v16;
if( (*v23 & 1) == 0 )
goto LABEL_17;
if( (*v23 & 0x80u) != 0i64 )
break;
if( v17 == 1 )
goto LABEL_17;
}
if( !v16 )
{
LABEL_17:
LODWORD(v24) = MI_READ_PTE_LOCK_FREE(v9);
v3 = v24;
SystemRegionType = MiGetSystemRegionType(v18);
v10 = SystemRegionType;
if( SystemRegionType == 5 )
v8 = 3;
else
v8 = 2;
goto LABEL_19;
}
v38[4] = v22;
v27 = 4;
v38[2] = v20;
v28 = 4i64;
v38[1] = v19;
v38[3] = v21;
do
{
v29 = (INT64 *)v38[v28--];
--v27;
v30 = *v29;
v40 = *v29;
}
while( v28 && (v30 & 0x80u) == 0i64 );
LODWORD(v31) = MI_READ_PTE_LOCK_FREE((INT64)&v40);
v11 = v42;
v32 = v31 >> 12;
result = (VOID *)0xFFFFFFFFFi64;
v6 = v32 & 0xFFFFFFFFFi64;
if( v28 )
{
v33 = v18 >> 12;
v34 = 1i64;
if( v27 )
{
do
{
v35 = v33;
v33 >>= 9;
v36 = v34 * (v35 & 0x1FF);
v34 <<= 9;
v6 += v36;
--v27;
}
while( v27 );
result = (VOID *)0xFFFFFFFFFi64;
}
}
v3 = v41;
v8 = 1;
v10 = SystemRegionType;
}
p_u4 = &MmGetPfnDb()->u4;
LABEL_5:
v2->Next = (_MDL *)v6;
MdlFlags = MemoryDescriptorList->MdlFlags;
if( (MdlFlags & 0x800) == 0 )
{
if( v6 > 0xFFFFFFFFFi64 || (result = p_u4, (((unsigned __int64)p_u4[6 * v6]._bf_0 >> 50) & 1) == 0) )
MemoryDescriptorList->MdlFlags = MdlFlags | 0x800;
}
v2 = (PMDL)((char *)v2 + 8);
v9 += 8i64;
if( (v9 & 0xFFF) != 0 )
{
if( v8 == 1 )
++v6;
}
else
{
v8 = 0;
}
}
while( v9 < v11 );
}
MemoryDescriptorList->MdlFlags |= 4u;
return result;
}Referenced by:
EtwpBuildMdlForTraceBuffer
HalpFlushMapBuffers
HvlGetCoverageData
HvlpDynamicUpdateMicrocode
MiCreateMdl
MmRotatePhysicalView
PopAllocateHiberContext
SMKM_STORE_MGR::SmCompressCtxProcessEntry
SmKmIssueVolumeIo
SmKmStoreFileWriteHeader
VslpLockMdlForTransfer
VslpLockPagesForTransfer