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.