MmMapMdl

__int64 __fastcall MmMapMdl(__int64 a1, unsigned int a2, void (__fastcall *a3)(__int64, unsigned __int64), __int64 a4){
  struct _SLIST_ENTRY *v5; 
  void(__fastcall *v6)(__int64, _QWORD); 
  __int64 v7; 
  unsigned int ProtectionMask; 
  unsigned __int64 v10; 
  unsigned int v11; 
  _MMPTE *PteBase; 
  PSLIST_ENTRY UltraMdlContext; 
  INT64 v14; 
  void *v15; 
  int v16; 
  CHAR v17; 
  CHAR v18; 
  __int64 v19; 
  INT64 v20; 
  int a6; 
  int v22; 
  a6 = 0;
  v5 = 0i64;
  ProtectionMask = MiMakeProtectionMask(a2);
  if( ProtectionMask == -1
    || ProtectionMask == 24
    || (ProtectionMask & 7) == 5
    || (ProtectionMask & 2) != 0
    || (ProtectionMask & 0xFFFFFFF8) == 16 )
  {
    return 3221225541i64;
  }
  if( (*(_BYTE *)(a1 + 10) & 5) != 0 )
  {
    v6(v7, *(_QWORD *)(a1 + 24));
    return 0i64;
  }
  else
  {
    v10 = (((*(_DWORD *)(a1 + 44) + *(_DWORD *)(a1 + 32)) & 0xFFF) + (unsigned __int64)*(unsigned int *)(a1 + 40) + 4095) >> 12;
    v11 = v10;
    if( MmProtectFreedNonPagedPool == 1 )
      v11 = v10 + 1;
    PteBase = MmGetPteBase();
    if( v11 <= 0x200
      && (UltraMdlContext = MiGetUltraMdlContext(), (v5 = UltraMdlContext) != 0i64)
      && (v14 = (INT64)PteBase
              + (((unsigned __int64)MiGetUltraMapping((unsigned __int64 *)&UltraMdlContext->Next + 1, 3u, v11, 0) >> 9) & 0x7FFFFFFFF8i64)) != 0
      || (v14 = MiReservePtes((INT64)&qword_140C4EC80, v11)) != 0 )
    {
      v15 = (void *)(*(unsigned int *)(a1 + 44) + (((v14 << 25) - ((_QWORD)PteBase << 25)) >> 16));
      LODWORD(v20) = 0;
      v22 = MiFillSystemPtes(v14, v10, a1 + 48, ProtectionMask, v20, (INT64)&a6);
      if( v22 >= 0 )
      {
        v16 = a6 & 1;
        if( (a6 & 1) != 0 )
        {
          MiMappingHasIoReferences(v15);
          *(_WORD *)(a1 + 10) |= 0x800u;
        }
        if( (dword_140CFA17C & 1) != 0 )
        {
          v17 = MiProtectionToCacheAttribute(ProtectionMask);
          MiInsertPteTracker(a1, 0i64, v18, v17);
        }
        v22 = 0;
        a3(a4, (unsigned __int64)v15);
        if( v16 )
          MiZeroAndFlushPtes((unsigned __int64)v15, v10);
      }
      if( v5 )
      {
        if( v11 )
        {
          v19 = v11;
          do
          {
            *(_QWORD *)v14 = ZeroPte;
            v14 += 8i64;
            --v19;
          }
          while( v19 );
        }
        MiFreeUltraMdlContext(v5);
        v14 = 0i64;
      }
      if( v14 )
        MiReleasePtes((INT64)&qword_140C4EC80, v14, v11);
      return(unsigned int)v22;
    }
    else
    {
      return 3221225626i64;
    }
  }
}

Referenced by:

No references.