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