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.