共用方式為


使用 ioConnectInterruptEx 的 CONNECT_LINE_BASED 版本

針對 Windows Vista 和更新版本的作業系統,驅動程式可以使用 ioConnectInterruptEx 的CONNECT_LINE_BASED版本來註冊驅動程式行型中斷的 InterruptService 常式。 (舊版作業系統的驅動程式可以使用 IoConnectInterruptEx.) 的 CONNECT_FULLY_SPECIFIED 版本

注意 您只能針對註冊單一插斷服務常式的驅動程式使用此方法, (ISR) 的所有行型中斷。 如果驅動程式可以接收多個中斷,則必須使用 ioConnectInterruptEx CONNECT_FULLY_SPECIFIED 版。

驅動程式會指定Parameters-Version> 的 CONNECT_LINE_BASED 值,並使用Parameters-LineBased > 的成員來指定作業的其他參數:

  • Parameters-LineBased.PhysicalDeviceObject會指定 ISR 服務裝置的實體裝置物件 (PDO) 。> 系統會使用裝置物件來自動識別裝置的線路中斷。

  • Parameters-LineBased.ServiceRoutine> 會指向InterruptService常式,而Parameters-LineBased >ServiceCoNtext會指定系統傳遞為ServiceCoNtext參數給InterruptService的值。 驅動程式可以使用這個來傳遞內容資訊。 如需傳遞內容資訊的詳細資訊,請參閱 提供 ISR 內容資訊

  • 驅動程式會在Parameters-LineBased.InterruptObject >中提供 PKINTERRUPT 變數的指標。 IoConnectInterruptEx 會將這個變數設定為指向中斷的中斷物件,這可在移除 ISR 時使用。 如需詳細資訊,請參閱 移除 ISR

  • 驅動程式可以選擇性地在Parameters-LineBased.SpinLock >中指定微調鎖定,讓系統在與 ISR 同步處理時使用。 大部分驅動程式只能指定 Null ,讓系統代表驅動程式配置微調鎖定。 如需與 ISR 同步處理的詳細資訊,請參閱 同步處理裝置資料的存取

下列程式碼範例示範如何使用 CONNECT_LINE_BASED註冊 InterruptService 常式:

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->IntObj is a PKINTERRUPT.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// PhysicalDeviceObject is a pointer to the device's PDO. 
// ServiceContext is a pointer to driver-specified context for the ISR.

RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_LINE_BASED;
params.LineBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.LineBased.InterruptObject = &deviceExtension->IntObj;
params.LineBased.ServiceRoutine = deviceInterruptService;
params.LineBased.ServiceContext = ServiceContext;
params.LineBased.SpinLock = NULL;
params.LineBased.SynchronizeIrql = 0;
params.LineBased.FloatingSave = FALSE;

status = IoConnectInterruptEx(&params);

if (!NT_SUCCESS(status)) {
    // Operation failed. Handle error.
    ...
}