MiLockPageTableInternal

NTSTATUS __stdcall MiLockPageTableInternal(INT64 a1, UINT64 a2, UINT8 *a3){
  NTSTATUS v4; 
  char v5; 
  char v6; 
  _MMPTE *Pml4eBase; 
  _MMPTE *Pml4eLimit; 
  unsigned __int64 v9; 
  int v10; 
  signed __int64 v11; 
  int v12; 
  _MMPTE *NextPteToAge; 
  UINT64 *v15; 
  _KLOCK_QUEUE_HANDLE *SelfmapLockHandle; 
  volatile signed __int32 *PageTableLockBuffer; 
  unsigned __int32 v18; 
  char i; 
  bool v20; 
  signed __int32 v21; 
  signed __int64 v22; 
  struct _KPRCB *CurrentPrcb; 
  int v24; 
  signed __int32 v25; 
  volatile int *v26; 
  int v27; 
  UINT64 SpinCount; 

  v4 = 0;
  v5 = (char)a3;
  v6 = *(_BYTE *)(a1 + 184) & 7;
  v27 = 0;
  if( (_MMPTE *)a2 == MmGetPxeSelfRef() )
  {
    if( v6 )
    {
      if( v6 == 7 )
      {
        v15 = (UINT64 *)((char *)&stru_140C4DB30 + 1800);
        SelfmapLockHandle = &KeGetCurrentPrcb()->SelfmapLockHandle[1];
      }
      else
      {
        CurrentPrcb = KeGetCurrentPrcb();
        if( v6 == 5 )
        {
          v15 = (UINT64 *)((char *)&stru_140C4DB30 + 1792);
          SelfmapLockHandle = CurrentPrcb->SelfmapLockHandle;
        }
        else
        {
          v15 = (UINT64 *)((char *)&stru_140C4DB30 + 1816);
          SelfmapLockHandle = &CurrentPrcb->SelfmapLockHandle[3];
        }
      }
    }
    else
    {
      v15 = (UINT64 *)(a1 + 176);
      SelfmapLockHandle = &KeGetCurrentPrcb()->SelfmapLockHandle[2];
    }
    SelfmapLockHandle->LockQueue.Next = 0i64;
    SelfmapLockHandle->LockQueue.Lock = v15;
    if( ((unsigned __int8)a3 & 1) != 0 )
      return KxTryToAcquireQueuedSpinLock(&SelfmapLockHandle->LockQueue, v15);
    if( _InterlockedExchange64((volatile __int64 *)v15, (__int64)SelfmapLockHandle) )
    {
      KxWaitForLockOwnerShip((INT64)SelfmapLockHandle);
      return 1;
    }
    return 1;
  }
  Pml4eBase = MmGetPml4eBase();
  Pml4eLimit = MmGetPml4eLimit();
  if( v6 )
  {
    if( a2 >= (unsigned __int64)Pml4eBase && a2 <= (unsigned __int64)Pml4eLimit )
    {
      LODWORD(SpinCount) = 0;
      PageTableLockBuffer = (volatile signed __int32 *)MiGetPageTableLockBuffer(a1, a2, &v27);
      v18 = *PageTableLockBuffer;
      for( i = v27; ; i = v27 )
      {
        while( ((v18 >> i) & 1) != 0 )
        {
          if( (v5 & 1) != 0 )
            return 0;
          if( ((v18 >> i) & 2) != 0 )
          {
            do
            {
              KeYieldProcessorEx(&SpinCount);
              v18 = *PageTableLockBuffer;
              i = v27;
            }
            while( (((unsigned __int32)*PageTableLockBuffer >> v27) & 1) != 0 );
          }
          else
          {
            v24 = v18 | (2 << i);
            v25 = _InterlockedCompareExchange(PageTableLockBuffer, v24, v18);
            v20 = v18 == v25;
            i = v27;
            v18 = v25;
            if( v20 )
              v18 = v24;
          }
        }
        v21 = _InterlockedCompareExchange(PageTableLockBuffer, ~(2 << i) & (v18 | (1 << i)), v18);
        v20 = v18 == v21;
        v18 = v21;
        if( v20 )
          return 1;
        if( (v5 & 1) != 0 )
          break;
      }
      return 0;
    }
  }
  else if( a2 >= (unsigned __int64)Pml4eBase && a2 <= (unsigned __int64)Pml4eLimit )
  {
    NextPteToAge = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[15].NextPteToAge;
    if( NextPteToAge )
    {
      v26 = (volatile int *)NextPteToAge + ((a2 >> 3) & 0x1FF);
      if( (v5 & 4) != 0 )
      {
        ExAcquireSpinLockSharedAtDpcLevel(v26);
        return 1;
      }
      if( (v5 & 1) == 0 )
      {
        ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)v26);
        return 1;
      }
      return ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)v26) != 0;
    }
  }
  v9 = *(_QWORD *)a2;
  v10 = 0;
  if( (*(_QWORD *)a2 & 1) == 0 )
    return v4;
  v11 = *(_QWORD *)a2;
  v12 = v5 & 1;
  while( 1 )
  {
    if( (v9 & 0x1000000000000000i64) != 0 )
    {
      if( (v5 & 1) != 0 )
        return v4;
      if( ((v9 >> 60) & 2) != 0 )
      {
        do
        {
          ++v10;
          _mm_pause();
          v9 = *(_QWORD *)a2;
        }
        while( (*(_QWORD *)a2 & 0x1000000000000000i64) != 0 );
      }
      else
      {
        v9 |= 0x2000000000000000ui64;
        v22 = _InterlockedCompareExchange64((volatile signed __int64 *)a2, v9, v11);
        if( v22 != v11 )
          v9 = v22;
      }
      v12 = v5 & 1;
      goto LABEL_28;
    }
    v9 = _InterlockedCompareExchange64(
           (volatile signed __int64 *)a2,
           v9 & 0xCFFFFFFFFFFFFFDFui64 | 0x1000000000000020i64,
           v11);
    if( v11 == v9 )
      return 1;
    if( v12 )
      return v4;
LABEL_28:
    v11 = v9;
    if( (v9 & 1) == 0 )
      return v4;
  }
}

Referenced by:

MiAllocateKernelStackPages
MiClearPteAccessed
MiDeleteKernelStack
MiEncodeProtoFill
MiEvictPageTableLock
MiFastLockLeafPageTable
MiFaultInPagedPool
MiFreePhysicalPages
MiGetNextPageTablePte
MiGetWsAndMakePageTablesNx
MiInitializeWorkingSetList
MiIsPageTableDeletable
MiJumpStackTarget
MiLockCode
MiLockDriverPageRange
MiLockLowestValidPageTable
MiLockPageLeafPageTable
MiLockPageTable
MiLockWorkingSetOptimal
MiMakeDriverPagesPrivate
MiMakeSystemCacheRangeValid
MiMapMdlCommon
MiMapRetpolineStubs
MiMapWithLargePages
MiMarkBootKernelStack
MiOutPageSingleKernelStack
MiReleaseLargePteMappings
MiRemoveMappedPtes
MiReplaceRotateWithDemandZero
MiRewritePteWithLockBit
MiScrubAwePage
MiSetPagingOfDriver
MiSetSystemCodeProtection
MiSwapStackPage
MiSwitchToTransition
MiUnlockPageTableRange
MiUnmapMdlCommon
MiUnmapPatchTable
MiUnmapRetpolineStubs
MiUpdateImportRelocationsOnDriverPrivatePages
MiUserFault
MiWalkPageTables
MiWalkPageTablesRecursively
MiWsleFlush
MmFreeLoaderBlock
MmProtectPool
MmReplaceImportEntry