VfRemoveContext

NTSTATUS __stdcall VfRemoveContext(_VF_CONTEXT_HEADER *Context){
  NTSTATUS v2; 
  _VF_OBJECT_TYPE v4; 
  _VF_CONTEXT_POINTER *ContextPointer; 
  _VF_CONTEXT_POINTER *v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned int v9; 

  v2 = -1073741275;
  if( !ViVerifierEnabled )
    return -1073741823;
  if( !ViIsContextIdValid((_VF_OBJECT_TYPE)*(unsigned __int16 *)Context, *((unsigned __int16 *)Context + 1)) )
    return -1073741811;
  ContextPointer = ViGetContextPointer(*((VOID **)Context + 1), v4);
  v6 = ContextPointer;
  if( !ContextPointer )
    return -1073741637;
  if( !ViLockContextPointer(ContextPointer) )
    return v2;
  v7 = *(_QWORD *)v6;
  v8 = *((unsigned __int16 *)Context + 1);
  if( *(_VF_CONTEXT_HEADER **)(*(_QWORD *)v6 + 8 * v8 + 8) != Context
    || (*(_QWORD *)(v7 + 8 * v8 + 8) = 0i64,
        v2 = 0,
        _InterlockedExchangeAdd((volatile signed __int32 *)(v7 + 4), 0xFFFFFFFF) != 1) )
  {
    ViUnlockContextPointer(v6);
    if( v2 >= 0 && !(v9 + _InterlockedExchangeAdd(Context + 1, v9)) )
      (*((void(__fastcall **)(_VF_CONTEXT_HEADER *))Context + 2))(Context);
    return v2;
  }
  _InterlockedExchange64((volatile __int64 *)v6, 0i64);
  if( _InterlockedExchangeAdd(Context + 1, 0xFFFFFFFF) == 1 )
    (*((void(__fastcall **)(_VF_CONTEXT_HEADER *, __int64))Context + 2))(Context, 0xFFFFFFFFi64);
  ViFreeContextTable((_VF_CONTEXT_TABLE *)v7);
  return 0;
}

Referenced by:

No references.