IopGetInterruptConnectionData

NTSTATUS __stdcall IopGetInterruptConnectionData(
        PDEVICE_OBJECT PhysicalDeviceObject,
        _INTERRUPT_CONNECTION_DATA **ConnectionDataOut){
  NTSTATUS result; 
  _INTERRUPT_CONNECTION_DATA *Data; 
  int DevicePropertyData; 
  UINT64 Size; 
  UINT64 Sizea; 
  UINT64 NumberOfBytes; 
  UINT64 Type; 

  *ConnectionDataOut = 0i64;
  LODWORD(NumberOfBytes) = 0;
  LODWORD(Type) = 0;
  LODWORD(Size) = 0;
  result = IoGetDevicePropertyData(
             PhysicalDeviceObject,
             (_DEVPROPKEY *)&INTERRUPT_CONNECTION_DATA_PKEY,
             0i64,
             0i64,
             Size,
             0i64,
             &NumberOfBytes,
             &Type);
  if( result == -1073741789 && (unsigned int)NumberOfBytes >= 0x60 )
  {
    Data = (_INTERRUPT_CONNECTION_DATA *)ExAllocatePoolWithTag(0x200ui64, (unsigned int)NumberOfBytes, 1869181008i64);
    if( !Data )
      return -1073741670;
    LODWORD(Sizea) = NumberOfBytes;
    DevicePropertyData = IoGetDevicePropertyData(
                           PhysicalDeviceObject,
                           (_DEVPROPKEY *)&INTERRUPT_CONNECTION_DATA_PKEY,
                           0i64,
                           0i64,
                           Sizea,
                           Data,
                           &NumberOfBytes,
                           &Type);
    if( DevicePropertyData >= 0 )
    {
      if( (unsigned int)NumberOfBytes >= 88 * Data->Count + 8 )
      {
        *ConnectionDataOut = Data;
        return DevicePropertyData;
      }
      DevicePropertyData = -1073741762;
    }
    ExFreePoolWithTag(Data, 0);
    return DevicePropertyData;
  }
  return result;
}

Referenced by:

IoConnectInterruptEx
IopConnectLineBasedInterrupt
IopConnectMessageBasedInterrupt