共用方式為


在 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 時,使用 參數->並將版本 設為 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.
    }
}