針對 Windows Vista 和更新版本的作業系統,驅動程式可以使用 CONNECT_LINE_BASED 版本的 IoConnectInterruptEx 來註冊驅動程式線性中斷的 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( ¶ms, 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(¶ms);
if (!NT_SUCCESS(status)) {
// Operation failed. Handle error.
...
}