KiIntSteerUpdateDeviceInterruptMask
NTSTATUS __fastcall KiIntSteerUpdateDeviceInterruptMask(INT64 a1, INT64 a2, INT64 a3){
int v3;
NTSTATUS result;
_KPRCB *Prcb;
_KAFFINITY_ENUMERATION_CONTEXT Context;
UINT64 ProcIndex;
HIDWORD(ProcIndex) = HIDWORD(a3);
v3 = a2;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
LODWORD(ProcIndex) = 0;
Context.CurrentIndex = *(_WORD *)(a1 + 8);
Context.CurrentMask = *(_QWORD *)a1;
Context.Affinity = 0i64;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( result )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
if( v3 )
{
if( v3 == 1 && Prcb->DeviceInterrupts-- == 1 )
_interlockedbittestandset64((volatile signed __int32 *)&Prcb->ParentNode->NonIsrTargetedSet, Prcb->GroupIndex);
}
else if( ++Prcb->DeviceInterrupts == 1 )
{
_interlockedbittestandreset64((volatile signed __int32 *)&Prcb->ParentNode->NonIsrTargetedSet, Prcb->GroupIndex);
}
}
return result;
}Referenced by:
KiIntSteerConnect
KiIntSteerDisable
KiIntSteerDistributeInterrupts