ViCtxCaptureInitialIsrState
CHAR *__fastcall ViCtxCaptureInitialIsrState(INT64 a1){
int v1;
__int64 *v2;
UINT64 v3;
_InterlockedAdd(&ViCtxInterrupts, 1u);
v1 = 0;
while( 1 )
{
v2 = &ViCtxIsrStateBlocks[10 * (((unsigned __int8)_InterlockedExchangeAdd(&ViCtxHintIndex, 1u) + 1) & 0xF)];
if( !_InterlockedCompareExchange((volatile signed __int32 *)v2, 1, 0) )
break;
if( (unsigned int)++v1 >= 0x10 )
{
v2 = 0i64;
break;
}
}
if( v2 )
{
v3 = ViCtxXStateEnabledMask;
*((_BYTE *)v2 + 8) = KeGetCurrentIrql();
if( ((v3 & 0xFFFFFFFFFFFFFFFCui64) != 0 || !*(_BYTE *)(a1 + 94)) && (*((_DWORD *)v2 + 1) & 1) != 0 )
{
RtlXSave((XSAVE_AREA *)v2[4], v3);
*((_DWORD *)v2 + 1) |= 2u;
}
_InterlockedAdd(&ViCtxInterruptsChecked, 1u);
}
return(CHAR *)v2;
}Referenced by:
ViCtxIsr
ViCtxIsrMessageBased