ViLockContextPointer

CHAR __fastcall ViLockContextPointer(INT64 *a1){
  INT64 v2; 
  INT64 v3; 
  UINT64 SpinCount; 
  LODWORD(SpinCount) = 0;
  do
  {
    while( 1 )
    {
      _m_prefetchw(a1);
      v2 = *a1;
      if( (*a1 & 1) != 0 )
        break;
      if( !v2 )
        return v2;
      KeYieldProcessorEx(&SpinCount);
    }
    v3 = *a1;
  }
  while( v3 != _InterlockedCompareExchange64(a1, v2 - 1, v2) );
  LOBYTE(v2) = 1;
  return v2;
}

Referenced by:

VfInsertContext
VfRemoveContext
ViQueryObjectContext