共用方式為


IRP_MN_QUERY_CAPABILITIES

PnP 管理員會傳送此 IRP 來取得裝置的功能,例如裝置是否可以鎖定或退出。

如果函式和篩選驅動程式改變總線驅動程式所支援的功能,則函式和篩選驅動程式可以處理此要求。 總線驅動程式必須處理其子裝置的這項要求。

0x09

主要程序代碼

IRP_MJ_PNP

傳送時

PnP 管理員會在列舉裝置之後立即將此 IRP 傳送給裝置的總線驅動程式。 在裝置的所有驅動程式都已啟動裝置之後,PnP 管理員會再次傳送此 IRP。 驅動程式可以傳送此 IRP 來取得裝置的功能。

PnP 管理員和驅動程式會在任意線程內容中,在 IRQL PASSIVE_LEVEL傳送此 IRP。

輸入參數

IO_STACK_LOCATION 結構的Parameters.DeviceCapabilities.Capabilities成員指向包含裝置功能相關信息的DEVICE_CAPABILITIES結構。

輸出參數

Parameters.DeviceCapabilities.Capabilities 指向 DEVICE_CAPABILITIES 結構,反映處理 IRP 的驅動程式所做的任何修改。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為STATUS_SUCCESS或適當的錯誤狀態,例如STATUS_UNSUCCESSFUL。

如果函式或篩選驅動程式未處理此 IRP,它會呼叫 IoSkipCurrentIrpStackLocation ,並將 IRP 向下傳遞至下一個驅動程式。 這類驅動程式不得修改 Irp-IoStatus.Status>,且不能完成 IRP。

總線驅動程式會設定 Irp-IoStatus.Status> 並完成 IRP。

作業

列舉裝置時,但在為裝置載入函式和篩選驅動程式之前,PnP 管理員會將IRP_MN_QUERY_CAPABILITIES要求傳送給裝置的父總線驅動程式。 總線驅動程式必須在 DEVICE_CAPABILITIES 結構中設定任何相關值,並將其傳回給 PnP 管理員。

建置裝置堆疊並啟動驅動程序之後,PnP 管理員會將此 IRP 再次傳送給裝置堆疊頂端的驅動程式,然後由堆疊中的每個較低驅動程式處理。 函式和篩選驅動程式可以設定 IoCompletion 例程,並在備份裝置堆疊時處理此 IRP。

驅動程式應先新增功能,再將 IRP 傳遞至下一個較低的驅動程式。

驅動程式應該在 IRP 完成所有較低驅動程式之後移除功能。 驅動程式通常不會移除其他驅動程式所設定的功能,但如果它具有特定組態中裝置功能的特殊資訊,它可能會這麼做。 如需延遲 IRP 處理的相關信息,請參閱 隨插即用,直到較低的驅動程式完成為止。

列舉裝置並載入其驅動程序之後,其功能不應該變更。 如果移除並重新列舉裝置,裝置的功能可能會變更。

處理 IRP_MN_QUERY_CAPABILITIES IRP 時,裝置電源原則管理員的驅動程式應該在 IRP 備份裝置堆疊的路上設定 IoCompletion 例程,並複製裝置電源功能,例如 S-to-D 電源狀態對應。 為了判斷子裝置的電源功能,父總線驅動程式會建立另一個查詢功能 IRP,並將 IRP 傳送至其父驅動程式。 如需詳細資訊,請參閱 報告裝置電源功能

如果驅動程式處理此 IRP,它應該檢查DEVICE_CAPABILITIES版本值。 如果該值不是驅動程式支援的版本,驅動程式應該會失敗 IRP。 如果支援版本,驅動程式應該檢查 [ 大小] 欄位。 驅動程式應該只設定其接收做為輸入之功能結構界限內的欄位。

處理此 IRP 的驅動程式可以設定一些 DEVICE_CAPABILITIES 欄位,但不得設定 [大小 ] 和 [版本] 字段。 這些欄位只會由傳送 IRP 的元件設定。

如需處理 隨插即用 次要 IRP 的一般規則,請參閱 隨插即用

傳送此 IRP

當總線驅動程序處理 其中一個子裝置的IRP_MN_QUERY_CAPABILITIES 要求時,總線驅動程式會將此 IRP 傳送至父裝置堆疊。 此外,驅動程式可能會傳送此 IRP 來取得其中一個裝置的裝置功能。 堆疊中的單一驅動程式只有裝置功能資訊的一部分;將 IRP 傳送至裝置堆疊可讓它收集完整圖片,包括任何篩選驅動程式的修改等等。

如需傳送 IRP 的相關信息,請參閱 處理 IRP 。 下列步驟特別適用於此 IRP:

需求

頁首

Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另請參閱

DEVICE_CAPABILITIES