MiInitializeMdlBatchPages
NTSTATUS __stdcall MiInitializeMdlBatchPages(INT64 rcx0){
__int64 v1;
int v2;
__int64 v3;
_QWORD *v5;
unsigned __int64 v6;
_QWORD *v7;
_QWORD *v8;
unsigned __int64 v9;
__int64 v10;
int v11;
_KPROCESS *CurrentProcess;
unsigned __int8 CurrentIrql;
unsigned __int64 i;
_MMPFN *v15;
unsigned __int64 v16;
NTSTATUS result;
_QWORD *v18;
v1 = *(_QWORD *)(rcx0 + 64);
v2 = 0;
v3 = 0i64;
v5 = (_QWORD *)(v1 + 48);
v6 = (unsigned __int64)*(unsigned int *)(v1 + 40) >> 12;
v7 = (_QWORD *)(v1 + 48);
v8 = (_QWORD *)(v1 + 48);
v18 = (_QWORD *)(v1 + 48);
if( !v6 )
goto LABEL_12;
v9 = (unsigned __int64)*(unsigned int *)(v1 + 40) >> 12;
do
{
LODWORD(v10) = MiSearchNumaNodeTable((PVOID)(48i64 * *v7 / 48));
v11 = *(_DWORD *)(v10 + 8);
if( v3 )
{
if( v11 == v2 )
{
++v3;
goto LABEL_8;
}
MiInitializeMdlOneNodeBatchPages(rcx0, v8, v3);
}
v3 = 1i64;
v2 = v11;
v8 = v7;
LABEL_8:
++v7;
--v9;
}
while( v9 );
if( v3 )
MiInitializeMdlOneNodeBatchPages(rcx0, v8, v3);
v5 = v18;
LABEL_12:
CurrentProcess = (_EPROCESS *)PsGetCurrentProcess();
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
for( i = 0i64; i < v6; ++v5 )
{
v15 = &MmGetPfnDb()[*v5];
MiLockPageAtDpc((INT64)v15);
v15->PteLong = (unsigned __int64)MmGetPteBase();
MiSetLeafPfnBuddy(v15, (unsigned __int64)CurrentProcess);
v15->PteLong = v16;
_InterlockedAnd64(&v15->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (i & 0xF) == 0 && MiShouldYieldProcessor() )
{
__writecr8(CurrentIrql);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
++i;
}
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
MiAllocatePagesForMdl
MiReturnMdlExcess