共用方式為


I/O 佇列的電源管理

當架構收到導向至其中一個驅動程式裝置的 I/O 要求時,架構會將要求放入 I/O 佇列中。 驅動程式可以藉由提供要求處理程式或輪詢佇列,從 I/O 佇列取得 I/O 要求。 如需 I/O 佇列的詳細資訊,請參閱 Framework Queue Objects

當您設計驅動程式時,您應該將驅動程式將收到的 I/O 要求分組為兩個類別:

  1. 要求要求裝置處於其運作狀態(D0),包括:

    • 讀取或寫入要求,要求裝置的函式驅動程式從裝置讀取數據,或將數據寫入裝置。
    • 裝置控制要求函式或總線驅動程式在未存取裝置的情況下無法提供服務。
  2. 不需要裝置處於運作中狀態的要求,包括:

    • 裝置控制要求函式或總線驅動程式可在不存取裝置的情況下提供服務。
    • 篩選驅動程式可能收到的所有要求。
    • 如果堆疊支援未與任何硬體通訊的軟體專用裝置,則驅動程式堆疊中所有驅動程式都會收到的所有要求。

除非您正在撰寫篩選驅動程式,或未與硬體通訊之堆疊的驅動程式,否則您的驅動程式可能會收到一些要求,要求裝置處於其工作狀態,以及一些沒有的要求。

為了支援這兩種類型的要求,架構會提供兩種類型的 I/O 佇列:那些是 受電源管理的 佇列,以及那些不是。 當驅動程式建立其每個 I/O 佇列時,它會將佇列WDF_IO_QUEUE_CONFIG結構中的 PowerManaged 成員設定WdfTrueWdfFalse,以指出下列其中一項:

  • 如果您的驅動程式將PowerManaged設定WdfTrue,則佇列會由電源管理。

    當 I/O 要求可在電源管理的佇列中使用時,架構只會在裝置處於運作中 (D0) 狀態時,才會將要求傳遞給驅動程式。 因此,每當驅動程式收到來自電源受控佇列的要求時,架構就會保證裝置可供使用。 如果裝置不是處於工作狀態,架構會將要求儲存在佇列中,直到裝置變成可用為止。

    如果裝置處於低功率狀態,因為它處於閑置狀態,而且如果架構將 I/O 要求放在驅動程式的其中一個電源受控佇列中,則架構會要求驅動程式堆疊在將要求傳遞至驅動程式之前,將裝置還原至其工作狀態。

    如果裝置處於低功率狀態,因為系統未處於運作中 (S0) 狀態,而且如果架構將 I/O 要求放在驅動程式的其中一個電源受控佇列中,則架構會等到裝置回到其工作狀態 (D0) 狀態,然後將要求傳遞給您的驅動程式。

    因為架構不會在裝置處於工作狀態時,從電源管理的佇列將 I/O 要求傳遞給驅動程式,因此位於驅動程式堆疊中電源原則擁有者上方的驅動程式不得使用受電源管理的 I/O 佇列。 如果位於電源原則擁有者上方的驅動程式使用電源管理佇列,且裝置處於低功率狀態,則驅動程式不會收到要求,且無法將它傳遞給電源原則擁有者。 因此,控制裝置電源狀態的電源原則擁有者不會喚醒裝置。

  • 如果您的驅動程式將PowerManaged設定WdfFalse,則佇列不會由電源管理。

    當 I/O 要求位於非電源管理的佇列中時,架構會將要求傳遞給驅動程式,而不論裝置是否處於運作中 (D0) 狀態。 如果您已設定佇列,使其只接收不需要存取裝置的要求,則驅動程式可以服務每個要求,即使裝置無法使用也一樣。

如需 Power-Managed I/O 佇列的詳細資訊,請參閱 使用 Power-Managed I/O 佇列

一些驅動程式需要直接控制 隨插即用 (PnP) 和電源管理作業。 這些驅動程式可以使用 自我管理的 I/O。 如需詳細資訊,請參閱 使用自我管理 I/O