MiLockVadCore

UINT8 __fastcall MiLockVadCore(INT64 a1){
  UINT8 CurrentIrql; 
  signed __int32 v3; 
  signed __int32 v4; 
  UINT64 SpinCount; 
  LODWORD(SpinCount) = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v3 = *(_DWORD *)(a1 + 48);
  do
  {
    while( (v3 & 1) != 0 )
    {
      if( (v3 & 2) != 0 )
      {
        LODWORD(SpinCount) = 0;
        do
        {
          KeYieldProcessorEx(&SpinCount);
          v3 = *(_DWORD *)(a1 + 48);
        }
        while( (v3 & 1) != 0 );
      }
      else
      {
        v3 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v3 | 2, v3);
      }
    }
    v4 = v3;
    v3 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v3 & 0xFFFFFFFC | 1, v3);
  }
  while( v4 != v3 );
  return CurrentIrql;
}

Referenced by:

MiCaptureWriteWatchDirtyBit
NtGetWriteWatch