日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

8 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 三 )


&svi, SPY_VERSION_INFO_))
{
_printf (L"rn%s V%lu.lu readyrn",
svi.awName,
svi.dVersion / 100, svi.dVersion % 100);
}
dOptions = COMMAND_OPTION_NONE;
dRequest = CommandParse (hDevice, ppwArguments, dArguments,
TRUE, &dOptions);
dOptions = COMMAND_OPTION_NONE;
dReceive = CommandParse (hDevice, ppwArguments, dArguments,
FALSE, &dOptions);
if (dRequest)
{
_printf (awSummary,
dRequest, (dRequest == 1 ? awByte : awBytes),
dReceive, (dReceive == 1 ? awByte : awBytes));
}
_printf (L"rnClosing the spy device ...rn");
CloseHandle (hDevice);
}
else
{
_printf (L"Unable to open the spy device.rn");
}
if ((hControl != NULL) && gfSpyUnload)
{
_printf (L"Unloading the spy device ...rn");
w2kServiceUnload (awSpyDevice, hControl);
}
return;
}
列表 4-29. 控制 Spy 設(shè)備
請注意 列表 4-29 頂部給出的四個全局字符串的定義 。常量 DRV_FILENAME 、 DRV_MODULE 、 DRV_NAME 和 DRV_PATH 來自 Spy 驅(qū)動的頭文件 w2k_spy.h。表 4-4 列出了它們的當前值 。你不會在 w2k_mem.exe 的源代碼中發(fā)現(xiàn)設(shè)備相關(guān)的定義,w2k_spy.h 提供了客戶端程序所需的一切 。這非常重要:如果以后改變了任何設(shè)備相關(guān)的定義,就不需要更新任何程序文件了 。只需要以新的頭文件編譯、鏈接程序即可 。
列表 4-29 頂部調(diào)用的 w2kFilePath() 可以保證由全局變量 awSpyFile (見 表 4-4 )指定的 w2k_spy.sys 總是從 w2k_mem.exe 所在目錄中加載 。接下來,列表 4-29 中的代碼將全局字符串 awSpyDevice 和 awSpyDisplay ()傳遞給 w2kServiceLoad(),以加載 Spy 設(shè)備的驅(qū)動 。如果驅(qū)動沒有被加載,這些字符串將被保存在驅(qū)動的屬性列表中,可以由其他程序取出;否則,將保留當前的屬性設(shè)置 。盡管 列表 4-29 中的 w2kServiceLoad() 調(diào)用可返回一個句柄,但這并不是一個可用于任何 IOCTL 函數(shù)的句柄 。要獲取 Spy 設(shè)備的句柄,必須使用 Win32 的多用途函數(shù) CreateFile()。該函數(shù)可打開或創(chuàng)建 Windows 2000 中幾乎所有可被打開和創(chuàng)建的東西 。如果提供了內(nèi)核設(shè)備的符號鏈接名,形如 . 給 CreateFile() 的 lpFileName 參數(shù),那么該函數(shù)就可打開這個內(nèi)核設(shè)備 。Spy 設(shè)備的符號鏈接名是: w2k_spy,因此,CreateFile() 的第一個參數(shù)必須是 .w2k_spy,這正是 表 4-4 中的 awSpyPath 的值 。
表 4-4. 設(shè)備相關(guān)的字符串定義
w2k_spy 常量
w2k_mem 變量

DRV_FILENAME
awSpyFile
w2k_spy.sys
DRV_MODULE
awSpyDevice
w2k_spy
DRV_NAME
awSpyDisplay
SBS Windows 2000 Spy Device
DRV_PATH
awSpyPath
. w2k_spy
如果 CreateFile() 成功,它將返回一個設(shè)備的句柄,該句柄可傳遞給 DeviceIoControl()。列表 4-29 中的 Execute() 函數(shù)使用該句柄來查詢 Spy 設(shè)備的版本信息,如果 IOCTL 調(diào)用成功,該信息將會在屏幕上顯示出來 。接下來,CommandParser() 函數(shù)將被調(diào)用兩次,第一次調(diào)用只是簡單的檢查命令行中是否有無效的參數(shù),并顯示任何可能的錯誤 。第二次調(diào)用則執(zhí)行所有的命令 。我不想討論該函數(shù)的細節(jié) 。列表 4-29 中的剩余代碼是為了進行清理工作,如關(guān)閉句柄和卸載 Spy 驅(qū)動(該功能是可選的) 。w2k_mem.exe 的源代碼中還有一些有趣的代碼片斷,但我不在這里討論它們了 。請參考本書光盤的 srcw2k_mem 目錄下的 w2k_mem.c 和 w2k_mem.h。
現(xiàn)在唯一需要注意的就是 gfSpyUnload 標志,該標志決定是否卸載 Spy 驅(qū)動 。我已經(jīng)將這個全局標志設(shè)為了 FALSE,因此不會自動卸載該驅(qū)動 。這提高 w2k_mem.exe 或 w2k_spy.sys 的任何客戶端的性能,因為加載一個驅(qū)動需要花費一定的時間 。只有第一個客戶端會產(chǎn)生加載開銷 。這種設(shè)置還可避免多個客戶端間的競爭,如,一個客戶試圖卸載該驅(qū)動而此時另一個還在使用這個驅(qū)動 。當然,Windows 2000 不會卸載一個驅(qū)動,除非該驅(qū)動的所有句柄都被關(guān)閉了,但系統(tǒng)會將驅(qū)動置于 STOP_PENDING 狀態(tài),這樣新的客戶端將無法訪問此設(shè)備 。不過,如果你不在一個多客戶端的環(huán)境下運行 w2k_spy.sys,而且你需要經(jīng)常更新設(shè)備的驅(qū)動程序,你就應(yīng)該將 gfSpyUnload 標志設(shè)為 TRUE。

推薦閱讀