MiMapViewOfPhysicalSection

VOID __fastcall MiMapViewOfPhysicalSection(INT64 a1, INT64 a2, INT64 a3){
  unsigned int v3; 
  unsigned int v4; 
  ULONG_PTR v7; 
  unsigned int v8; 
  _ETHREAD *CurrentThread; 
  __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  UINT64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  unsigned int v19; 
  UINT64 v20; 
  INT64 v21; 
  UINT64 v22; 
  int IsPfn; 
  INT64 v24; 
  INT64 v25; 
  unsigned __int64 v26; 
  int v27; 
  __int64 v28; 
  __int64 v29; 
  int v30; 
  __int64 v31; 
  UINT64 *HINTHonored; 
  PVOID *v33; 
  INT64 a2a; 
  __int64 v35; 
  UINT64 v36; 
  UINT64 v37; 
  unsigned __int64 v38; 
  int v39; 
  UINT8 *v42; 
  v4 = v3;
  if( (*(_DWORD *)(a1 + 60) & 2) != 0 )
    return;
  if( *(_QWORD *)(a1 + 80) )
    return;
  v7 = *(_QWORD *)(a1 + 88);
  v8 = v3 >> 3;
  if( v3 >> 3 == 2 )
    return;
  if( (v3 & 5) == 5 )
    return;
  if( v3 == 24 )
    return;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v35 = (__int64)CurrentThread;
  LODWORD(v10) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
  v11 = v10;
  if( !v10 )
    return;
  *(_QWORD *)(v10 + 16) = -2i64;
  v12 = *(_DWORD *)(v10 + 48) & 0xFFFFF01F;
  *(_QWORD *)(v11 + 40) = 0i64;
  *(_DWORD *)(v11 + 48) = v12 | ((v4 & 0x1F) << 7) | 0x100010;
  v38 = -1i64;
  v13 = MiSanitizePage(*(_QWORD *)a3 >> 12);
  LOCK_ADDRESS_SPACE((__int64)CurrentThread, v7);
  if( (*(_DWORD *)(v7 + 1124) & 0x20) == 0 )
  {
    v14 = (unsigned __int16)*(_DWORD *)a3;
    if( (*(_DWORD *)(a1 + 72) & 1) != 0 )
    {
      v16 = v14 + *(_QWORD *)a2;
      MiIsVaRangeAvailable((_EPROCESS *)v7, (VOID *)v16, *(_QWORD *)(a1 + 24), *(VOID **)a1);
      if( v27 )
      {
LABEL_11:
        v18 = v17 >> 12;
        v19 = 1;
        v20 = v15 >> 12;
        *(_BYTE *)(v11 + 33) = BYTE4(v20);
        *(_BYTE *)(v11 + 32) = BYTE4(v18);
        *(_DWORD *)(v11 + 24) = v18;
        *(_DWORD *)(v11 + 28) = v20;
        v37 = v13
            + ((unsigned int)v20 | ((unsigned __int64)BYTE4(v20) << 32))
            - ((unsigned int)v18 | ((unsigned __int64)BYTE4(v18) << 32));
        v39 = 1;
        if( v8 == 3 )
        {
          if( (v4 & 7) == 0 )
          {
LABEL_15:
            a2a = -1i64;
            v21 = 0i64;
            v22 = v13;
            if( v13 <= v13
                      + ((unsigned int)v20 | ((unsigned __int64)BYTE4(v20) << 32))
                      - ((unsigned int)v18 | ((unsigned __int64)BYTE4(v18) << 32)) )
            {
              do
              {
                IsPfn = MiIsPfn(v22);
                if( IsPfn )
                {
                  v25 = a2a;
                }
                else
                {
                  v24 = v22;
                  if( v21 )
                    v24 = a2a;
                  ++v21;
                  v25 = v24;
                  a2a = v24;
                }
                if( (v22 == v37 || IsPfn == 1) && v21 )
                {
                  if( (int)MiReferenceIoPages(1ui64, v25, v21, v19, 0i64, 0i64) < 0 )
                    goto LABEL_38;
                  v26 = v21 + a2a - 1;
                  v21 = 0i64;
                  a2a = -1i64;
                  v38 = v26;
                }
                v19 = v39;
                ++v22;
              }
              while( v22 <= v37 );
            }
            if( (int)MiInsertVadCharges(v11, v7) >= 0 )
            {
              MiInsertViewOfPhysicalSection((_EPROCESS *)v7, (_MMVAD *)v11);
              if( (v4 & 2) != 0 && MiIsProcessCfgEnabled() )
              {
                MiLockVad(v35, v11);
                UNLOCK_ADDRESS_SPACE_UNORDERED(v35, v7);
                if( (int)MiCommitVadCfgBits(v11, 0i64, v42) < 0 )
                {
                  MiReferenceVad(v11);
                  MiDeleteVad((_MMVAD *)v11, 0i64);
                  return;
                }
                MiUnlockVad(v35, v11);
              }
              else
              {
                UNLOCK_ADDRESS_SPACE(v35, v7);
              }
              *(_QWORD *)a2 = v16;
              return;
            }
            goto LABEL_38;
          }
          v19 = 2;
        }
        else if( v8 == 1 )
        {
          v19 = 0;
        }
        v39 = v19;
        goto LABEL_15;
      }
    }
    else
    {
      LODWORD(v33) = 0;
      LODWORD(HINTHonored) = v4;
      v36 = *(_QWORD *)(a1 + 24) + v14;
      if( MiSelectUserAddress(
             *(unsigned int *)(a1 + 40),
             *(_QWORD *)a1,
             *(_QWORD *)(a1 + 8),
             v36,
             *(_QWORD *)(a1 + 16),
             0i64,
             HINTHonored,
             v33) >= 0 )
      {
        v15 = v36 - 1;
        v16 = (unsigned __int16)*(_DWORD *)a3;
        v17 = v16;
        goto LABEL_11;
      }
    }
  }
LABEL_38:
  UNLOCK_ADDRESS_SPACE(v35, v7);
  if( v38 != -1i64 )
  {
    v28 = -1i64;
    v29 = 0i64;
    while( v13 <= v38 )
    {
      v30 = MiIsPfn(v13);
      if( !v30 )
      {
        v31 = v13;
        if( v29 )
          v31 = v28;
        ++v29;
        v28 = v31;
      }
      if( v30 == 1 || v13 == v38 )
      {
        if( v29 )
        {
          MiDereferenceIoPages(1i64, v28, v29);
          v28 = -1i64;
          v29 = 0i64;
        }
      }
      ++v13;
    }
  }
  ExFreePoolWithTag((PVOID)v11, 0);
}

Referenced by:

MiMapViewOfSection