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