MiProbeAndLockPages

VOID __stdcall MiProbeAndLockPages(INT64 a1, CHAR a2, INT64 a3){
  _LOCK_OPERATION Operation; 
  char v6; 
  int v7; 
  int v8; 
  UINT64 *v9; 
  unsigned __int64 v10; 
  bool v11; 
  __int64 v12; 
  _DWORD *v13; 
  struct _KPRCB *CurrentPrcb; 
  volatile int DpcRequestSummary; 
  int v16; 
  _ETHREAD *NextThread; 
  NTSTATUS i; 
  unsigned __int64 v19; 
  _QWORD *v20; 
  _MMSUPPORT_INSTANCE *v21; 
  INT64 v22; 
  INT64 v23; 
  INT64 v24; 
  _MMVAD_SHORT *v25; 
  __int64 v26; 
  UINT64 v27; 
  int v28; 
  __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  UINT64 v32; 
  UINT64 UpdateProcessLockedPages; 
  _MI_PROBE_PACKET Packet[52]; 
  UINT64 v35; 
  UINT64 v36; 

  Operation = (int)a3;
  memset(Packet, 0i64, 0xA8u);
  v6 = 0;
  LODWORD(UpdateProcessLockedPages) = 1;
  v7 = MiProbeAndLockPrepare(
         Packet,
         (_MDL *)a1,
         (VOID *)(*(_QWORD *)(a1 + 32) + *(unsigned int *)(a1 + 44)),
         *(unsigned int *)(a1 + 40),
         a2,
         Operation,
         UpdateProcessLockedPages);
  v8 = v7;
  if( v7 < 0 )
    RtlRaiseStatus(v7);
  v9 = *(UINT64 **)&Packet[4];
  v10 = *(_QWORD *)Packet;
  while( 1 )
  {
    v11 = (Packet[16] & 0x20) == 0;
    **(_QWORD **)&Packet[12] = -1i64;
    if( v11 )
      break;
    v26 = *(_QWORD *)&Packet[36];
    if( v10 > *(_QWORD *)&Packet[38] || v10 < *(_QWORD *)&Packet[36] )
      break;
    if( (v6 & 0x3F) != 0 || !MiProbePacketContended((INT64 *)Packet) )
    {
      if( *(_QWORD *)&Packet[40] == -1i64 )
      {
        v36 = *v9;
        v27 = v36;
        MiPteInShadowRange((UINT64)&v36);
        *(_QWORD *)&Packet[32] = (v27 >> 12) & 0xFFFFFFFFFi64;
      }
      else
      {
        *(_QWORD *)&Packet[32] = *(_QWORD *)&Packet[40] + ((v10 - v26) >> 12);
      }
LABEL_18:
      v8 = MiProbeLockFrame(Packet);
      if( v8 < 0 )
        goto LABEL_21;
      v20 = *(_QWORD **)&Packet[12];
      v10 = *(_QWORD *)Packet + 4096i64;
      *(_QWORD *)&Packet[12] += 8i64;
      v9 = (UINT64 *)(*(_QWORD *)&Packet[4] + 8i64);
      *(_QWORD *)&Packet[4] += 8i64;
      *v20 = *(_QWORD *)&Packet[32];
      *(_QWORD *)Packet = v10;
      goto LABEL_20;
    }
LABEL_45:
    MiUnlockProbePacketWorkingSet(Packet);
    MiLockProbePacketWorkingSet(Packet);
    v9 = *(UINT64 **)&Packet[4];
    v10 = *(_QWORD *)Packet;
LABEL_20:
    ++v6;
    if( (unsigned __int64)v9 > *(_QWORD *)&Packet[6] )
      goto LABEL_21;
  }
  if( (v6 & 0xF) != 0 )
    goto LABEL_14;
  v12 = *(_QWORD *)&Packet[24];
  if( *(_QWORD *)&Packet[8] && (unsigned int)MiPageTableLockIsContended(*(__int64 *)&Packet[24], *(UINT64 *)&Packet[8]) )
    goto LABEL_45;
  v13 = (*(_BYTE *)(v12 + 184) & 7) == 2 ? (_DWORD *)((char *)&stru_140C4DB30 + 6544) : (_DWORD *)(v12 + 192);
  if( (*v13 & 0x40000000) != 0 )
    goto LABEL_45;
  CurrentPrcb = KeGetCurrentPrcb();
  DpcRequestSummary = CurrentPrcb->DpcRequestSummary;
  if( (DpcRequestSummary & 1) != 0 )
  {
    v16 = 1;
    if( CurrentPrcb->DpcTimeCount <= 7 )
      goto LABEL_13;
    if( !CurrentPrcb->QuantumEnd )
      goto LABEL_64;
    v28 = 1;
  }
  else
  {
    v16 = 0;
    if( (DpcRequestSummary & 0x1E) != 0 )
    {
      v28 = 2;
      goto LABEL_44;
    }
    if( CurrentPrcb->QuantumEnd )
    {
      v28 = 3;
      goto LABEL_44;
    }
    NextThread = CurrentPrcb->NextThread;
    if( NextThread && NextThread != CurrentPrcb->CurrentThread )
    {
      v28 = 4;
      goto LABEL_44;
    }
LABEL_13:
    if( CurrentPrcb->DpcWatchdogCount <= 7u )
      goto LABEL_14;
    if( !v16 )
    {
LABEL_51:
      _disable();
      CurrentPrcb->DpcWatchdogCount = 0;
      CurrentPrcb->DpcTimeCount = 0;
      KiResetGlobalDpcWatchdogProfiler((INT64)CurrentPrcb);
      _enable();
      v28 = 0;
      goto LABEL_44;
    }
LABEL_64:
    if( (DpcRequestSummary & 0x1E) != 0 )
    {
      v28 = 5;
    }
    else
    {
      if( CurrentPrcb->CurrentThread == CurrentPrcb->IdleThread )
        goto LABEL_51;
      v28 = 6;
    }
  }
LABEL_44:
  if( v28 )
    goto LABEL_45;
LABEL_14:
  LODWORD(v35) = 0;
  for( i = MiLockPageLeafPageTable((INT64)Packet);
        *(_QWORD *)&Packet[10] != ZeroPte.u.Long;
        i = MiLockPageLeafPageTable((INT64)Packet) )
  {
    i = MiProbeLeafPteAccess((INT64)Packet, (UINT64)&v35);
    if( i < 0 )
      break;
    if( !(_DWORD)v35 )
    {
      v19 = *(_QWORD *)&Packet[10];
      MiPteInShadowRange((UINT64)&Packet[10]);
      *(_QWORD *)&Packet[32] = (v19 >> 12) & 0xFFFFFFFFFi64;
      MiSetProbePagesAhead((INT64)Packet);
      goto LABEL_18;
    }
    if( (_DWORD)v35 != 1 )
    {
      i = MiFaultInProbeAddress(Packet);
      if( i < 0 )
      {
        ++*(&stru_140C4DB30 + 611);
        break;
      }
    }
  }
  v8 = i;
  if( i >= 0 )
    goto LABEL_18;
LABEL_21:
  v21 = *(_MMSUPPORT_INSTANCE **)&Packet[24];
  if( *(_QWORD *)&Packet[8] )
    MiUnlockPageTableInternal(*(INT64 *)&Packet[24], *(UINT64 *)&Packet[8]);
  MiUnlockWorkingSetShared(v21, LOBYTE(Packet[17]));
  v24 = *(_QWORD *)&Packet[14];
  if( (MmTrackLockedPages & 1) != 0 )
    MiAddMdlTracker(
      *(_MDL **)&Packet[14],
      (*(unsigned int *)(*(_QWORD *)&Packet[14] + 40i64)
     + 4095i64
     + (unsigned __int64)((*(_DWORD *)(*(_QWORD *)&Packet[14] + 32i64) + *(_DWORD *)(*(_QWORD *)&Packet[14] + 44i64)) & 0xFFF)) >> 12,
      3ui64);
  if( v8 < 0 )
  {
    MmUnlockPages(v24, v22, v23);
    ++*(&stru_140C4DB30 + 620);
  }
  v25 = *(_MMVAD_SHORT **)&Packet[30];
  if( *(_QWORD *)&Packet[30] )
  {
    v29 = *(unsigned int *)(*(_QWORD *)&Packet[30] + 52i64);
    LODWORD(v29) = v29 & 0x7FFFFFFF;
    v30 = (*(_QWORD *)&Packet[26]
         + (v29 | ((unsigned __int64)*(unsigned __int8 *)(*(_QWORD *)&Packet[30] + 34i64) << 31))) >> 31;
    v31 = *(_QWORD *)&Packet[28];
    *(_DWORD *)(*(_QWORD *)&Packet[30] + 52i64) ^= (*(_DWORD *)(*(_QWORD *)&Packet[30] + 52i64) ^ (Packet[26]
                                                                                                 + (v29 | (*(unsigned __int8 *)(*(_QWORD *)&Packet[30] + 34i64) << 31)))) & 0x7FFFFFFF;
    v25->CommitChargeHigh = v30;
    v32 = v31 - *(_QWORD *)&Packet[26];
    if( v32 )
      MiReturnFullProcessCommitment(*(_EPROCESS **)&Packet[20], v32);
    MiUnlockAndDereferenceVad(v25);
  }
  if( v8 < 0 )
    RtlRaiseStatus(v8);
}

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