MiSetVadFlags

INT64 __fastcall MiSetVadFlags(INT64 a1, CHAR a2, CHAR a3){
  unsigned __int8 CurrentIrql; 
  signed __int32 v7; 
  signed __int32 v8; 
  signed __int32 v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  signed __int32 v14; 
  signed __int32 v15; 
  INT64 result; 
  UINT64 SpinCount; 
  LODWORD(SpinCount) = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v7 = *(_DWORD *)(a1 + 48);
  do
  {
    while( (v7 & 1) != 0 )
    {
      if( (v7 & 2) != 0 )
      {
        LODWORD(SpinCount) = 0;
        do
        {
          KeYieldProcessorEx(&SpinCount);
          v7 = *(_DWORD *)(a1 + 48);
        }
        while( (v7 & 1) != 0 );
      }
      else
      {
        v7 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v7 | 2, v7);
      }
    }
    v8 = v7;
    v7 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v7 & 0xFFFFFFFC | 1, v7);
  }
  while( v8 != v7 );
  v9 = *(_DWORD *)(a1 + 48);
  v10 = a2 & 1;
  v11 = a2 & 2;
  v12 = a2 & 4;
  v13 = a3 & 1;
  do
  {
    v14 = v9;
    if( v10 )
    {
      v13 = a3 & 1;
      v14 = v9 & 0xFFFFFFF7 | (8 * v13);
    }
    if( v11 )
      v14 = (4 * v13) | v14 & 0xFFFFFFFB;
    else
      v13 = a3 & 1;
    if( v12 )
      v14 = v14 & 0xFFBFFFFF | (v13 << 22);
    v15 = v9;
    v9 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v14, v9);
  }
  while( v15 != v9 );
  _InterlockedAnd((volatile signed __int32 *)(a1 + 48), 0xFFFFFFFC);
  result = CurrentIrql;
  __writecr8(CurrentIrql);
  return result;
}

Referenced by:

MiAddSecureEntry
MiDeleteVad
MiRemoveSecureEntry
MiSetImageHotPatchAllowed