KeAllocateInterrupt

_KINTERRUPT *__stdcall KeAllocateInterrupt(_KPRCB *Prcb){
  union _SLIST_HEADER *v1; 
  unsigned int v3; 
  _KINTERRUPT *result; 
  UINT64 v5; 
  UINT64 v6; 
  unsigned int v7; 
  struct _SLIST_ENTRY *v8; 
  __int64 v9; 
  v1 = (union _SLIST_HEADER *)((char *)Prcb + 12416);
  v3 = *(unsigned __int16 *)(*((_QWORD *)Prcb + 24) + 146i64);
  result = (_KINTERRUPT *)RtlpInterlockedPopEntrySList((PSLIST_HEADER)((char *)Prcb + 12416));
  if( result )
  {
LABEL_2:
    *(_QWORD *)&result[1].Type = Prcb;
  }
  else
  {
    v7 = v3;
    while( 1 )
    {
      MmAllocateIndependentPages(0x1000ui64, v7, v5, v6);
      v8 = (struct _SLIST_ENTRY *)result;
      if( !result )
        break;
      v9 = 12i64;
      do
      {
        RtlpInterlockedPushEntrySList(v1, v8);
        v8 += 20;
        --v9;
      }
      while( v9 );
      result = (_KINTERRUPT *)RtlpInterlockedPopEntrySList(v1);
      if( result )
        goto LABEL_2;
    }
  }
  return result;
}

Referenced by:

IopConnectInterrupt