iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

我的第一個 BIOS 與 Web API 應用程式系列 第 15

[Day 33] WMI - Microsoft WmiAcpi 範本

  • 分享至 

  • xImage
  •  

拖稿拖了這麼久,WMI 也描述了這麼多,到底要如何提供 WMI 給系統呢?
Microsoft Windows-driver-samples 提供了兩個範例 WMI

  • WmiAcpi 示範了 UEFI 透過 ACPI 提供 WMI Instance、Property 及 Queries。
  • WmiSamp 示範了為裝置註冊 WMI Provider 以提供 Instance 及 Queries。

我們的目的是要 UEFI提供資訊給 APP,所以這部分以 WmiAcpi 為主,WmiAcpi 裡面包含了

檔案 說明
device.asl ASL 語言撰寫的 WMI Code,須包入 UEFI ACPI 提供 WMI 資訊
acpimof.mof Managed 物件格式撰寫的檔案,讓 WMI Core 知道有哪些資訊,會編譯成 BMF 及 DLL,僅提供 resource。範例含9個 Class AcpiTest_QSPackage、AcpiTest_QSString、AcpiTest_QULong、AcpiTest_MPackage、AcpiTest_MString、AcpiTest_MULong、AcpiTest_EventPackage、AcpiTest_EventString、AcpiTest_EventULong
acpimof.def 建立 Acpimof.dll 所需要的的檔案
acpimof.rc 建立 Acpimof.dll 所需要的檔案
wmi-acpi.htm WMI and ACPI 白皮書,對 WmiAcpi 有很詳細的說明
acpimov.vcxproj Visual Studio project 檔案
acpimof.sln Visual Studio solution 檔案

最直接的方式就是用 Microsoft Visual Studio 來直接 build,因為這部分包含了 Driver 相關,建議照 Microsoft安裝整套 Visual Studio、SDK、WDK,通常安裝後的檔案會在 C:\Program Files (x86)\Windows Kits。

Build 產生的資料夾中重要的檔案有

檔案 說明
acpimof.bmf 二進制的 MOF 檔案,由 mofcomp.exe 轉換
acpimof.dll AcpiMof動態連結檔,僅包含 AcpiMof 的 Resource 資訊
acpimof.x 包含二進位 MOF 資料的文字標記法的文字檔,由wmimofck.exe 轉換

mofcomp.exe 在系統C:\Windows\System32\wbem\ 可找到,用指令mofcomp -B:acpimof.bmf acpimof.mof 轉換出二進制的 acpimof.bmf。

wmimofck.exe 是 WDK 套件裡的程式,可在C:\Program Files (x86)\Windows Kits\10\bin\ 裡找到,
用指令 wmimofck -xacpimof.x acpimof.bmf 轉換出 包含二進位 MOF 資料的文字標記法的文字檔 acpimof.x。

acpimof.dll 由 acpimof.mof、acpimof.def、acpimof.rc 等相關檔案 Link 而來,詳細指令可查詢 build 出來的產物 link.command.1.tlog
^C:\VSPROJECT\DRIVER\WMIACPI\X64\DEBUG\ACPIMOF.RES
/OUT:"X64\DEBUG\ACPIMOF.DLL" /INCREMENTAL:NO /NOLOGO /WX KERNEL32.LIB USER32.LIB GDI32.LIB WINSPOOL.LIB COMDLG32.LIB ADVAPI32.LIB SHELL32.LIB OLE32.LIB OLEAUT32.LIB UUID.LIB ODBC32.LIB ODBCCP32.LIB /DEF:"ACPIMOF.DEF" /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"X64\DEBUG\ACPIMOF.PDB" /TLBID:1 /NOENTRY /DYNAMICBASE /NXCOMPAT /IMPLIB:"X64\DEBUG\ACPIMOF.LIB" /MACHINE:X64 /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221,4108,4088,4218,4218,4235 /DLL X64\DEBUG\ACPIMOF.RES

有了這些檔案後我們就可以參考Microsoft wmi-acpi-sample 提到的方法,完成 WmiAcpi 的系統設置,接著就可以在 WMI 的 Name Space WMI 看到結果,

BIOS ACPI DSDT 包入 device.asl

device.asl 宣告了一個 Device AMW0,Device 名稱是可以替換的,Device HID 固定為 PNP0C14, WDG 裡描述了 WMI 的資料、事件、及方法。
開機時系統 PnP 認到ACPI DSDT 有 PNP0C14 的裝置,就會安裝C:\Windows\System32\drivers\wmiacpi.sys 並透過它將指定的 Acpimof.dll (MOF resource) 紀錄在 WMI 資料庫裡。
正規的方法是直接將 device.asl 包進 UEFI DSDT table,不同 UEFI Vendor包入的方法會有差異,可查詢有 PNP0C14 HID 的 ASL 檔案,確認包入 ACPI DSDT 的方式,或是直接複製 Device(AMW0) 到查詢有 PNP0C14 的 Device 旁。
我用的是 AMI BIOS,device.asl 在編譯時遇到一些問題需要修正,
Name(_HID, "*pnp0c14") 需修改為 Name(_HID, "PNP0C14")
Method(WQAA, 1) 裡 Store(Debug, Foo1) 需修改為 Store(Foo1, Debug)
用含device.asl 的 BIOS 開機,用 RW ACPI 可看到 DSDT 裡有AMW0 Device。但這時還未安裝 MOF 資訊,所以用 WMI Explorer 看 WMI 資料庫 root\WMI是沒有東西的。

https://ithelp.ithome.com.tw/upload/images/20231006/20162791CtpLs0aTa8.png

https://ithelp.ithome.com.tw/upload/images/20231006/20162791WJMoJdHhuL.png

系統安裝 MOF 資訊

這裡有兩種做法,結果相同,可自行依需求選擇。

一、REGEDIT 指定 MofImagePath

我們先前已經 build 好acpimof.dll

  • 放置在 C:\Windows\System32
  • 開啟登錄編輯程式 REGEDIT
  • Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
    WMI 相關的項目有 WmiAcpi、WmiApRpl、wmiApSrv、WMIRegistrationService
  • WmiAcpi 新增 MofImagePath 指向 Custcomize 的 WMI DLL (內含MOF)
    \SystemRoot\System32\acpimof.dll

https://ithelp.ithome.com.tw/upload/images/20231006/20162791Vej1tIbZr2.png

二、UEFI ACPI 包入 Acpimof

我們先前已經 build 好 acpimof.x,只要以特定的 GUID 將 MOF 資訊 (acpimof.x) 包入 UEFI ACPI Device PNP0C14 _WDG,OS 開機時會 query WMI 關於 MOF GUID的資訊,WMI存在這組 GUID 的話就會回傳 MOF Table 給 OS,OS 解析後再將 MOF資訊紀錄在 WMI 資料庫,成功後 WMI 資料庫可看到相關資訊。

Name(_WDG, Buffer() {
...
// Query MOF, This GUID for returning the MOF data
0x21, 0x12, 0x90, 0x05, 0x66, 0xd5, 0xd1, 0x11, 0xb2, 0xf0, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, //
67, 65, // Object ID (CA) mapping to WQCA.
1, // Instance Count
0x00, // Flags
...
})

Name(WQCA, Buffer() { // WQXX mapping to Object ID
// Table in Wmiacpi.x, or just include Wmiacpi.x
0x46, 0x4f, 0x4d, 0x42, ...
})

結果

可在 WMI 資料庫看到 MOF 描述的 Class,

https://ithelp.ithome.com.tw/upload/images/20231006/20162791K80CJTeLyU.png

測試

用先前介紹的 WMI Explorer 2.0.0.2 (Administrator) 可直接進行測試

  • 連線 ROOT\WMI
  • 點選 AcpiTest_QULong
  • 右方 Script 頁面選取 Script Language 及 Output Format
  1. 執行測試
    https://ithelp.ithome.com.tw/upload/images/20231006/20162791MUMYvcYJpx.png

  2. 儲存 Test Script 後進行測試
    https://ithelp.ithome.com.tw/upload/images/20231006/20162791C1BXddddWM.png

結論

目前了解了 WMI 的相關知識與運作原理,WMI BIOS 部分也知道如何架構,系統方面的安裝與測試也略懂,但實際上要從無到有將相關檔案寫出來或是修改,還是需要對 Sample文件的相關語言,有較深入且詳細的了解,這部分就要繼續 K SPEC。


上一篇
[Day 29] WMI
系列文
我的第一個 BIOS 與 Web API 應用程式15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言