IRP_MN_REGINFO_EX
WMI 會在驅動程式呼叫 IoWMIRegistrationControl之後,傳送此 IRP 來查詢或更新驅動程式的註冊資訊。 驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如 處理 WMI 要求中所述。
如果驅動程式呼叫 WmiSystemControl 來處理 IRP_MN_REGINFO_EX 要求,WMI 接著會呼叫該驅動程式的 DpWmiQueryReginfo 常式。
在 Microsoft Windows XP 和更新版本的作業系統上,支援 WMI 的驅動程式必須處理此 IRP。 支援 Microsoft Windows 98 和 Windows 2000 的驅動程式也必須處理 IRP_MN_REGINFO。
主要程式碼
傳送時
在 Windows XP 和更新版本上,WMI 會在驅動程式呼叫 IoWMIRegistrationControl之後,傳送此 IRP 來查詢或更新驅動程式的註冊資訊。 在 Windows 98 和 Windows 2000 上,WMI 會改為傳送 IRP_MN_REGINFO 要求。
WMI 會在 IRQL = PASSIVE_LEVEL系統執行緒的內容中傳送此 IRP。
輸入參數
Parameters.WMI.ProviderId 指向應回應要求的驅動程式裝置物件。 此指標位於 IRP 的驅動程式 I/O 堆疊位置。
Parameters.WMI.DataPath 設定為 WMIREGISTER 以查詢註冊資訊或 WMIUPDATE 以更新它。
Parameters.WMI.BufferSize 指出 Parameters.WMI.Buffer的非分頁緩衝區大小上限。 大小必須大於或等於 (sizeof總計, (WMIREGINFO) + (GuidCountsizeof (WMIREGGUID) ) ,其中GuidCount * 是驅動程式所註冊的資料區塊和事件區塊數目,以及靜態實例名稱的空間。
輸出參數
如果驅動程式藉由呼叫 WmiSystemControl 來處理 WMI IRP,則 WMI 會藉由呼叫其 DpWmiQueryReginfo 常式來取得驅動程式資料區塊的註冊資訊。
否則,驅動程式會在Parameters.WMI.Buffer填入WMIREGINFO結構,如下所示:
將 BufferSize 設定為 WMIREGINFO 結構的位元組大小加上相關聯的註冊資料。
如果驅動程式代表另一個驅動程式處理 WMI 要求,請將 NextWmiRegInfo 設定為從這個 WMIREGINFO 開頭到另一個 WMIREGINFO 結構的開頭的位移,其中包含來自另一個驅動程式的註冊資訊。
將 RegistryPath 設定為傳遞至驅動程式 DriverEntry 常式的登錄路徑。
如果 Parameters.WMI.Datapath 設定為 WMIREGISTER,請將 MofResourceName 設定為此 WMIREGINFO 開頭的位移,設定為包含其映射檔中驅動程式 MOF 資源名稱的計算 Unicode 字串。
將 GuidCount 設定為要註冊或更新的資料區塊和事件區塊數目。
寫入 WMIREGGUID 結構的陣列,針對驅動程式公開的每個資料區塊或事件區塊,在 WmiRegGuid。
驅動程式會填入每個 WMIREGGUID 結構,如下所示:
將 Guid 設定為識別區塊的 GUID。
設定 旗標 ,以提供實例名稱和區塊的其他特性的相關資訊。 例如,如果區塊正以靜態實例名稱註冊,驅動程式會使用適當的WMIREG_FLAG_INSTANCE_XXX旗標來設定Flags。
如果區塊正以靜態實例名稱註冊,驅動程式:
將 InstanceCount 設定為實例數目。
將下列其中一個成員設定為區塊靜態實例名稱資料的位元組位移:
如果驅動程式使用 WMIREG_FLAG_INSTANCE_LIST 設定 Flags ,它會將 InstanceNameList 設定為靜態實例名稱字串清單的位移。 WMI 會依索引在此清單中指定後續要求的實例。
如果驅動程式使用 WMIREG_FLAG_INSTANCE_BASENAME 設定 Flags ,則會將 BaseNameOffset 設定為基底名稱字串的位移。 WMI 會使用此字串來產生區塊的靜態實例名稱。
如果驅動程式使用 WMIREG_FLAG_INSTANCE_PDO 設定 Flags ,它會將 Pdo 設定為 PDO 指標的位移,該指標會傳遞至驅動程式的 AddDevice 常式。 WMI 會使用 PDO 的裝置實例路徑來產生區塊的靜態實例名稱。 驅動程式必須在Pdo中傳遞的實體裝置物件上呼叫ObReferenceObject。 系統會自動呼叫 ObDereferenceObject 來取值物件;驅動程式不得這麼做。 (使用 WmiSystemControl 處理 IRP 的驅動程式不需要呼叫 ObReferenceObject。WMI 會在呼叫驅動程式的 DpWmiQueryReginfo 常式之前自動執行這項操作。)
分別在 InstanceNameList、 BaseName或 Pdo 所指示的位移處,寫入實例名稱字串、基底名稱字串或 PDO指標。
如果驅動程式代表另一個驅動程式處理 WMI 註冊 (,例如 miniclass 或 miniport 驅動程式) ,它會以另一個驅動程式的註冊資訊填入另一個 WMIREGINFO 結構,並在上一個結構中的 NextWmiRegInfo 中寫入它。
如果 Parameters.WMI.Buffer 上的緩衝區太小而無法接收所有資料,驅動程式會將所需的大小以位元組為單位寫入 Parameters.WMI.Buffer ,並失敗 IRP 並傳回STATUS_BUFFER_TOO_SMALL。
I/O 狀態欄塊
如果驅動程式藉由呼叫 WmiSystemControl來處理 IRP,WMI 會在 I/O 狀態欄塊中設定 Irp-IoStatus.Status > 和 Irp-IoStatus.Information > 。
否則,驅動程式會將 Irp-IoStatus.Status > 設定為STATUS_SUCCESS或適當的錯誤狀態,如下所示:
STATUS_BUFFER_TOO_SMALL
成功時,驅動程式會將 Irp-IoStatus.Information > 設定為寫入至 Parameters.WMI.Buffer之緩衝區的位元組數目。
作業
如果驅動程式處理 IRP_MN_REGINFO_EX 要求本身,只有當 Parameters.WMI.ProviderId 指向與驅動程式傳遞給 IoWMIRegistrationControl的指標相同的裝置物件時,才應該這麼做。 否則,驅動程式必須將要求轉送至下一個較低的驅動程式。
在處理要求之前,驅動程式必須檢查 Parameters.WMI.DataPath ,以判斷 WMI 是否 (WMIREGISTER) 查詢註冊資訊,或要求 WMIUPDATE) (更新。
WMI 會在驅動程式使用 WMIREG_ACTION_REGISTER 或 WMIREG_ACTION_REREGISTER 呼叫 IoWMIRegistrationControl 之後,以 WMIREGISTER 傳送此 IRP。 為了回應,驅動程式應該在 Parameters.WMI.Buffer 中填入緩衝區,其中包含下列專案:
WMIREGINFO結構,表示驅動程式的登錄路徑、其 MOF 資源的名稱,以及要註冊的區塊數目。
每個區塊要註冊的一個 WMIREGGUID 結構。 如果要使用靜態實例名稱註冊區塊,驅動程式會在該區塊的WMIREGGUID結構中設定適當的WMIREG_FLAG_INSTANCE_XXX旗標。
任何字串 WMI 都必須產生靜態實例名稱。
WMI 會在驅動程式使用 WMIREG_ACTION_UPDATE_GUIDS 呼叫IoWmiRegistrationControl之後,使用WMIUPDATE傳送此 IRP。 回應中,驅動程式應該在 Parameters.WMI.Buffer 中填入緩衝區,並包含 WMIREGINFO 結構,如下所示:
若要移除區塊,驅動程式會在其 WMIREGGUID 結構中設定WMIREG_FLAG_REMOVE_GUID。
例如,若要新增或更新區塊 (,若要變更其靜態實例名稱) ,驅動程式會清除WMIREG_FLAG_REMOVE_GUID,並為區塊提供新的或更新的註冊值。
若要使用靜態實例名稱註冊新的或現有的區塊,驅動程式會設定適當的 WMIREG_FLAG_INSTANCE_XXX ,並提供 WMI 產生靜態實例名稱所需的任何字串。
驅動程式可以使用相同的 WMIREGINFO 結構來移除、新增或更新區塊,因為它一開始用來註冊其所有區塊,只變更要更新之區塊的旗標和資料。 如果這類WMIREGINFO結構中的WMIREGGUID與驅動程式第一次註冊該區塊時所傳遞的WMIREGGUID完全相符,WMI 會略過更新區塊所涉及的處理。
WMI 不會在驅動程式呼叫IoWMIRegistrationControl與 WMIREG_ACTION_DEREGISTER 之後傳送IRP_MN_REGINFO_EX要求,因為 WMI 不需要驅動程式的進一步資訊。 驅動程式通常會取消註冊其區塊,以回應 IRP_MN_REMOVE_DEVICE 要求。
規格需求
標頭 |
Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h) |