MiProbeLockFrame

INT64 __fastcall MiProbeLockFrame(__int64 a1){
  unsigned __int64 v1; 
  int v3; 
  _MMPTE *PteBase; 
  _MMPFN *PfnDb; 
  UINT64 v6; 
  _MMPFN *v7; 
  UINT8 v8; 
  unsigned __int16 v9; 
  UINT64 CurrentPrcb; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  bool v14; 
  int v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  ULONG_PTR *v18; 
  signed __int32 v19; 
  signed __int32 v20; 
  int v21; 
  __int64 v22; 
  char v23; 
  int v24; 
  __int64 v25; 
  _MMPFN *v26; 
  INT64 result; 
  int v28; 
  __int64 v29; 
  RTL_BALANCED_NODE *Address; 
  int v31; 
  UINT8 PageIrql; 
  UINT64 SpinCount; 
  UINT64 v34; 
  v1 = *(_QWORD *)(a1 + 128);
  if( v1 > 0xFFFFFFFFFi64 || (*((_QWORD *)MmGetPfnDb() + 6 * v1 + 5) & 0x4000000000000i64) == 0 )
  {
    if( !*(_QWORD *)(a1 + 80)
      || (Address = MiLocateAddress(*(_QWORD *)a1)) != 0i64
      && ((v31 = (int)Address[2].Children[0], (v31 & 0x70) == 64) || (v31 & 0x70) == 16) )
    {
      result = MiReferenceIoPages(0i64, *(_QWORD *)(a1 + 128), 1i64, 0i64, 0i64, 0i64);
      if( (int)result >= 0 )
      {
        *(_WORD *)(*(_QWORD *)(a1 + 56) + 10i64) |= 0x800u;
        return 0i64;
      }
      else
      {
        ++dword_140C4E4DC;
      }
    }
    else
    {
      ++dword_140C4E4D8;
      return 3221225477i64;
    }
    return result;
  }
  v3 = *(_DWORD *)(a1 + 64);
  PageIrql = 17;
  PteBase = MmGetPteBase();
  PfnDb = MmGetPfnDb();
  if( (v3 & 0xF) != 4
    || (v6 = *(_QWORD *)a1, (unsigned int)MI_IS_PHYSICAL_ADDRESS(*(PVOID *)a1))
    || (v7 = MiLockNonPagedPoolPte((_MMPTE *)((char *)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64)), &PageIrql),
        v1 = (v7 - PfnDb) / 48,
        *(_QWORD *)(a1 + 128) = v1,
        !v7) )
  {
    v7 = (_MMPFN *)((char *)PfnDb + 48 * v1);
    PageIrql = 17;
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v7 + 3) < 0 );
    }
  }
  v8 = *((_BYTE *)v7 + 34);
  if( (v8 & 7u) <= 1 || (v9 = *((_WORD *)v7 + 16)) == 0 )
  {
    _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
    if( PageIrql != 17 )
      __writecr8(PageIrql);
    ++dword_140C4E4CC;
    return 3221225477i64;
  }
  if( v9 >= 0x7FFFu )
    goto LABEL_71;
  CurrentPrcb = *((_QWORD *)v7 + 5);
  v11 = 1;
  v12 = 1023i64;
  if( (CurrentPrcb & 0x1000000000i64) == 0 && (CurrentPrcb & 0x2000000000000i64) == 0 )
  {
    v13 = *((_QWORD *)v7 + 3) & 0x3FFFFFFFFFFFFFFFi64;
    if( v9 == 1 )
    {
      if( v13 )
        goto LABEL_20;
    }
    else if( v9 != 2 || !v13 )
    {
      goto LABEL_37;
    }
    if( (v8 & 8) != 0 )
    {
LABEL_20:
      v14 = 0;
      LOBYTE(v15) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v8, (PWCHAR)0x3FF);
      if( v15 && (*((_DWORD *)v7 + 4) & 0x400i64) != 0 )
      {
        v14 = 1;
      }
      else
      {
        v8 = 0;
        v17 = *((_QWORD *)v7 + 1) | 0x8000000000000000ui64;
        if( v17 <= (unsigned __int64)PteBase + 0x3FFFFFFF78i64 && v17 >= (unsigned __int64)PteBase )
          v14 = (*((_BYTE *)v7 + 35) & 0x20) != 0;
      }
      v18 = *(ULONG_PTR **)(qword_140C4E388 + 8 * (v12 & (v16 >> 39)));
      if( !v14 || (unsigned int)MiChargeCommit((_MI_PARTITION *)v18, 1ui64, 8ui64) )
      {
        if( v18 == &MiSystemPartition )
        {
          CurrentPrcb = (UINT64)KeGetCurrentPrcb();
          v19 = *(_DWORD *)(CurrentPrcb + 33564);
          while( v19 )
          {
            if( v19 == -1 )
              break;
            v20 = v19;
            v19 = _InterlockedCompareExchange((volatile signed __int32 *)(CurrentPrcb + 33564), v19 - 1, v19);
            if( v20 == v19 )
              goto LABEL_37;
          }
        }
        v21 = MiChargePartitionResidentAvailable((INT64)v18, 1ui64, 0i64);
        if( !v21 && v14 )
          MiReturnCommit((_MI_PARTITION *)v18, 1ui64);
        if( v21 )
          goto LABEL_37;
      }
LABEL_71:
      _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
      if( PageIrql != 17 )
        __writecr8(PageIrql);
      ++dword_140C4E4D0;
      return 3221225633i64;
    }
  }
LABEL_37:
  ++*((_WORD *)v7 + 16);
  if( (*((_QWORD *)v7 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0 )
  {
    v22 = *((_QWORD *)v7 + 2);
    if( (v22 & 0x400) == 0 && (v22 & 4) != 0 )
      *(_BYTE *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) + 675i64) = 1;
  }
  v23 = *((_BYTE *)v7 + 34);
  if( (v23 & 0x20) != 0 && (v23 & 8) == 0 && (*((_QWORD *)v7 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0 )
    _InterlockedIncrement64((volatile signed __int64 *)(*(_QWORD *)v7 + 232i64));
  _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
  if( PageIrql != 17 )
    __writecr8(PageIrql);
  if( (*(_DWORD *)(a1 + 64) & 0xF) == 1 )
  {
    CurrentPrcb = *((_QWORD *)v7 + 5);
    if( (CurrentPrcb & 0x1000000000i64) == 0 && ((CurrentPrcb >> 60) & 7) != 1 )
    {
      CurrentPrcb &= 0xFFFFFFFFFui64;
      if( CurrentPrcb != 0xFFFFFFFFDi64 && *(_QWORD *)(a1 + 136) != CurrentPrcb )
      {
        LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v8, (PWCHAR)v12);
        if( !v24 )
        {
          v26 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v25);
          v11 = 2;
        }
        if( !(unsigned int)MiLockPageTablePage(v26, v11) )
        {
          LODWORD(v34) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
          {
            do
              KeYieldProcessorEx(&v34);
            while( *((__int64 *)v7 + 3) < 0 );
          }
          MiRemoveLockedPageChargeAndDecRef(v7);
          _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
          ++dword_140C4E4D4;
          return 3221225633i64;
        }
        *(_QWORD *)(a1 + 136) = *((_QWORD *)v7 + 5) & 0xFFFFFFFFFi64;
        *(_WORD *)(*(_QWORD *)(a1 + 56) + 10i64) |= 0x100u;
      }
    }
  }
  if( *(char *)(*(_QWORD *)(a1 + 56) + 10i64) < 0 )
  {
    LOBYTE(v28) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v8, (PWCHAR)v12);
    if( v28 )
    {
      v29 = *((_QWORD *)v7 + 2);
      if( (v29 & 0x400) != 0 )
      {
        if( qword_140C4DC80 && (v29 & 0x10) == 0 )
          v29 &= ~qword_140C4DC80;
        _InterlockedIncrement64((volatile signed __int64 *)(*(_QWORD *)(v29 >> 16) + 112i64));
      }
    }
  }
  if( ((*((_QWORD *)v7 + 5) >> 39) & 0x3FF) != 0 )
    ExAcquireRundownProtectionCacheAware(
      *(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) + 2144i64),
      CurrentPrcb);
  return 0i64;
}

Referenced by:

MiProbeAndLockPages
MmProbeAndLockSelectedPages