共用方式為


在 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,請重試參數版本> 設定為 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.
    }
}