共用方式為


同步處理插斷碼 (UMDF 1)

警告

UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的 UMDF 驅動程式都應該使用 UMDF 2 撰寫。 未將新功能新增至 UMDF 1,且較新版本的WINDOWS 10上,UMDF 1 的支援有限。 通用 Windows 驅動程式必須使用 UMDF 2。

封存的 UMDF 1 範例可在Windows 11 22H2 - 2022 年 5 月驅動程式範例更新中找到。

如需詳細資訊,請參閱使用 UMDF 消費者入門

存取中斷資料緩衝區的所有驅動程式程式碼都必須同步處理,如此一次只能有一個常式存取資料。

您可以使用手動中斷鎖定或自動回呼序列化來同步處理中斷程式碼。

手動中斷鎖定

UMDF 會在呼叫 OnInterruptIsrOnInterruptDisableOnInterruptEnable 回呼之前取得中斷鎖定。

如果驅動程式需要使用中斷鎖定來同步處理任何程式碼,它會呼叫 IWDFInterrupt::AcquireInterruptLockIWDFInterrupt::ReleaseInterruptLock。 例如,驅動程式會使用這些方法來取得並釋放 其 OnInterruptWorkItem 回呼常式中的中斷鎖定。 不過,在 I/O 分派回呼中, (例如 OnReadOnWrite) ,驅動程式會先呼叫 IWDFInterrupt::TryToAcquireInterruptLock 來決定將工作專案排入佇列,或在相同的執行緒中執行工作,以避免潛在的死結。 如需從任意執行緒內容呼叫 IWDFInterrupt::AcquireInterruptLock 所造成的死結案例範例,請參閱 IWDFInterrupt::AcquireInterruptLock的一節。

如果 IWDFInterrupt::TryToAcquireInterruptLock 傳回 TRUE,驅動程式已在相同的執行緒中取得中斷鎖定。 在此情況下,驅動程式會執行需要該鎖定的工作,然後呼叫 ReleaseInterruptLock。 如果 IWDFInterrupt::TryToAcquireInterruptLock 傳回 FALSE,驅動程式會將工作專案排入佇列,並在其 OnWorkItem 回 呼中執行工作。 在此情況下,工作專案不得使用自動序列化。

使用自動序列化

UMDF 驅動程式可以藉由呼叫 IWDFDeviceInitialize::SetLockingConstraint ,並將 LockType 參數設定為 WdfDeviceLevel來要求自動回呼同步處理。

然後驅動程式會先將其WUDF_INTERRUPT_CONFIG結構的AutomaticSerialization成員設定為TRUE,再呼叫CreateInterrupt

因此,UMDF 會使用 I/O 佇列、要求取消和檔案物件回呼常式序列化驅動程式的 OnInterruptWorkItem 回呼。 在此案例中,UMDF 會使用回呼鎖定,而不是個別中斷的物件鎖定。