定義 WMI 實例名稱

WMI 區塊的 實例 包含特定實體裝置或軟體元件所提供的資料。 就像區塊的 GUID 可唯一識別區塊一樣,實例的名稱會唯一識別該區塊的實例。 WMI 用戶端應用程式會使用實例名稱,將資料區塊中傳回的資訊與提供資料的裝置或元件產生關聯。 WMI 會使用實例名稱來判斷要求應傳送至哪個裝置。 強烈建議驅動程式在定義實例名稱時使用其 PDO。

驅動程式可以使用下列兩種方式之一來定義區塊的實例名稱:

  • 驅動程式會在註冊 區塊時,將 靜態實例名稱 的清單傳遞給 WMI。

    註冊區塊之後,驅動程式和 WMI 都會在此清單中依其索引指定實例名稱。 靜態實例名稱可以根據驅動程式 PDO 的 裝置實例識別碼 或驅動程式定義的基底名稱;或驅動程式可以定義實例名稱字串的清單。 靜態實例名稱會持續存在,直到驅動程式藉由重新註冊 區塊來明確變更它們為止。

  • 驅動程式會在建立實例時產生 動態實例名稱

    驅動程式指出它會在註冊區塊時產生區塊的動態實例名稱。 註冊區塊之後,驅動程式和 WMI 都會在 Parameters.WMI.Buffer的緩衝區中以字串的形式傳遞動態實例名稱。

只有當資料區塊的實例數目或實例名稱經常在執行時間變更時,驅動程式才應該產生動態實例名稱。 例如,驅動程式可能會使用進程識別碼或 TCP/IP 連線的 IP 位址作為實例名稱。 這類實例名稱應該是動態的;如果它們是靜態的,驅動程式會產生相當多的額外負荷,因為它必須在每次發生變更時呼叫 IoWMIRegistrationControl 來更新實例的數目和名稱。

在大部分情況下,靜態實例名稱最好是動態實例名稱,原因如下:

  • 靜態實例名稱可改善驅動程式的效能,因為驅動程式不需要傳回實例名稱字串來回應 WMI 要求,因為它必須用於動態實例名稱。

  • WMI 可以在註冊時偵測靜態實例名稱衝突,並視需要自動修改實例名稱,因此無論有多少驅動程式註冊區塊,所有實例名稱都是唯一的。

    WMI 無法偵測動態實例名稱的實例名稱衝突,因此驅動程式會負責使用 IoWMIAllocateInstanceIds產生唯一名稱。

  • 只要名稱是以驅動程式的 PDO 或驅動程式定義的基底名稱為基礎,驅動程式就可以使用 WMI 程式庫常式來處理使用靜態實例名稱之區塊的 IRP。

    驅動程式無法使用 WMI 程式庫常式來處理使用動態實例名稱之資料區塊的 IRP。

驅動程式會藉由在WMIREGGUIDWMIGUIDREGINFO 結構中設定或清除 WMIREG_FLAG_ WMIREGGUID 或 WMIGUIDREGINFO結構中設定或清除靜態實例名稱的類型,指出區塊是否使用靜態或動態實例名稱,以及靜態實例名稱的類型。 如需詳細資訊,請參閱 註冊為 WMI 資料提供者