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