在 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( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
// Set members of params.MessageBased here.
status = IoConnectInterruptEx(¶ms);
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(¶ms);
} else {
// Other error.
}
}