跳到主要內容

發表文章

目前顯示的是 十二月, 2006的文章

該死的WTSRegisterSessionNotification()在Vista下面沒用了

最近才發現WTSRegisterSessionNotification()這個Function在Vista下面已經失去作用了。變成之前在XP下面可以在切換使用者後繼續工作的程式,現在沒有作用了!上網找了一下,發現新的替代方案要去寫Service程式。天阿!哪那麼多閒功夫阿。

還好,後來發現WTSGetActiveConsoleSessionId()這個function在Vista下面還有作用。因此,透過Timer的方式定期去呼叫這個函式確定Active console session是否不一樣了。一旦不一樣,就表示session被切換了。當切換回原來的session時,就會得到一樣的id。如此便知道已經回到原來的Session了。程式概念大概如下:


DWORD MyId = -1;
BOOLEAN SessionChanged;

// 程式啟動時,先取得目前的session id並且記錄下來。
OnCreate()
{
MyId = WTSGetActiveConsoleSessionId();
SessionChanged = FALSE;
}

OnTimer()
{
if (SessionChanged)
{
if (MyId == WTSGetActiveConsoleSessionId())
{
SessionChanged = FALSE;
// Session已經重新回復到原來的session.
// 在這裡進行必要的回復工作。
}
}
else
{
if (MyId != WTSGetActiveConsoleSessionId())
{
SessionChanged = TRUE;
// Session已經被改掉了,需要在這裡趕快進行必要的處理。
}
}
}

這其實並不是一個很好的作法,因為要透過一個Timer定期的去polling,Timer的週期太短容易造成系統的負擔,太長的話,可能會抓不到Session的變化。不過,經過一些實驗之後,發現大約2-4秒的週期去polling,還沒有什麼大的問題。

如何使用多個DDK的setenv在一個batch file

下面的範例簡單的展示了如何在一個batch file進行多個不同平台的DDK驅動程式製作。看起來是很簡單,但是也花了我一段時間,因為Microsoft的MSDN上面所給的範例是錯的,根本run不起來。

REM Filename is buildall.bat.

set CWD=%cd%
set BUILD_TYPE=%1%
set DDKPATH=D:\winddk\5744

cmd /C "%DDKPATH%\bin\setenv.bat %DDKPATH% %BUILD_TYPE% WLH && cd /D %CWD% && build"
cmd /C "%DDKPATH%\bin\setenv.bat %DDKPATH% %BUILD_TYPE% AMD64 WLH && cd /D %CWD% && build"


使用時,只需要在要編譯的source code目錄下,輸入如下的命令即可:
> buildall.bat chk
或者
> buildall.bat fre

這樣一次可以建立32與64位元的Vista驅動程式版本。

包裝OutputDebugString成為printf style的介面

下面的程式將OutputDebugString包裝成printf介面,有需要的人可以自行copy回去使用,這對於輸出Debug資訊上有一定程度的幫助,另外對於看Debug message的工具,個人推薦使用DbgView ,目前最新版本已經可以在Vista 32/64-bit平台下面使用。實在是一個非常方便的工具。


#ifdef DBG

void __cdecl DbgPrint(LPCTSTR format, ...)
{
static TCHAR DbgMsg[DBG_MAX_BUFFER_SIZE];
size_t len;
TCHAR *p = DbgMsg;
va_list args;

va_start(args, format);
StringCchVPrintf(p, sizeof(DbgMsg) - 1, format, args);
StringCchLength(DbgMsg, sizeof(DbgMsg) - 1, &len);
p += len;
va_end(args);

*p++ = '\r';
*p++ = '\n';
*p = '\0';

OutputDebugString(DbgMsg);
}

#endif // DBG