使用 Windows Vista 以前的 IoConnectInterruptEx

适用于 Windows 2000、Windows XP 或 Windows Server 2003 的驱动程序可以链接到 Iointex.lib 库,以在这些版本的操作系统上使用 IoConnectInterruptEx

若要在此类驱动程序中使用 IoConnectInterruptEx ,请在驱动程序的源代码中包含 Iointex.h,紧跟在 Wdm.h 或 Ntddk.h 之后。 Iointex.h 标头声明例程的原型。 生成驱动程序时,请确保它静态链接到 Iointex.lib。

对于 Windows Vista 之前的操作系统, Iointex.lib 提供的 IoConnectInterruptEx 版本仅支持例程的 CONNECT_FULLY_SPECIFIED 版本。 如果指定了任何其他版本,则例程将返回 NTSTATUS 错误代码,并将 Parameters-Version> 设置为 CONNECT_FULLY_SPECIFIED。

使用此行为,可以编写驱动程序,使其在 Windows Vista 上使用CONNECT_LINE_BASED或CONNECT_MESSAGE_BASED,并在早期操作系统上CONNECT_FULLY_SPECIFIED。 首先调用 IoConnectInterruptEx其 Parameters-Version> 等于 CONNECT_LINE_BASED 或 CONNECT_MESSAGE_BASED。 如果返回值为错误代码且 Parameters-Version> != CONNECT_FULLY_SPECIFIED,则重试操作,并将Parameters-Version> 设置为 CONNECT_FULLY_SPECIFIED。

下面的代码示例演示了此方法:

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->MessageUsed is a BOOLEAN.

RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;

// Set members of params.MessageBased here.

status = IoConnectInterruptEx(&params);

if ( NT_SUCCESS(status) ) {
    // Operation succeeded. We are running on Windows Vista.
    devExt->MessageUsed = TRUE; // We save this for posterity.
} else {
    // Check to see if we are running on an operating system prior to Windows Vista.
    if (params.Version == CONNECT_FULLY_SPECIFIED) {
        devExt->MessageUsed = FALSE;  // We're not using message-signaled interrupts.
 
        // Set members of params.FullySpecified here.
 
        status = IoConnectInterruptEx(&params);
    } else {
        // Other error.
    }
}