MiUnlockNestedPageTableWritePte

VOID __stdcall MiUnlockNestedPageTableWritePte(INT64 a1, INT64 *a2, INT64 a3, INT64 a4){
  int v5; 
  INT64 *v6; 
  _MMPTE *PxeSelfRef; 
  int v9; 
  _MMPTE *NextPteToAge; 
  int v11; 
  int v12; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  v5 = a4;
  v6 = a2;
  PxeSelfRef = MmGetPxeSelfRef();
  if( (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)a2 >> 9) & 0x7FFFFFFFF8i64)) == PxeSelfRef )
  {
    v9 = 1;
    if( !(_DWORD)a4 )
      KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
  }
  else
  {
    v9 = 0;
  }
  NextPteToAge = 0i64;
  if( (*(_BYTE *)(a1 + 184) & 7) == 0 && v6 >= (INT64 *)MmGetPml4eBase() && v6 <= (INT64 *)MmGetPml4eLimit() )
    NextPteToAge = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[15].NextPteToAge;
  if( v6 == (INT64 *)PxeSelfRef )
  {
    MI_INTERLOCKED_EXCHANGE_PTE(v6, a3);
    goto LABEL_11;
  }
  if( NextPteToAge )
  {
    if( (a3 & 1) != 0 )
      goto LABEL_11;
    goto LABEL_21;
  }
  LOBYTE(v11) = MiShouldLockPteDirectly(a1, (UINT64)v6);
  if( !v11 )
  {
    if( (a3 & 1) != 0 )
    {
      MiWriteValidPteNewProtection(v6, a3);
      goto LABEL_11;
    }
LABEL_21:
    MiPteInShadowRange((UINT64)v6);
    *v6 = a3;
    goto LABEL_11;
  }
  _InterlockedExchange64(v6, a3);
  LOBYTE(v12) = MiPteInShadowRange((UINT64)v6);
  if( v12 )
    MiWritePteShadow();
  v6 = 0i64;
LABEL_11:
  if( v9 && !v5 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
  }
  if( v6 )
    MiUnlockPageTableInternal(a1, (UINT64)v6);
}

Referenced by:

MiClearPteAccessed
MiEvictPageTableLock
MiRewritePteWithLockBit
MiWsleFlush