MiLockStealSystemVm

INT64 __fastcall MiLockStealSystemVm(UINT64 a1, UINT8 a2, INT64 a3, INT64 a4){
  unsigned __int64 v6; 
  _MMPTE *PteBase; 
  UNICODE_STRING *v8; 
  unsigned __int64 v9; 
  unsigned int SystemRegionType; 
  _MMPTE *v11; 
  unsigned int v12; 
  unsigned int v13; 
  char v14; 
  bool v15; 
  int v16; 
  CHAR *AnyMultiplexedVm; 
  CHAR *v18; 
  void *v19; 
  __int64 SessionVm; 
  CHAR *v21; 
  int v22; 
  unsigned __int64 v23; 
  WCHAR *v24; 
  int v26; 
  INT64 v27; 
  int IsPfnFileOnly; 
  int v29; 
  unsigned int v30; 
  INT64 v31; 
  INT64 v32; 
  UNICODE_STRING *antNameB; 
  v32 = a3;
  v6 = a2;
  PteBase = MmGetPteBase();
  v8 = *(UNICODE_STRING **)(qword_140C4E388 + 8 * ((*(_QWORD *)(a1 + 40) >> 39) & 0x3FFi64));
  antNameB = v8;
  v9 = ((a3 << 25) - ((_QWORD)PteBase << 25)) >> 16;
  SystemRegionType = MiGetSystemRegionType(v9);
  v11 = PteBase;
  v12 = 0;
  if( v9 < (unsigned __int64)v11 || (v13 = 1, v9 > (unsigned __int64)MmGetPteLimit()) )
    v13 = 0;
  if( SystemRegionType == 5 )
  {
    v14 = *(_BYTE *)(a1 + 35);
    _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
    v15 = (v14 & 0x10) == 0;
    v16 = KiIrqlFlags;
    if( v15 )
    {
      __writecr8(v6);
      AnyMultiplexedVm = MiGetAnyMultiplexedVm(5i64);
      *(_DWORD *)(a4 + 8) |= 0x20u;
      v18 = AnyMultiplexedVm;
      goto LABEL_19;
    }
    goto LABEL_39;
  }
  if( SystemRegionType != 1 )
  {
    if( SystemRegionType == 6 )
    {
      _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
      v21 = MiGetAnyMultiplexedVm(2i64);
      *(_DWORD *)(a4 + 8) |= 0x10u;
      v18 = v21;
    }
    else if( SystemRegionType == 12 )
    {
      _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
      v18 = MiGetAnyMultiplexedVm(1i64);
      *(_DWORD *)(a4 + 48) = v22;
    }
    else
    {
      if( SystemRegionType != 9 || !MiVaIsPageFileHash((__int64)v8, v9) )
      {
        _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
        v16 = KiIrqlFlags;
LABEL_39:
        if( v16 && (v16 & 1) != 0 )
          KeGetCurrentIrql();
        __writecr8(v6);
        return 0i64;
      }
      v18 = MiGetAnyMultiplexedVm(3i64);
      *(_DWORD *)(a4 + 48) = 2;
      _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
    }
    goto LABEL_19;
  }
  *(_QWORD *)(a4 + 56) = MiReferenceOwningSession(a1);
  _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v6);
  v19 = *(void **)(a4 + 56);
  if( v19 )
  {
    if( MmAttachSession(v19, (KAPC_STATE *)(a4 + 72)) < 0 )
    {
      *(_QWORD *)(a4 + 56) = 0i64;
      return 0i64;
    }
    SessionVm = MiGetSessionVm();
    *(_DWORD *)(a4 + 8) |= 0x80u;
    v18 = (CHAR *)SessionVm;
LABEL_19:
    if( !(unsigned int)MiSynchronizeSystemVa((INT64)v18, v9, SystemRegionType, v13, a4) )
      goto LABEL_23;
    v23 = (__int64)(a1 - (_QWORD)MmGetPfnDb()) / 48;
    if( v13 )
    {
      if( !(unsigned int)MiSmallVaStillMapsFrame((PVOID)v9, v23) )
      {
LABEL_22:
        v12 = 2;
LABEL_23:
        MiUnlockStealVm(a4);
        if( (v18[184] & 7) != 3 )
          return v12;
        return 0i64;
      }
    }
    else
    {
      v31 = MI_READ_PTE_LOCK_FREE(v32);
      if( (v31 & 1) == 0 || (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v31) >> 12) & 0xFFFFFFFFFi64) != v23 )
        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)
      && v23 <= 0xFFFFFFFFFi64
      && (*((_QWORD *)MmGetPfnDb() + 6 * v23 + 5) & 0x4000000000000i64) != 0
      && *(UNICODE_STRING **)(qword_140C4E388 + 8 * ((*(_QWORD *)(a1 + 40) >> 39) & 0x3FFi64)) == antNameB )
    {
      LOBYTE(v26) = MI_PFN_IS_PROTO((UNICODE_STRING *)a1, antNameB, 1u, v24);
      if( !v26 )
      {
        IsPfnFileOnly = MiIsPfnFileOnly(v27);
        if( IsPfnFileOnly != v29 && !MiIsPfnFromSlabAllocation(a1) )
          return v30;
      }
    }
    goto LABEL_23;
  }
  return 0i64;
}

Referenced by:

No references.