IRP_MN_REGINFO
在 Microsoft Windows 98 和 Microsoft Windows 2000 上支援 WMI 的驅動程式必須處理此 IRP。 (支援 Windows XP 的驅動程式也必須處理 IRP_MN_REGINFO_EX IRP.) 驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WRP 本身,如 處理 WMI 要求中所述。
主要程式碼
傳送時
在 Windows 98 和 Windows 2000 上,WMI 會在驅動程式呼叫 IoWMIRegistrationControl之後,傳送此 IRP 來查詢或更新驅動程式的註冊資訊。 在 Windows XP 和更新版本上,WMI 會改為傳送 IRP_MN_REGINFO_EX 要求。
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旗標的旗標。
如果區塊正向靜態實例名稱註冊,驅動程式:
將 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 的裝置實例路徑來產生區塊的靜態實例名稱。
分別在 InstanceNameList、 BaseName或 Pdo所指示的位移,寫入 PDO 的實例名稱字串、基底名稱字串或指標。
如果驅動程式代表另一個驅動程式處理 WMI 註冊 (,例如迷你類別或迷你埠驅動程式) ,它會以另一個驅動程式的註冊資訊填入另一個 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緩衝區之緩衝區的位元組數目。
作業
驅動程式可以呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如 處理 WMI 要求中所述。
如果驅動程式藉由呼叫 WmiSystemControl 來處理 WMI IRP,該常式會呼叫驅動程式的 DpWmiQueryReginfo 常式。
如果驅動程式處理 IRP_MN_REGINFO 要求本身,只有當 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。 回應中,驅動程式應該以 WMIREGINFO 結構填入 Parameters.WMI.Buffer 的緩衝區,如下所示:
若要移除區塊,驅動程式會在 其 WMIREGGUID 結構中設定WMIREG_FLAG_REMOVE_GUID。
例如,若要新增或更新區塊 (,若要變更其靜態實例名稱) ,驅動程式會清除WMIREG_FLAG_REMOVE_GUID,並為區塊提供新的或更新的註冊值。
若要使用靜態實例名稱註冊新的或現有的區塊,驅動程式會設定適當的WMIREG_FLAG_INSTANCE_XXX ,並提供 WMI 產生靜態實例名稱所需的任何字串。
驅動程式可以使用相同的 WMIREGINFO 結構來移除、新增或更新區塊,因為它一開始用來註冊其所有區塊,只變更要更新之區塊的旗標和資料。 如果這類WMIREGINFO結構中的WMIREGGUID與驅動程式第一次註冊該區塊時所傳遞的WMIREGGUID完全相符,WMI 會略過更新區塊所涉及的處理。
WMI 不會在驅動程式呼叫具有 WMIREG_ACTION_DEREGISTER 的IoWMIRegistrationControl之後傳送IRP_MN_REGINFO要求,因為 WMI 不需要驅動程式的進一步資訊。 驅動程式通常會取消註冊其區塊,以回應 IRP_MN_REMOVE_DEVICE 要求。
規格需求
標頭 |
Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h) |