小華的部落格

bloggerads_Head

搜尋此網誌

星期二, 11月 01, 2016

ACPICA Programmer Reference Guide


隨手記錄ㄧ下AE_NOT_FOUND 出現的ㄧ些原因.

AE_NOT_FOUND : The name was not found in the namespace
AE_NOT_FOUND : A valid RSDP could not be located.
AE_NOT_FOUND : There is no table with this Signature currently loaded, or the table of the specified Instance is not loaded.

AE_NOT_FOUND : The object referenced by the combination of the Object and Pathname was not found within the namespace.

AE_NOT_FOUND: The child object parameter is the last object of the given type within the parent — a next child object was not found. If Child is NULL, this exception means that the parent object has no children.

AE_NOT_FOUND: One or more of the segments of the pathname refers to a non-existent object.

AE_NOT_FOUND: A valid ACPI table was not found at the specified Address.

AE_NOT_FOUND: An ACPI table with Signature was not found.

範例:
ACPI Error: Method parse/execution failed [\_SB.PCI0.LPCB.ECDV.ECIN] (Node 008E3F28), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\_SB.PCI0.LPCB.ECDV._REG] (Node 008E3F70), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\_SB.PCI0._INI] (Node 008D5790), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\ALSD._STA] (Node 008DD4C8), AE_NOT_FOUND (20160930/psparse-632)




星期五, 2月 19, 2016

不進步就是退步


     
     
     -- 以下並非以偏概全,純屬個人工作體驗  --

     幾年前加入了一家日商公司,原本抱持著可以跟世界上製作第一台NB的公司裡的業界前輩學習更深入的BIOS知識,但發現事實是殘酷的,經過了多年後的改變,那邊慢慢的研發精神已經沒有那麼積極了,我不會說這家公司很糟,因為還是有很多日本/台灣/大陸/其他Region同事還是努力的在做事情,但是一家公司的文化卻讓肯做事情的人事情越做越多,不肯做事情/事情做不好的人越做越少,乃至於冗員就越來越多,聊八卦破壞團隊精神的人就多(做不好不會被裁員)。

     而開發的方面,日商還是擁有許多比較封閉的開發方式,而「閉門造車」或許有其好處也有相對的壞處,而在一個世界潮流改變很快速的地方,如果不能一直學習成長,那就只能讓人超車。

     因此,幾經嘗試改變周遭同事態度失敗和思考之後,我決定離開那些負面思考/消極態度的同事以及封閉的開發方式的環境,以避免個人養老心態的產生和負面心態的養成。所以在去年所以我選擇加入了另一家外商公司,開始學習不一樣領域的知識,並繼續讓自己保持正向的思考與競爭力。

     然而,在這個新的工作領域中,我的工作內容暫時不需要自己去寫程式,雖然暫時放棄的寫程式的機會,但是我卻多了許多的機會去接觸不同的人事物,並讓自己反省過去到底浪費的多少生命在ㄧ些「不必要的人事物」 上面。

     然而「不進步就是退步」,在最近看到ㄧ些前日商台灣同事連被詢問留下機會都沒有,就被直接裁員,最近才在找工作,心中更是感概萬千。

    雖然很想幫忙,但面對到友情/現實時,我們也只能選擇性幫忙。畢竟社會是現實的,冗員與戰力你只能選擇有戰力的幫忙,否則接納到冗員的公司也只能自求多福了。
       
     所以,在世界競爭激烈的環境之下,唯有自己持續進步,在遇到這種公司關閉/退出市場或是裁員時,我們才能在裡面繼續生存下去。
                                                                                                                                      2016.02 Harrison


星期一, 2月 23, 2015

Compiler intrinsics(內建函數)

EDK2 中開/關VC++內建函數的方式

平常如果你使用Compiler /Oi 選項時,Compiler自己遇到內建函數時會自己去產生CODE到你的程式碼之中,如果你想要自己寫這些內建函數時,就必須要用/Oi- 去關閉他,以免被當成內建函數而出現Compiler error訊息。

例如,我想在我自己的xxx.c 中自己實作一個 ceil() 函數,那你可以透過EDK2 build option override方式在xxx.dsc 中來對你的xxx.inf 設定Compiler option,他只會影響你的xxx.inf。

$(MY_PATH)\xxx.inf {
  <BuildOptions>
    *_*_X64_CC_FLAGS = /Oi-
}


星期四, 12月 25, 2014

開啟CMD.EXE並一次執行多個DOS指令的方式(Command Prompt and Batch file)

這篇文章是分享如何開啟CMD.EXE時並一次執行多個DOS指令的方式。

為什麼要分享這個冷知識?
因為現在是冬天了,所以很冷。

好吧,我承認這是個很無聊的一篇文章,大家就將就點看吧 :)

首先呢,我們都知道Command Prompt 是執行CMD.EXE後就會產生出來的一個畫面,那我們能不能寫個批次檔去執行CMD.EXE又可以執行很多筆指令呢? 答案是可以的,做法就是寫個批次檔,然後透過"雙引號"去把所有指令包起來,指令跟指令中間加入 && 就可以了:


   CMD.EXE  "指令1 && 指令2 && 指令3....&&指令n"

底下就是兩個批次檔的範例,批次檔內會去執行簡單的DOS指令,執行完畢後會出現一個Command Prompt停在那邊。





那大家可能會好奇我用在哪裡? 因為我使用SlickEdit 去編寫BIOS CODE,因為懶惰,所以想說我只要開啟 BUILD TIP底下任何一個檔案,然後按個鈕,我就可以進入到工作目錄並且設定好Visual Studio 的環境讓我可以直接Compiler code....就醬~




※ 上圖可以看到我在SlickEdit 內開啟了一個檔案,叫做NT32Pkg.dsc ,然後我設定了兩個快捷鈕,這兩個快捷鈕可以讓我選擇設定VS2012/VS2010的環境,按下去之後他會幫我呼叫設定環境的批次檔,環境設定好之後會直接幫我進入到NT32Pkg.dsc 目錄(E:\UDK2014.SP1\NT32Pkg),然後我就可以很方便地在Command Prompt內做我要做的事情了。

底下是我在那兩個快捷鍵內的設定值,有分成CMD.EXE的設定方式跟BATCH的方式,差別就只是在於呼叫CMD.EXE去做事情還是自己寫個批次檔,然後呼叫那個批次檔而已。

CMD.EXE的方式:
cmd /E:ON /V:ON /k  ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat" && cd/d "%f\..""


BATCH FILE的方式(除了描述在快捷鈕之外,要多寫一個批次檔):
"C:\Apps\TEST.bat" %f

TEST.bat的內容:
@ECHO OFF
CALL "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
cd/d "%1\.."
CMD.EXE 

上述中的%f 是SlickEdit內的參數,%f = 目前檔案的完整路徑。
以上面的範例來說:

    %f   = e:\UDK2014.SP1\Nt32Pkg\Nt32Pkg
 
最後,我承認科技使用來自於人的惰性,不然也不會有這個冷知識可以分享,哈~


星期二, 12月 23, 2014

Intel® UEFI Development Kit Debugger Tool (Intel UDK Debugger and OVMFPkg)

這篇文章是紀錄我自己架設 QEMU + OVMF + Intel UDK + WinDbg 環境的筆記。

QEMU : 他是一個Open Source的處理器仿真器與模擬器。
http://wiki.qemu.org/Main_Page
   
OVMF : 他是一個UEFI EDK2 codebase裡面的一個專案,用來讓UEFI BIOS可以跑在虛擬機器(Virtual Machine)上面,在這裡的範例就是跑在QEMU裡面。
http://tianocore.github.io/ovmf/

Intel UDK Debugger : 這是INTEL開發的一個Source Level Debugger,他需要配合WinDbg(微軟提供的)才能做除錯的動作。

Intel Uefi Development Kit Debugger Tool

下面這張圖是我實際的架設環境,我在Windows 8.1裡面安裝了Intel UDK跟WinDbg然後透過虛擬的COM Port來與 QEMU裡面的BIOS.BIN(OVMF.FD)溝通。


安裝與設定(Install and Setup)

STEP1 : Download UDK2014.SP1 ,OvmfPkg and OptionRomPkg

我是把它們一起放在E:\UDK2014.SP1; 然後先準備好Compiler環境,並產生OVMF.FD. (環境的部分請參考UDK2014與OVMF的說明)。

確定Compiler 環境沒問題後,跟隨下面步驟來產生UEFI BIOS ROM。

1).先產生 OVMF.FD
   a. E:\UDK2014.SP1>edksetup.bat
   b. E:\UDK2014.SP1>build -DDEBUG_ON_SERIAL_PORT=TRUE -DSOURCE_DEBUG_ENABLE

2). 在把OVMF.FD複製一份,並修改檔案名稱為bios.bin (rename)
   (我是放在 E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV\bios.bin)
    a.E:\UDK2014.SP1> cd E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV
    b.E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV> copy OVMF.FD bios.bin

STEP2: 安裝(Install) WinDbg 
STEP3: 安裝Virtual Serial Port,你可以選擇Com0Com或是VSPD(Virtual Serial Port Driver),因為Com0Com 是免費(Free),另一個要破解(VSPD v7.2),所以我這邊就只介紹Com0Com 就好,破解版的我就自己知道就好這邊就不介紹了。

1) 先執行一個Cmd.exe with Admin (管理者權限)
   bcdedit -set TESTSIGNING ON
2)重新開機 (Reboot)
3) 安裝Com0Com 2.2.2.0 (For Windows 8.1/Win7 x64 bit) 

4) 執行 "C:\Program Files (x86)\com0com\setupc.exe",並在畫面中輸入下面指令:

    Command > Install PortName=COM6 PortName=COM7

5) 確認設備管理員(Device Manager)內有成功安裝driver,並且No yellow bang.


STEP4: 安裝(Install) Intel UDK v1.4 
※如果你是Windows 8.1 ,請設定相容性=Windows 7 (Compatibility mode=Windows 7)
 

1) 安裝過程中會指定WinDbg安裝目錄跟COM port Number,你也可以安裝完畢後,再去修改他的設定檔案(Config File):

"C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\SoftDebugger.ini"
  
底下是我實作時候的設定:
COM6 = Intel UDK
COM7 = QEMU

2) 安裝後,修改SoftDebugger.ini 加入以及修改底下的描述(RED COLOR)
"C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\SoftDebugger.ini"
[Debug]
Debug=1

[Debug Port]
Channel = Serial
Port = COM6
FlowControl = 0   
BaudRate = 115200
Server = 

STEP5:  執行Intel UDK Debugger,他會叫出WinDbg
STEP6: 執行QEMU 並且載入UEFI BIOS (Load BIOS.bin)

E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV>"C:\Program Files\qemu\qemu-system-x86_64.exe" -L . -serial COM7



如果有不清楚的部分,可以參考INTEL相關資料。







星期五, 12月 19, 2014

VC++ 可轉散發套件(Redistributable Package)


這篇文章只是要告訴大家可轉散發套件(VC++ Redistributable Package是幹甚麼的?

1)首先呢,我先在我的Win7 64 bit OS底下安裝VS2008 ,安裝時順便選擇我要裝x64 compiler,這樣子我的開發環境就會有VS2008 32 bit/64 bit compiler 功能!

2) 接著,我建立一個新的VC++空專案(VC++-->General-->Empty Project),裡面加入我自己的C 語言Source code (Tmake.c 跟Tmake.h),然後再專案屬性的地方先設定Win32 (Right click Project -->Properties ,在Platform 的地方選"Win32")

3) 先產生一次32 bit的應用程式,他會產生再輸出目錄 『Debug\Tmake.exe』

4) 接著,修改專案屬性,改選擇x64 ((Right click Project -->Properties ,在Platform 的地方選"x64"),如果你沒看到x64可以選擇,就是在安裝VisualStudio時沒選擇x64 compiler選項

5) 然後再產生一次 64 bit的應用程式,他會產生在輸出目錄『x64\Debug\Tmake.exe』

完成了步驟5之後,我就會有兩個執行檔,分別是32 bit版本跟64 bit版本。

底下是我的開發環境 (產生執行檔,但是拿到別台去執行)

OS: Windows 7 64 bit
Visual Studio 2008

底下是我的執行環境 (這台機器上面執行我自己寫的程式)

OS : Windows 8.1 64 bit
Visual Studio 2012/2013



    [圖1]  32 bit/64 bit 的主要差別除了暫存器之外就是在於 Calling Convention (呼叫慣例)

所以大家可以看到,我在Win7開發拿到另一台Win8.1 上面執行,而在Win8.1中我只安裝了Visual Studio 2012/2013這兩個版本,但是我的Win7開發時是Visual Studio 2008開發的。

所以,當我在Win8.1底下不管是執行32 bit 版本的Tmake.exe 或是  64 bit 版本的Tmake.exe 我都得到了相同的錯誤訊息。

ERROR MESSAGE:  因為應用程式檔設定不正確,所以無法啟動


[圖 2] 無論32/64 bit 都得到相同的錯誤訊息


假如你看到類似這種錯誤訊息時,只要去安裝可轉發套件,把需要的檔案補足在你的電腦中理論上問題就會消失了,但是 "你要找的到正確的版本的可轉發套件" (後面會講找不到時的解決方式)。


底下版本是VS2008 version v9.0.30729

底下版本是VS2008 v9.0.30729.6161 (比上面的還新一點)

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package MFC Security Update


另外,你可以在安裝完畢後,從System Event Log看到你到底安裝了甚麼版本:

Windows Installer 已安裝該產品。產品名稱: Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161。產品版本: 9.0.30729.6161。產品語言: 1033。製造商: Microsoft Corporation。安裝成功或錯誤狀態: 0

如果,你安裝完畢後還不能執行的話,那就是版本不同!  


如果你從System Event Log 查看,也會看到類似下面的錯誤訊息:

"D:\TmakeJpg\Debug\Tmake.exe" 的啟用內容產生失敗。 找不到依存組合 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"。

意思是說你執行Tmake.exe的電腦內的所能提供的執行環境跟這個應用程式內所要求的版本不同; 從上面的範例可以知道我安裝的都是v9.0.30729.xxxx 但是這個應用程式需要的是9.0.21022.8,這個時候,你有幾個解決方式。

方式1: 從開發的機器上把需要的檔案複製到執行的機器上的Windows\System32 底下
需要的檔案需要配合你的應用程式的類型來複製對應的檔案,例如:

Release Build 64 bit(x64):  
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Amd64\Microsoft.VC90.CRT 
Release Build 32 bit(Win32):  
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT 

msvcm90.dll
msvcp90.dll
msvcr90.dll
Microsoft.VC90.CRT.manifest

Debug Build 64 bit(x64):
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT

Debug Build 32 bit(Win32):
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT

msvcm90d.dll
msvcp90d.dll
msvcr90d.dll
Microsoft.VC90.DebugCRT.manifest

方式2 : 把前面這些需要的檔案打包變成xxx.exe 再一起拿去執行的電腦安裝與執行.

請參考: http://msdn.microsoft.com/en-us/library/ms235291(v=vs.80).aspx
              http://msdn.microsoft.com/en-us/library/aa260978%28VS.60%29.aspx

方式3: 在專案屬性中選擇使用靜態MFC Library. (Win32/X64都要設定一次) 再重新編譯執行檔就可以了。



結論 :

 VC++的轉散發套件就是給『跟你開發環境不同』的人去補足需要的Library/DLL之後,才能順利執行你所開發的應用程式。

所以,程式開發者可以選擇『自己打包好所需要的檔案』後再提供給使用者免去使用者無法執行的窘境,或是使用者自己無法執行應用程式時去安裝對應的『轉散發套件』。

[註] 我的測試程式後來採用方式3解決問題! 系統就算不安裝VC++的轉散發套件也沒問題。


星期四, 10月 23, 2014

WMI ACPI

今天要整理的筆記是WMI ACPI
       
     在BIOS工程師中,對於WMI ACPI應該大家都有玩過,因為許多的OEM都是開發一些OS端的應用程式,然後再透過WMI 這種方式去跟BIOS的ACPI ASL CODE做溝通,以達到可以讀取Thermal 資訊/EC 資訊/ BIOS Setup Utility 資訊....etc.

   
在網路上或是微軟的相關文件中,你可以看到主要的架構在於wmiacpi.sys 跟acpi.sys 之間的溝通,對於BIOS工程師來說,如果要去提供這種介面就不得不參考微軟的wmi acpi白皮書上面介紹的內容了,底下是微軟文件的說明:

http://msdn.microsoft.com/en-us/library/windows/hardware/dn614028(v=vs.85).aspx

這份文件中主要的概念有幾個:

1. 他跟你說有一個MOF(Managed Object Format) 是用來給 WMI Core使用的,所以他有個資料庫管理這些MOF檔案;當上層的APP跟WMI Core溝通時,他要去這個資料庫撈對應的MOF資訊,從MOF資訊中取得一些資訊後,才知道怎麼跟你的ACPI溝通!
2.溝通的那個ACPI Device有一個特別的PNPID,也就是PNP0C14 ! 所以BIOS工程師要宣告一個ACPI Device然後底下定義_HID , "PNP0C14" 這樣子才能夠溝通~
3.Wmi Core 溝通的方式就請自行看這篇文章,像是如何透過GUID找到ACPI _WDG內比對GUID然後找到兩個字元後,再去看Flag屬性是否是Method,然後去執行相關的ACPI Method...之類的資訊,因為這些資訊已經在網路上很多,大家也應該熟悉了,這邊就不多描述。 底下是對_WDG對應時的C語言格式:

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
};
上面的C結構會對應倒ASL的_WDG 內的定義:
   Name(_WDG, Buffer() {
        0x6a, 0x0f, 0xBC,....//GUID
        66, 65,              // Object ID (BA) (兩個字元"BA",可能會組成WQBA或是WMBA,看Flag)
        3,                   // Instance Count (有幾筆Data items)
        0x01,                // Flags (決定他是不是Method...之類的屬性來決定WQXX/WMXX...etc)
        
    }) 


那大家可能會問說,你不說運作原理那你要說甚麼?

一般BIOS工程師在Debug時一般就是利用這些運作原理去追ACPI 來找出問題點,一般大家會比較忽略說,那上層的MOF是怎麼加進去資料庫的? 所以這邊會對這部分做一個簡單的說明。在說明之前,我們先看看下面這張圖:


Vbscript :    代表的就是上層APP可以透過像是VBScript/C#....etc之類的去開發你的APP。
Wmi Core :  會去撈MOF 資訊跟Acpi.sys溝通(透過WmiAcpi.sys) 。
ACPI ASL :  你要宣告PNP0C14 ,然後有個Name Object 叫做 _WDG (上面圖畫錯了,懶得改了)。
BIOS Function: 然後透過ACPI ASL的相關Method來實做一些BIOS CODE,像是發個SMI去取得一些資訊,再透過WMI_ACPI ASL往回傳給上層APP...etc.。


Installation wmi acpi方式有兩種:

方式1: MOF包在DLL,並註冊到Registry
1. 增加上述說的那些ASL CODE到你的BIOS

2. 建立一個MOF.DLL (類似OS動態連結檔,不過裡面沒有任何OBJ只有MOF資料)
    a. 建立wmiacpi.rc 跟wmiacpi.def 檔案
    b. 透過VS2010/2012/2013 的link.exe 將他變成wmiacpi.dll 裡面沒有obj,只有 MOF資料

wmiacpi.rc 內容:

#include <windows.h>
#include <ntverp.h>

#define VER_FILETYPE            VFT_DLL
#define VER_FILESUBTYPE         VFT_UNKNOWN
#define VER_FILEDESCRIPTION_STR         "Resource only DLL containing MOF for ASL code"
#define VER_INTERNALNAME_STR            "wmimof"
#define VER_ORIGINALFILENAME_STR        "wmimof.DLL"

#include "common.ver"

//
// WMIACPI.SYS requires that the mof resource be named MofResource

MofResource MOFDATA wmiacpi.bmf


wmiacpi.def 的內容就只有一行: 
LIBRARY wmiacpi.dll

    c. link command : 

rc /fo"%OUTDIR%\wmiacpi.res" wmiacpi.rc

link /OUT:"%OUTDIR%\wmiacpi.dll" /NOLOGO /DLL "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:"wmiacpi.def" %OUTDIR%\wmiacpi.res /MANIFEST /ManifestFile:"%OUTDIR%

\wmiacpi.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:"%OUTDIR%\wmiacpi.pdb" /TLBID:1 /NOENTRY /DYNAMICBASE 

/NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE


3. 複製MOF.DLL檔案到%windir%\system32 (也就是C:\Windows\System32)

4. 在Registry 的HKEY_LOCAL_MACHINE\CurrentControlSet\Services\WmiAcpi底下新增MofImagePath,然後裡面的值指向 "C:\Windows\System32\MOF.DLL"
5. 重新開機,然後OS偵測到PNP0C14之後就會自動安裝WmiAcpi.sys 然後會去Registry 找到你包在MOF.DLL內的資料,之後用你的APP來透過WMI Core去存取你的ACPI ASL.


※ 這邊說的MOF.DLL就是你透過link.exe 建立出來的檔案,請自行變更你的名稱

方式2: MOF包在ACPI ASL,等發送特定IRP時回給Wmi Core.

1. 增加上述說的那些ASL CODE到你的BIOS

2. 建立一個MOF.BMF (MOF的Binary格式,副檔名隨便給因為你可以在Compiler時指定副檔名)

3. 透過 wmimofck.exe 產生.x 檔案,在把他的內容包到ACPI ASL之中.

a. 首先先在_WDG內定義一個專屬MOF的GUID(切記不能改變GUID值) 

   Name(_WDG, Buffer() { 
       .
       // This GUID for returning the MOF data
       0x21, 0x12, 0x90, 0x05, 0x66, 0xd5, 0xd1, 0x11, 0xb2, 0xf0, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, //
       66, 65,        // Object ID (BA)  這兩個字元可以自己改,但是要對應到WQXX.
       1,                 // Instance Count 
       0x00,          // Flags    
   })

b.將Wmiacpi.x 內容複製貼上到Name Object "WQBA"

  Name(WQBA), Buffer(){"MOF Binary data from Wmiacpi.x"}

4. 重新開機,然後OS偵測到PNP0C14之後就會自動安裝WmiAcpi.sys 然後會發送特定的IRP,然後ACPI那邊會回給WMI CORE MOF的資訊~

在這兩中方式中,都需要把wmiacpi.mof 檔案先經過一個工具叫做mofcomp.exe compiler
而這個wmiacpi.mof 檔案的內容就是你在微軟文件那邊看到的,例如:

class WMIEvent : __ExtrinsicEvent
{
};


[WMI,
 Locale("MS\\0x409"),
 Description("This class contains the definition of the package used in other classes"),
 guid("{ABBC0F60-8EA1-11d1-00A0-C90629100000}")
]
class Package
{
    [WmiDataId(1),
     read, write,
     Description("16 bytes of data")
    ] uint8 Bytes[16];

};
...

然後經過mofcomp.exe compiler之後,會產生一個MOF binary 檔案,我把他叫做wmiacpi.bmf。

而這個wmiacpi.bmf 可以經過另一個工具wmimofck.exe 來產生c file / c header file ,如果你想自己寫一個Wmi driver時,可以透過這種方式把來幫助你產生一些需要的程式碼,也可以透過wmimofck.exe來產生VBScript 的Sample code(自動產生),所以當然也可以透過wmimofck.exe來產生一堆HEX 文字檔來方便你把MOF binary資料包進去ACPI ASL之中。

底下是我的批次檔,用來測試用的,分享給大家參考~






※ 這邊使用到的資訊都是來自於微軟的相關文件,有興趣請自行查詢!

需要用到的工具:
Windows WDK內的wmimofchk.exe (我是安裝WDK for win7 ,目前最新版是WDK 8.1)

Reference 

http://msdn.microsoft.com/en-us/library/windows/hardware/dn614028(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff542012(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff554794(v=vs.85).aspx