本文源自於 https://docs.microsoft.com/en-us/previous-versions/windows/hardware/design/dn614028(v=vs.85)?redirectedfrom=MSDN

參考 http://biosengineer.blogspot.com/2014/10/wmi-acpi.html

Windows Instrumentation: WMI and ACPI

OEM廠商可以透過在系統中包含ACPI物件的方式, 以提供儀表訊息(instrumentation information)
這些物件可被WMI (Windows Management Instrumentation) 識別.
此訊息可適用於Windows 2000, Windows XP, and Windows 98 Second Edition.

藉由在系統中包含ACPI物件, OEM可以利用通用映射驅動程式(generic mapping driver), 此驅動程式允許WMI將訊息提供給儀表使用者(instrumentation consumers).

ACPI子系統包含了豐富的儀表訊息, 鼓勵了OEM使用ACPI去添加額外特定平台之儀表訊息.
但是, 儀表使用者(例如WBEM)並不容易去訪問ACPI物件.

本文以假設讀者熟悉Windows OS下的驅動映射, 以及WMI的Data Block GUID mapping控制方法.

<<Windows Instrumentation 的技術概述>>
ACPI-to-WMI 的Mapping功能是通過 Windows 2000、Windows XP 和 Windows 98 Second Edition等OS提供的兩個Device driver實現:

Acpi.sys : 是經過一些修改的常規 ACPI 設備驅動程序。

Wmiacpi.sys : 去註冊隨插即用 ID PNP0c14。

OEM 可以透過編寫 ACPI 源語言 (ASL) 碼 和託管對象格式(Managed Object Format-MOF)文件來辦別其 PC 系統功能
MOF 文件可以在 BIOS 中或在disk上。
有關 MOF 的詳細信息,請參閱本文後面的“MOF Data Type”部分。

ASL 代碼永遠不會由 Wmiacpi.sys 驅動程序直接執行。 ASL 代碼始終由 Acpi.sys 驅動程序執行 (請參閱 https://www.acpi.info/ 上的 ASL 信息).
Wmiacpi.sys 將調用 Acpi.sys 來呼叫訪問映射驅動程式暴露出的management data的控制方法(control method).

Microsoft 不提供與 Wmiacpi.sys 驅動程式相關聯的 MOF 文件。
通過 ACPI 顯示的唯一信息是溫度區信息(temperature zone information),該信息通過 Acpi.sys 設備驅動程式顯示並與之關聯。


<<Windows Instrumentation 的 WMI 概述>>
WMI 將單個Data items(屬性) 組織成包含相關訊息的Data blocks(結構).
Data blocks可能有一個或多個Data items.
每個Data item在Data block內都有一個唯一index,每個Data block由一個globally unique(全域唯一)的 128-bit命名,稱為-全局唯一標識符 (globally unique identifier - GUID).
WMI 可以向數據生產者提供通知-通知關於何時開始和停止Collecting(組成一個Data block的)Data items.
WMI 不知道單個Data block的data format.

WMI 功能允許查詢Data block的所有實例(instances)或Data block的單個實例(single instance).
它還允許設置一個Data block實例中的所有Data items, 或者設置Data block之single實例中的single Data item.

除了Queries和Set,WMI 還允許 WMI method calls,
這在功能上等同於對device的 I/O control (IOCTL) 呼叫。
每個 WMI method call 都由一個 GUID 和該 GUID 的method index去標識。
所有 WMI method calls 都用一個buffer去輸入和輸出參數。
WMI 允許將重大event的notify傳遞給感興趣的user-mode 應用程式。
每種type的event都由一個 GUID 以唯一命名。
event還可以攜帶帶有關於事件的額外訊息的Data block。
WMI 可以向事件生成器(event generator)提供有關何時啟用和禁用event type的通知。

WMI 是一種開放的結構,允許 OEM 定義自己的Data blocks、methods和events。
除了組成自定義Data block的data外,OEM 還必須提供通常是表示Data block或 WMI method如何映射到 2-character ID 的描述。這個 2-character ID 是作用於Data block的control methods名稱的一部分。

例如,當呼叫被產生去查詢(Query)由 WMI GUID 表示的Data block時,mapper將評估 WQxx control method(其中 xx 是映射到該 GUID 的 2-character ID)。
這些mapping由 ACPI code定義,並由評估 _WDG control method的mapper獲得。有關詳細信息,請參閱本文後面的“ACPI Control Method Naming Conventions and Functionality”。

event的mapping過程類似。
_WDG control method提供了mapping: {表示event之 WMI event GUID} 與 {ASL 通知指令中指定的通知代碼(notification code)} 之間的mapping。
例如,當 ACPI 向mapper提供 {control method執行了 notify(mapper-device, 0x81) function} 的callback時,mapper將查找映射到 0x81 的 WMI GUID 並使用此 WMI GUID 構建 WMI event。
在啟動 WMI event之前,mapper將評估 _WED 以檢索屬於該event的任何其他data。


<Loading the Mapping Driver-載入映射驅動程序>
隨插即用 ID PNP0c14 被分配為 WMI-mapping偽設備(pseudo device);OS Device INFs(也就是 隨插即用 ID-對應到-設備驅動程序 的查找表)會將此隨插即用 ID (Plug and Play ID) 指向 ACPI-WMI mapping驅動程序(ACPI-to-WMI mapping driver)。
為了載入 ACPI-WMI mapping驅動程序,ACPI 系統需要在 ACPI device tree中定義一個或多個具有該隨插即用 ID 的設備。 
ACPI device tree中聲明的每個device都有自己的OS device物件和自己的一組mapping。

通過這種方式,可以在device tree內的適當位置組織不同的Data block set。
這種組織允許不同的device及其相應的Data block從 ACPI device tree進出。
請注意,如果 ACPI device tree中有多個 WMI-mapping偽設備,則每個device的 _UID 必須具有唯一值。

<Mapping Driver Functionality-映射驅動程序功能>
本質上,mapping driver將執行以下操作:

1. 管理與 WMI 的所有註冊和註銷以及與操作系統的其他交互(interactions)。當mapper獲得 IRP_MN_REGINFO IRP 時,data和Data blocks的註冊就完成了。

2. 在 WMI 初始化時,mapping driver將查詢 ACPI method以獲取它support的Data block、event和method GUID 的列表,以及從 GUID 到control method ID 的mapping。藉由此信息,mapping driver將向 WMI 註冊這些 GUID。

3. 將Data block查詢、集合和methid呼叫 I/O IRP 轉換為適當的 ACPI control method call。

4. 從 ACPI event handler control methods接收通知並將它們作為 WMI event去重新啟動(relaunch)。

5. 對於標記為完全由字串組成的Data block,在 ASCIZ 和 UNICODE 之間轉換字串。


<<ACPI-to-WMI Mapper Goals for Windows Instrumentation-用於 Windows 檢測的 ACPI-to-WMI 映射器目標>>

以下列表描述了 ACPI-to-WMI mapper的目標:

1. 將由硬體或FW維護並可通過 ACPI 訪問的data公開暴露出給user-mode儀器數據使用者,例如 WBEM 或 DMI。

2. 允許從user-mode儀器數據使用者或硬體config app(例如: control panel小程序)去呼叫特定的 ACPI control methods。

3. 將特定的 ACPI events傳遞給請求該特定事件通知的所有user-mode呼叫者。

4. 允許 OEM 包含 OEM 特定的Data blocks、user-mode可呼叫的 ACPI control methods和events,而無需對 ACPI-to-WMI mapper進行任何更改。

5. 允許通用數據消費者app——那些在沒有任何特定機器公開的Data blocks的特殊知識的情況下編寫的應用程序——能夠訪問和理解Data blocks、user-mode可呼叫的 ACPI control methods和被mapping的events--包括那些 OEM 特定的。

6. 定義標準Data block格式、user-mode可呼叫 ACPI control methods、events及其通用Data block的 WMI GUID mapping,以及所有 OEM 預期提供的可調用控制方法和事件。這可以包括行業在 SMBIOS 規範和其他規範中標識的動態數據和功能。


這些目標是藉由在 ACPI-to-WMI mapper (Wmiacpi.sys) 以及核心 ACPI code本身 (Acpi.sys) 中包含supporting code來實現。

以下不是 ACPI-to-WMI mapper的目標:

1. 對通過mapper的任何Data block有特定的了解。

2. 提供專門用於 SMBIOS 數據和功能的接口。 映射器是一種開放式架構,不限於 SMBIOS 數據和功能。


<<How SMBIOS-provided information is handled-如何處理 SMBIOS 提供的信息>>
想要提供 OEM 和系統特定儀器數據的供應商可以選擇使用 SMBIOS 作為機制。
要使用 WMI 基礎結構的功能來顯示(surface)此 SMBIOS 數據,它們必須符合 2.0 和 2.3 之間的任何 SMBIOS 版本。
這允許 Microsoft Win32 提供程序(隨 Windows 2000、Windows XP 和未來版本的 Windows 一起提供,並作為 Windows 98 的更新提供)將幾乎所有 SMBIOS 提供的信息填充到 CIMv2 命名空間中.
特別是,幾乎所有的信息都會放入 Win32 類別中。其中一些 Win32 類是派生自 CIMv2.1 physical MOF。

SMBIOS 信息不會由 Win32 提供程序(provider)自動填充到 CIMv2 命名空間的一個例外是 SMBIOS 供應商特定數據。
此類 SMBIOS 供應商定義的數據將放置在“Root\VendorDefined”命名空間中的“VendorBucket”類中,默認情況下在 CIMv2 命名空間中不可用。
任何想要提供此類數據的系統供應商都必須編寫一個提供程序(provider)來解釋此數據。

SMBIOS 數據僅讀取一次,在 Windows 2000/Windows XP 中啟動時或在 Windows 98 上啟動後。
讀取 SMBIOS 數據後對其進行的動態更新將不會反映在此實現中的命名空間中。
Microsoft 正在與業界合作定義 用於動態更新的標準 ACPI 方法。

SMBIOS 原始數據(raw data)在 Windows 2000/Windows XP 中可用作 WMI Data block,
在 Windows 98 中可用作平面文件(flat file)。
Win32 提供程序(provider)將解釋這些data並將其填充到命名空間中。

<<ACPI Control Method Naming Conventions and Functionality for Windows Instrumentation - Windows Instrumentation 的 ACPI 控制方法命名約定和功能>>

名為 _WDG 的Data block GUID mapping控制方法評估(evaluate)為一個buffer, 其buffer具有{Data block、事件和 WMI 方法}的 GUID 映射信息。
評估的結果是一個包含以下structure之陣列的buffer。

typedef struct
{
     GUID guid;             // GUID that names data block
     union
     {
         CHAR ObjectId[2];  // 2-character ACPI ID  (Data Blocks and Methods)
         struct 
         {
             UCHAR NotificationValue;  // Byte value passed by event handler control method
             UCHAR Reserved[1];
         } NotifyId;
    }
     USHORT InstanceCount;  // Number of separate instances of data block
     USHORT Flags;          // Flags
};
// 如果 WCxx 控制方法應在 {第一個數據消費者有興趣收集數據塊} 以及 {最後一個數據消費者不再感興趣時} 運行,請設置此flag

#define WMIACPI_REGFLAG_EXPENSIVE   0x1

// 如果 GUID 表示一組 WMI 方法調用而不是Data block,則設置此flag

#define WMIACPI_REGFLAG_METHOD      0x2

// 如果Data block完全由string組成並且應該在返回查詢時從 ASCIZ 轉換為 UNICODE,並在傳遞集合時從 UNICODE 轉換為 ASCII,則設置此flag

#define WMIACPI_REGFLAG_STRING      0x04

// 如果 GUID 映射到event而不是Data block或method,則設置此flag

#define WMIACPI_REGFLAG_EVENT       0x08

陣列中的每個元素都描述了 WMI Data block GUID-to-2 個字母的 ACPI method標識符的映射,
該標識符用於組成對Data block或 ASL Notify操作中使用的通知值進行操作的method名稱。
陣列的每個元素還包含存在的Data block的實例數目 和設置的任何flag。

這種控制方法是需要的。

下表總結了本節稍後描述的每種控制方法的信息。

Control method Object name Parameters

Control method

required

說明
Data Block Query WQxx ULONG Yes.

如果Data Block GUID 映射控制方法描述了一個沒有設置 WMIACPI_REG_METHOD flag的Data Block, 則需要有一個控制方法來評估Data Block實例的內容。

按照慣例,物件的名稱是 WQ xx,其中 xx 是映射到要查詢的 GUID 的 2 個字符的 ID。
會有一個參數被傳遞給method——實例的index,它是 ULONG 類型的。
僅使用single instance註冊的Data block可以忽略該參數。
如果 WQxx 方法的計算結果是一個字符串,那麼mapper會將該字符串轉換為 UNICODE,以便 WMI 可以理解它。
需要這種控制方法。

Data Block Set WSxx ULONG, buffer

否。read-only Data block

不需要。

如果Data block GUID 映射控制方法描述了一個沒有設置 WMIACPI_REG_METHOD flag的Data block,則需要有一個控制方法來評估數據塊實例的內容。

按照慣例,物件的名稱是 WS xx,其中 xx 是映射到要設置的 GUID 的 2 字符 ID。
兩個參數傳遞給方法;一個是作為instance的index的 ULONG,另一個是包含Data block新值的緩衝區。

如果Data block的 GUID 註冊了 WMIACPI_REGFLAG_STRING 標誌,
則mapper假定傳遞的Data block完全由單個字符串組成,
並將該字符串從 UNICODE 轉換為 ASCII 以便 WSxx 控制方法可以理解.
那些read-only的Data block不需要這種控制方法。
因為mapper不知道 WMI 方法的調用者傳遞的數據塊的格式,所以它會將緩衝區作為單個緩衝區參數傳遞給 WM xx 控制方法。
控制方法可以使用 ASL 指令 CreateBitField、 CreateDWordField、CreateField 和 CreateWordField 將緩衝區分解為多個部分。

Data Item Set 不支援      
Method Execution WMxx ULONG, method ID, buffer 是。 Data block GUID mapping陣列中指定的Data block是必需的,並且設置了 WMIACPI_REG_METHOD flag。  
Event Enable and Disable WExx UCHAR 不支援。僅在啟用event會導致大量開銷時才支援。  
Data Collection Enable and Disable WCxx UCHAR 不支援。僅當Data block的數據收集產生顯著開銷時才支持。  

(待續)

image

arrow
arrow
    文章標籤
    Microsoft WMI ACPI Win32
    全站熱搜

    lynn770707 發表在 痞客邦 留言(0) 人氣()