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