使用 Self-Managed I/O
大部分以架構為基礎的驅動程式會針對其支援的裝置利用架構的 PnP 和電源管理功能。 換句話說,大部分以架構為基礎的驅動程式會執行下列所有動作,讓架構管理裝置的 PnP 和電源狀態:
提供 EvtDeviceD0Entry 和 EvtDeviceD0Exit 回 呼函式。
提供 EvtDevicePrepareHardware 和 EvtDeviceReleaseHardware 回呼函式。
針對需要裝置處於其運作狀態的 I/O 要求使用電源管理的佇列,以及針對所有其他要求使用未受電源管理的佇列。
不過,一些架構型驅動程式需要更瞭解其裝置的狀態,包括下列情況下的驅動程式:
驅動程式執行的作業不是由驅動程式從架構 I/O 佇列接收的一組 I/O 要求所決定。
驅動程式會與較舊的非架構驅動程式通訊,並直接處理 WDM 介面。
驅動程式收到的 I/O 要求無法分成兩個群組:需要裝置處於其工作狀態的群組,以及未接收的群組。
大部分的驅動程式不在上述其中一種情況中,但如果您的驅動程式是,可能需要更直接控制裝置的 PnP 和電源管理作業。 這類驅動程式可以使用 自我管理 I/O。 使用自我管理 I/O 表示驅動程式會透過一組回呼函式來通知 (,只要其裝置已插入或取消插入,以及每當裝置暫時停止時,就會) 。
請注意,驅動程式可以使用自我管理 I/O,並且仍使用架構的 I/O 佇列,做為電源管理的佇列。 例如,驅動程式可以使用架構的 I/O 佇列,而不是以電源管理,搭配一組自我管理的 I/O 回呼函式。
若要使用自我管理 I/O,驅動程式會在呼叫 WdfDeviceInitSetPnpPowerEventCallbacks時註冊一組額外的事件回呼函式。 這些事件回呼函式如下:
EvtDeviceSelfManagedIoInit,它會初始化並啟動裝置的 I/O 作業。
EvtDeviceSelfManagedIoSuspend,這會暫停 I/O 作業。
EvtDeviceSelfManagedIoRestart,會在裝置的 I/O 作業暫停後重新開機。
EvtDeviceSelfManagedIoFlush,其會移除未服務的 I/O 要求。
EvtDeviceSelfManagedIoCleanup,它會解除配置 EvtDeviceSelfManagedIoInit所配置的資源。
當裝置第一次進入其運作 (D0) 狀態時,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoInit 回 呼函式。 每當使用者將裝置插入系統,每次重新開機系統時,就會發生這種情況。
在某些情況下,驅動程式必須停止裝置的 I/O 作業:裝置即將進入低電源狀態、即將移除,或已意外移除。 下列清單會詳細檢查這些情況:
裝置即將進入低電源狀態,最終會回到其運作狀態。
當裝置即將進入低電源狀態 (,因為您的裝置已閒置、整個系統進入低電源狀態,或 PnP 管理員正在 ) 轉散發系統硬體資源 時,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend 回 呼函式。 裝置重新進入其運作狀態之後,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoRestart 回呼 函式。
裝置即將移除。
為了處理 使用者要求的裝置移除,架構會在停止裝置之前呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend 回呼函式。 停止裝置之後,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoFlush 回呼函式。 移除裝置之後,架構會呼叫 EvtDeviceSelfManagedIoCleanup 回呼 函式。
裝置已意外移除, (意外移除) 。
如果裝置匯流排的驅動程式判斷裝置已不存在,或堆疊中的另一個驅動程式判斷裝置沒有回應,發現問題的驅動程式會通知 PnP 管理員。 接著,PnP 管理員會通知其餘的驅動程式裝置已消失。 針對架構型驅動程式,架構會收到 PnP 管理員的訊息,並呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend、 EvtDeviceSelfManagedIoFlush和 EvtDeviceSelfManagedIoCleanup 回 呼函式。
(您的驅動程式也可以註冊 EvtDeviceSurpriseRemoval 回呼函式 。 如果裝置在移除時處於運作 (D0) 狀態,架構會在呼叫自我管理 I/O 回呼函式之前呼叫 EvtDeviceSurpriseRemoval 。 如果裝置在移除時處於低電源狀態, EvtDeviceSurpriseRemoval 會在 EvtDeviceSelfManagedIoSuspend)
如需架構呼叫驅動程式事件回呼函式順序的詳細資訊,請參閱 PnP 和電源管理案例。
雖然很少需要,但架構可讓驅動程式存取 架構中的狀態機器,更能控制裝置的 PnP 和電源狀態。