MiLockStealSystemVm

NTSTATUS __stdcall MiLockStealSystemVm(UINT64 a1, UINT8 a2, INT64 a3, INT64 a4){
  unsigned __int64 v6; 
  _MMPTE *PteBase; 
  _UNICODE_STRING *v8; 
  unsigned __int64 v9; 
  VOID *v10; 
  unsigned int SystemRegionType; 
  _MMPTE *v12; 
  NTSTATUS v13; 
  unsigned int v14; 
  char v15; 
  bool v16; 
  int v17; 
  _MMSUPPORT_INSTANCE *AnyMultiplexedVm; 
  _MMSUPPORT_INSTANCE *v19; 
  __int64 v20; 
  void *v21; 
  INT64 v22; 
  INT64 v23; 
  INT16 v24; 
  _MMSUPPORT_INSTANCE *SessionVm; 
  _MMSUPPORT_INSTANCE *v26; 
  int v27; 
  VOID *v28; 
  unsigned __int64 v29; 
  wchar_t *v30; 
  INT64 v32; 
  unsigned __int64 v33; 
  int v34; 
  INT64 v35; 
  int v36; 
  int v37; 
  int v38; 
  NTSTATUS v39; 
  INT64 v40; 
  INT64 v41; 
  _UNICODE_STRING *antNameB; 

  v41 = a3;
  v6 = a2;
  PteBase = MmGetPteBase();
  v8 = *(_UNICODE_STRING **)(*(&stru_140C4DB30 + 267) + 8 * ((*(_QWORD *)(a1 + 40) >> 39) & 0x3FFi64));
  antNameB = v8;
  v9 = ((a3 << 25) - ((_QWORD)PteBase << 25)) >> 16;
  SystemRegionType = MiGetSystemRegionType(v9);
  v12 = PteBase;
  v13 = 0;
  if( v9 < (unsigned __int64)v12 || (v14 = 1, v9 > (unsigned __int64)MmGetPteLimit()) )
    v14 = 0;
  if( SystemRegionType == 5 )
  {
    v15 = *(_BYTE *)(a1 + 35);
    _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
    v16 = (v15 & 0x10) == 0;
    v17 = KiIrqlFlags;
    if( v16 )
    {
      __writecr8(v6);
      AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeNonPagedPool, v10);
      *(_DWORD *)(a4 + 8) |= 0x20u;
      v19 = AnyMultiplexedVm;
      goto LABEL_19;
    }
    goto LABEL_39;
  }
  if( SystemRegionType != 1 )
  {
    if( SystemRegionType == 6 )
    {
      _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
      v26 = MiGetAnyMultiplexedVm(MiWorkingSetTypePagedPool, v10);
      *(_DWORD *)(a4 + 8) |= 0x10u;
      v19 = v26;
    }
    else if( SystemRegionType == 12 )
    {
      _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
      v19 = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v10);
      *(_DWORD *)(a4 + 48) = v27;
    }
    else
    {
      if( SystemRegionType != 9 || !MiVaIsPageFileHash(v8) )
      {
        _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
        v17 = KiIrqlFlags;
LABEL_39:
        if( v17 && (v17 & 1) != 0 )
          KeGetCurrentIrql();
        __writecr8(v6);
        return 0;
      }
      v19 = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemPtes, v28);
      *(_DWORD *)(a4 + 48) = 2;
      _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
    }
    goto LABEL_19;
  }
  LODWORD(v20) = MiReferenceOwningSession((_XSTATE_CONFIGURATION *)a1);
  *(_QWORD *)(a4 + 56) = v20;
  _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v6);
  v21 = *(void **)(a4 + 56);
  if( v21 )
  {
    if( MmAttachSession(v21, (_KAPC_STATE *)(a4 + 72)) < 0 )
    {
      *(_QWORD *)(a4 + 56) = 0i64;
      return 0;
    }
    SessionVm = MiGetSessionVm(v23, v22, v24);
    *(_DWORD *)(a4 + 8) |= 0x80u;
    v19 = SessionVm;
LABEL_19:
    if( !MiSynchronizeSystemVa((INT64)v19, v9, SystemRegionType, v14, a4) )
      goto LABEL_23;
    v29 = (__int64)(a1 - (_QWORD)MmGetPfnDb()) / 48;
    if( v14 )
    {
      if( !MiSmallVaStillMapsFrame((VOID *)v9, v29) )
      {
LABEL_22:
        v13 = 2;
LABEL_23:
        MiUnlockStealVm(a4);
        if( (v19->Flags._bf_0 & 7) != 3 )
          return v13;
        return 0;
      }
    }
    else
    {
      LODWORD(v32) = MI_READ_PTE_LOCK_FREE(v41);
      v40 = v32;
      if( (v32 & 1) == 0 )
        goto LABEL_22;
      LODWORD(v33) = MI_READ_PTE_LOCK_FREE((INT64)&v40);
      if( ((v33 >> 12) & 0xFFFFFFFFFi64) != v29 )
        goto LABEL_22;
    }
    if( ((unsigned int)(*(_DWORD *)(a4 + 48) - 2) <= 1
       || (*(_DWORD *)(a4 + 8) & 0x20) != 0
       || (*(_BYTE *)a1 & 1) != 0 && (*(_BYTE *)(a1 + 35) & 8) == 0)
      && v29 <= 0xFFFFFFFFFi64
      && (MmGetPfnDb()[v29].u4._bf_0 & 0x4000000000000i64) != 0
      && *(_UNICODE_STRING **)(*(&stru_140C4DB30 + 267) + 8 * ((*(_QWORD *)(a1 + 40) >> 39) & 0x3FFi64)) == antNameB )
    {
      LOBYTE(v34) = MI_PFN_IS_PROTO((_UNICODE_STRING *)a1, antNameB, 1u, v30);
      if( !v34 )
      {
        LOBYTE(v36) = MiIsPfnFileOnly(v35);
        if( v36 != v37 )
        {
          LOBYTE(v38) = MiIsPfnFromSlabAllocation(a1);
          if( !v38 )
            return v39;
        }
      }
    }
    goto LABEL_23;
  }
  return 0;
}

Referenced by:

No references.