KeAllocateInterrupt
_KINTERRUPT *__stdcall KeAllocateInterrupt(_KPRCB *Prcb){
_SLIST_HEADER *p_InterruptObjectPool;
unsigned int v3;
_KINTERRUPT *result;
unsigned int v5;
_SLIST_ENTRY *v6;
__int64 v7;
p_InterruptObjectPool = &Prcb->InterruptObjectPool;
v3 = Prcb->ParentNode->Affinity.Reserved[0];
result = (_KINTERRUPT *)RtlpInterlockedPopEntrySList(&Prcb->InterruptObjectPool);
if( result )
{
LABEL_2:
*(_QWORD *)&result[1].Type = Prcb;
}
else
{
v5 = v3;
while( 1 )
{
result = (_KINTERRUPT *)MmAllocateIndependentPages(0x1000ui64, v5);
v6 = (_SLIST_ENTRY *)result;
if( !result )
break;
v7 = 12i64;
do
{
RtlpInterlockedPushEntrySList(p_InterruptObjectPool, v6);
v6 += 20;
--v7;
}
while( v7 );
result = (_KINTERRUPT *)RtlpInterlockedPopEntrySList(p_InterruptObjectPool);
if( result )
goto LABEL_2;
}
}
return result;
}Referenced by:
IopConnectInterrupt