VfInsertContext

INT64 __fastcall VfInsertContext(UINT16 *a1){
  unsigned int v1; 
  unsigned int v4; 
  CHAR *ContextPointer; 
  void *v6; 
  volatile signed __int64 v7; 
  __int64 v8; 
  v1 = 0;
  if( !ViVerifierEnabled )
    return 3221225473i64;
  if( !ViIsContextIdValid((VF_OBJECT_TYPE)*a1, a1[1]) )
    return 3221225485i64;
  ContextPointer = ViGetContextPointer(*((_QWORD *)a1 + 1), v4);
  if( !ContextPointer )
    return 3221225659i64;
  while( !ViLockContextPointer((INT64 *)ContextPointer) )
  {
    LODWORD(v6) = ViAllocateContextTable(*a1);
    if( !v6 )
      return 3221225626i64;
    if( !_InterlockedCompareExchange64((volatile signed __int64 *)ContextPointer, (signed __int64)v6, 0i64) )
      break;
    ViFreeContextTable(v6);
  }
  v7 = *(_QWORD *)ContextPointer;
  v8 = a1[1];
  if( *(_QWORD *)(*(_QWORD *)ContextPointer + 8 * v8 + 8) )
  {
    v1 = -1073741270;
  }
  else
  {
    *(_QWORD *)(v7 + 8 * v8 + 8) = a1;
    _InterlockedIncrement((volatile signed __int32 *)(v7 + 4));
    _InterlockedIncrement((volatile signed __int32 *)a1 + 1);
  }
  ViUnlockContextPointer((volatile INT64 *)ContextPointer);
  return v1;
}

Referenced by:

No references.