IRP_MN_REGINFO

在 Microsoft Windows 98 和 Microsoft Windows 2000 上支援 WMI 的驅動程式必須處理此 IRP。 (支援 Windows XP 的驅動程式也必須處理 IRP_MN_REGINFO_EX IRP.) 驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WRP 本身,如 處理 WMI 要求中所述。

主要程式碼

IRP_MJ_SYSTEM_CONTROL

傳送時

在 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 的裝置實例路徑來產生區塊的靜態實例名稱。
  • 分別在 InstanceNameListBaseNamePdo所指示的位移,寫入 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)

另請參閱

DpWmiQueryReginfo

IoWMIRegistrationControl

WMILIB_CONTEXT

WMIREGGUID

WMIREGINFO

WmiSystemControl

IRP_MN_REGINFO_EX