MiProbeAndLockPages

VOID __fastcall MiProbeAndLockPages(INT64 rcx0, CHAR dl0, INT64 a3){
  int v3; 
  char v6; 
  NTSTATUS v7; 
  INT64 v8; 
  INT64 v9; 
  NTSTATUS v10; 
  UINT64 *v11; 
  unsigned __int64 v12; 
  bool v13; 
  INT64 v14; 
  LONG *v15; 
  struct _KPRCB *CurrentPrcb; 
  int v17; 
  int v18; 
  __int64 v19; 
  int i; 
  UINT64 v21; 
  UINT64 *v22; 
  INT64 v23; 
  _MDL *v24; 
  _BYTE *v25; 
  unsigned __int64 v26; 
  UINT64 v27; 
  int v28; 
  int v29; 
  INT64 *v30; 
  INT64 **v31; 
  __int64 v32; 
  unsigned __int64 v33; 
  __int64 v34; 
  unsigned __int64 v35; 
  INT64 v36; 
  INT64 a6; 
  INT64 a6a; 
  INT64 v39; 
  CHAR v40; 
  INT64 result[2]; 
  UINT64 *v42; 
  unsigned __int64 v43; 
  UINT64 a2; 
  UINT64 v45; 
  UINT64 *v46; 
  PMDL MemoryDescriptorList; 
  char v48; 
  UINT8 v49; 
  ULONG_PTR v50; 
  INT64 a1; 
  __int64 v52; 
  __int64 v53; 
  PVOID P; 
  UINT64 v55; 
  unsigned __int64 v56; 
  unsigned __int64 v57; 
  __int64 v58; 
  UINT64 v59; 
  UINT64 v60; 
  v3 = a3;
  memset((INT64)result, 0i64);
  v6 = 0;
  LODWORD(v39) = 1;
  LODWORD(a6) = v3;
  v7 = MiProbeAndLockPrepare(
         (INT64)result,
         rcx0,
         *(_QWORD *)(rcx0 + 32) + *(unsigned int *)(rcx0 + 44),
         *(unsigned int *)(rcx0 + 40),
         dl0,
         a6,
         v39);
  v10 = v7;
  if( v7 < 0 )
    RtlRaiseStatus(v7);
  v11 = v42;
  v12 = result[0];
  while( 1 )
  {
    v13 = (v48 & 0x20) == 0;
    *v46 = -1i64;
    if( v13 )
      break;
    v26 = v56;
    if( v12 > v57 || v12 < v56 )
      break;
    if( (v6 & 0x3F) != 0 || !(unsigned int)MiProbePacketContended(result) )
    {
      if( v58 == -1 )
      {
        v60 = *v11;
        v27 = v60;
        MiPteInShadowRange((UINT64)&v60);
        v55 = (v27 >> 12) & 0xFFFFFFFFFi64;
      }
      else
      {
        v55 = v58 + ((v12 - v26) >> 12);
      }
LABEL_18:
      v10 = MiProbeLockFrame((__int64)result);
      if( v10 < 0 )
        goto LABEL_21;
      v22 = v46;
      v12 = result[0] + 4096;
      ++v46;
      v11 = ++v42;
      *v22 = v55;
      result[0] = v12;
      goto LABEL_20;
    }
LABEL_45:
    MiUnlockProbePacketWorkingSet((INT64)result);
    MiLockProbePacketWorkingSet((INT64)result, v30, v31);
    v11 = v42;
    v12 = result[0];
LABEL_20:
    ++v6;
    if( (unsigned __int64)v11 > v43 )
      goto LABEL_21;
  }
  if( (v6 & 0xF) != 0 )
    goto LABEL_14;
  v14 = a1;
  if( a2 )
  {
    MiPageTableLockIsContended(a1, a2, v8, v9, v36, a6a, v40);
    if( v28 )
      goto LABEL_45;
  }
  v15 = (*(_BYTE *)(v14 + 184) & 7) == 2 ? &dword_140C4F4C0 : (LONG *)(v14 + 192);
  if( (*v15 & 0x40000000) != 0 )
    goto LABEL_45;
  CurrentPrcb = KeGetCurrentPrcb();
  v17 = *((_DWORD *)CurrentPrcb + 3147);
  if( (v17 & 1) != 0 )
  {
    v18 = 1;
    if( *((_DWORD *)CurrentPrcb + 8103) <= 7u )
      goto LABEL_13;
    if( !*((_BYTE *)CurrentPrcb + 12585) )
      goto LABEL_64;
    v29 = 1;
  }
  else
  {
    v18 = 0;
    if( (v17 & 0x1E) != 0 )
    {
      v29 = 2;
      goto LABEL_44;
    }
    if( *((_BYTE *)CurrentPrcb + 12585) )
    {
      v29 = 3;
      goto LABEL_44;
    }
    v19 = *((_QWORD *)CurrentPrcb + 2);
    if( v19 && v19 != *((_QWORD *)CurrentPrcb + 1) )
    {
      v29 = 4;
      goto LABEL_44;
    }
LABEL_13:
    if( *((_DWORD *)CurrentPrcb + 7931) <= 7u )
      goto LABEL_14;
    if( !v18 )
    {
LABEL_51:
      _disable();
      *((_DWORD *)CurrentPrcb + 7931) = 0;
      *((_DWORD *)CurrentPrcb + 8103) = 0;
      KiResetGlobalDpcWatchdogProfiler((INT64)CurrentPrcb);
      _enable();
      v29 = 0;
      goto LABEL_44;
    }
LABEL_64:
    if( (v17 & 0x1E) != 0 )
    {
      v29 = 5;
    }
    else
    {
      if( *((_QWORD *)CurrentPrcb + 1) == *((_QWORD *)CurrentPrcb + 3) )
        goto LABEL_51;
      v29 = 6;
    }
  }
LABEL_44:
  if( v29 )
    goto LABEL_45;
LABEL_14:
  LODWORD(v59) = 0;
  for( i = MiLockPageLeafPageTable((INT64)result); v45 != ZeroPte; i = MiLockPageLeafPageTable((INT64)result) )
  {
    i = MiProbeLeafPteAccess((INT64)result, (UINT64)&v59);
    if( i < 0 )
      break;
    if( !(_DWORD)v59 )
    {
      v21 = v45;
      MiPteInShadowRange((UINT64)&v45);
      v55 = (v21 >> 12) & 0xFFFFFFFFFi64;
      MiSetProbePagesAhead((INT64)result);
      goto LABEL_18;
    }
    if( (_DWORD)v59 != 1 )
    {
      i = MiFaultInProbeAddress((INT64)result);
      if( i < 0 )
      {
        ++dword_140C4E4BC;
        break;
      }
    }
  }
  v10 = i;
  if( i >= 0 )
    goto LABEL_18;
LABEL_21:
  v23 = a1;
  if( a2 )
    MiUnlockPageTableInternal(a1, a2);
  MiUnlockWorkingSetShared(v23, v49);
  v24 = MemoryDescriptorList;
  if( (MmTrackLockedPages & 1) != 0 )
    MiAddMdlTracker(
      MemoryDescriptorList,
      (MemoryDescriptorList->ByteCount
     + 4095i64
     + (unsigned __int64)((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)) >> 12,
      3ui64);
  if( v10 < 0 )
  {
    MmUnlockPages(v24);
    ++dword_140C4E4E0;
  }
  v25 = P;
  if( P )
  {
    v32 = *((unsigned int *)P + 13);
    LODWORD(v32) = v32 & 0x7FFFFFFF;
    v33 = (v52 + (v32 | ((unsigned __int64)*((unsigned __int8 *)P + 34) << 31))) >> 31;
    v34 = v53;
    *((_DWORD *)P + 13) ^= (*((_DWORD *)P + 13) ^ (v52 + (v32 | (*((unsigned __int8 *)P + 34) << 31)))) & 0x7FFFFFFF;
    v25[34] = v33;
    v35 = v34 - v52;
    if( v35 )
      MiReturnFullProcessCommitment(v50, v35);
    MiUnlockAndDereferenceVad(v25);
  }
  if( v10 < 0 )
    RtlRaiseStatus(v10);
}

Referenced by:

CcLockSystemCacheBuffer
CcPrepareMdlWrite
CcZeroDataInCache
IopProbeAndLockPages
IopProbeAndLockPages_0
IopProbeAndLockPages_1
IopProbeAndLockPages_2
KiOpPatchCode
MiGetWorkingSetInfo
MiGetWorkingSetInfoList
MiLockRetpolineStubs
MiPrepareImagePagesForHotPatch
MmProbeAndLockPages
MmProbeAndLockPagesPrivate
PspIumAllocatePartitionState
SmPrepareForFatalPageError
VmProbeAndLockPages
VslFinalizeSecureImageHash
VslValidateDynamicCodePages
VslpLockMdlForTransfer
VslpLockPagesForTransfer