2008年1月24日 星期四

WinCE Driver DLL 的 dpCurSettings

在Wince Driver的Source Code中,都會出現一個Global variable-
dpCurSettings,在Google上看到Travis Hobrla 的一篇文章
"Debug messages and debug zones in Windows CE",才知道
dpCurSettings是用來作為Windows CE上Debug Message
(DEBUGMSG)的設定參數。

DEBUGMSG這個Macro宣告在usbfn.h這個header file中,
(PS:DEBUGZONE的宣告在DbgApi.h)除此之外,與DEBUGMSG
有關的設定有三個:

(1)定義各個 Debug Zone 在每個module中,一般來說可有16個Debug
Zone,在定義Debug Zone的時候,同時給予其對應的編號例如:
#ifdef DEBUG
#define ZONE_ERROR DEBUGZONE(0)
#define ZONE_WARNING DEBUGZONE(1)
// ... etc.
#endif

(2)宣告一個名為 dbCurSettings 的 DBGPARAM Structure
例如:
DBGPARAM dpCurSettings =
{
TEXT("PCIBUS"),
{ TEXT("Errors"), TEXT("Warnings"),
TEXT("Functions"), TEXT("Initialization"),
TEXT("Enumeration"), TEXT("Load Order"),
TEXT("Resource"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined")
},
DBG_ERROR | DBG_WARNING
};
這個例子裡,一個名為PCIBUS的module(driver)具有7個Debug
Zone, 分別為"Errors", "Warnings", "Functions", "Initialization",
"Enumeration", "Load Order", "Resource", 最後的
DBG_ERROR DBG_WARNING代表 Error 與 Waring兩個Zone
預設為Active(其他送到Inactiver 的Debug Zone 的Message將會被
丟棄)

關於設定active by default的Debug Zone還有另一種方式:透過設定
一個 DWORD的mask - ulZoneMask, 例如上面的例子中要透過設定
ulZoneMask 指定Default Zone,則可透過下面的設定:
dpCurSettings.ulZoneMask = 0x3;

另外,如果要開啟所有可開的DebugZone,可以設定
ulZoneMask = 0xFFFF
或是
DBGPARAM dpCurSettings =
{
//...
0xFFFF
}

在第一點的說明中,每個module可有16個Debug Zone,並透過16個
bit作設定,其中每個bit代表一個array index,表示Debug zone的
output status(on/off),例如“Errors”是第一個debug zone,所以
DBG_ERROR為1(將第一個bit設為 1),同理DBG_WARNING為2,
因此ulZoneMask為3 (PS:所以DBG_ERROR DBG_WARNING也可用
0x3代替)

(3)呼叫DEBUGREGISTER(dllInstance)
例如:
DllEntry (HANDLE hinstDLL, DWORD Op, LPVOID lpvReserved)
{
switch (Op)
{
//......
case DLL_PROCESS_ATTACH :
DEBUGREGISTER((HINSTANCE)hinstDLL);
break;
//......
}
}

在使用DEBUGMSG上,原型的宣告中
#define FUNCTION_ENTER_MSG() DEBUGMSG(ZONE_FUNCTION, \
(_T("%s ++\r\n"), pszFname))
因此DEBUGMSG可具有三個參數(也可以是兩個),例如:
DEBUGMSG(ZONE_Enumeration, (L"PCIBUS!PCIRegClean %d \
devices to check\r\n", NumDevKeys));
或是
DEBUGMSG(ZONE_Initialization, (L“I really like blogs.\r\n”));

1 則留言:

chialin 提到...

想請問一下,如果使用 WINCE 的 emulator,此 debug message 是會在debug 視窗中出現嗎?謝謝。