使用 ioConnectInterruptEx CONNECT_MESSAGE_BASED 版本
針對 Windows Vista 和更新版本的作業系統,驅動程式可以使用 ioConnectInterruptEx 的CONNECT_MESSAGE_BASED版本來註冊驅動程式訊息訊號中斷的 ISR。 驅動程式會指定Parameters-Version> CONNECT_MESSAGE_BASED 的值,並使用 Parameters-MessageBased > 的成員來指定作業的其他參數。
Parameters-MessageBased.PhysicalDeviceObject >會指定 ISR 服務裝置的 PDO。 系統會使用裝置物件來自動識別裝置的訊息訊號中斷。
Parameters-MessageBased.MessageServiceRoutine >會指向InterruptMessageService常式,而Parameters-MessageBased.ServiceCoNtext >會指定系統傳遞為ServiceCoNtext參數至InterruptMessageService的值。 驅動程式可以使用這個來傳遞內容資訊。 如需傳遞內容資訊的詳細資訊,請參閱 提供 ISR 內容資訊。
驅動程式也可以在Parameters-MessageBased.FallBackServiceRoutine >中指定後援InterruptMessageService常式。 如果裝置有行型中斷,但沒有訊息訊號中斷,系統將會改為註冊 InterruptMessageService 常式來服務行型中斷。 在此情況下,系統會將Parameters-MessageBased.ServiceCoNtext >作為ServiceCoNtext參數傳遞至InterruptService。 IoConnectInterruptEx會在註冊後援常式時,將Parameters-Version >更新為CONNECT_LINE_BASED。
Parameters-MessageBased.ConnectionCoNtext >指向可接收InterruptMessageService) 結構的IO_INTERRUPT_MESSAGE_INFO (指標的變數,或針對 InterruptService) 接收KINTERRUPT結構 (的變數。 驅動程式可以使用收到的指標來移除 ISR。 如需詳細資訊,請參閱 移除 ISR。
驅動程式可以選擇性地在Parameters-MessageBased.SpinLock >中指定微調鎖定,讓系統在與 ISR 同步處理時使用。 大部分驅動程式只能指定 Null ,讓系統代表驅動程式配置微調鎖定。 如需與 ISR 同步處理的詳細資訊,請參閱 同步處理裝置資料的存取。
下列程式碼範例示範如何使用 CONNECT_MESSAGE_BASED來註冊 InterruptMessageService 常式。
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntInfo is a PVOID.
// deviceExtension->IntType is a ULONG.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// deviceInterruptMessageService is a pointer to the driver's InterruptMessageService routine.
// PhysicalDeviceObject is a pointer to the device's PDO.
// ServiceContext is a pointer to driver-specified context for the ISR.
RtlZeroMemory( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
params.MessageBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.MessageBased.MessageServiceRoutine = deviceInterruptMessageService;
params.MessageBased.ServiceContext = ServiceContext;
params.MessageBased.SpinLock = NULL;
params.MessageBased.SynchronizeIrql = 0;
params.MessageBased.FloatingSave = FALSE;
params.MessageBased.FallBackServiceRoutine = deviceInterruptService;
status = IoConnectInterruptEx(¶ms);
if (NT_SUCCESS(status)) {
// We record the type of ISR registered.
devExt->IsrType = params.Version;
} else {
// Operation failed. Handle error.
...
}