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

4 《Undocumented Windows 2000 Secrets》翻譯 --- 第三章( 二 )


w2kServiceLoadEx() 是一個(gè)十分強(qiáng)大的函數(shù) 。它會(huì)構(gòu)建自動(dòng)加載一個(gè)服務(wù)時(shí)所需的全部參數(shù),但你要提供可執(zhí)行文件的路徑 。SC 管理器的 CreateService() 函數(shù)所需要的服務(wù)名稱(chēng)將從可執(zhí)行文件名(會(huì)去掉文件的擴(kuò)展名)中派生出來(lái) 。為了給新創(chuàng)建的服務(wù)構(gòu)建一個(gè)適當(dāng)?shù)挠糜陲@示名稱(chēng),w2kServiceLoadEx() 會(huì)嘗試從文件的版本信息中讀取 FileDescription 字符串 。如果可執(zhí)行文件中不包含版本信息,或者 FileDescription 字符串不可用,則將使用缺省的服務(wù)名稱(chēng) 。
和 w2kServiceLoad() 不同,w2kServiceLoadEx() 支持路徑中的環(huán)境變量 。換句話(huà)說(shuō),如果路徑字符串中包含如 %SystemRoot% 或 %TEMP% 這樣的子串,它們會(huì)被相應(yīng)系統(tǒng)變量的當(dāng)前值替換掉 。w2kServiceUnloadEx() 是 w2kServiceLoadEx() 的很好的搭檔,它會(huì)從提供的路徑中提取服務(wù)的名稱(chēng),與前面提及的展開(kāi)過(guò)程類(lèi)似,并將提取出來(lái)的服務(wù)名稱(chēng)傳遞給 w2kServiceUnload()。這兩個(gè)函數(shù)是需要加載 / 卸載第三方設(shè)備驅(qū)動(dòng)的應(yīng)用程序的理想搭檔,只需提供這些驅(qū)動(dòng)的全路徑即可 。本書(shū)的光盤(pán)中包含一個(gè)這樣的示例程序 。
控制臺(tái)模式的工具 -----w2k_load.exe 是一個(gè)通用的內(nèi)核驅(qū)動(dòng)程序加載 / 卸載器,它為 w2kServiceLoadEx() 和 w2kServiceUnloadEx() 提供了簡(jiǎn)單的命令行接口 。其源代碼可以在隨書(shū) CD 的 srcw2k_load 目錄下找到 。列表 3-9 給出了相關(guān)的代碼,該工具僅是一種示意性的實(shí)現(xiàn) 。因?yàn)榇罅康墓ぷ鞫际怯?w2k_lib.dll 中的 w2kServiceLoadEx() 和 w2kServiceUnloadEx() 完成的 。
// =================================================================
// GLOBAL STRINGS
// =================================================================
Word awUsage [] =
L"rn"
L"Usage: " SW(MAIN_MODULE) L" rn"
L" " SW(MAIN_MODULE) L" %srn"
L" " SW(MAIN_MODULE) L" %srn";
WORD awUnload [] = L"/unload";
WORD awOk [] = L"OKrn";
WORD awError [] = L"ERRORrn";
// =================================================================
// COMMAND HANDLERS
// =================================================================
BOOL WINAPI DriverLoad (PWORD pwPath)
{
SC_HANDLE hManager;
BOOL fOk = FALSE;
_printf (L"rnLoading "%s" ... ", pwPath);
if ((hManager = w2kServiceLoadEx (pwPath, TRUE)) != NULL)
{
w2kServiceDisconnect (hManager);
fOk = TRUE;
}
_printf (fOk ? awOk : awError);
return fOk;
}
// -----------------------------------------------------------------
BOOL WINAPI DriverUnload (PWORD pwPath)
{
BOOL fOk = FALSE;
_printf (L"rnUnloading "%s" ... ", pwPath);
fOk = w2kServiceUnloadEx (pwPath, NULL);
_printf (fOk ? awOk : awError);
return fOk;
}
// =================================================================
// MAIN PROGRAM
// =================================================================
DWORD Main (DWORD argc, PTBYTE *argv, PTBYTE *argp)
{
_printf (atAbout);
if (argc == 2)
{
DriverLoad (argv [1]);
}
else
{
if ((argc == 3) && (!lstrcmpi (argv [2], awUnload)))
{
DriverUnload (argv [1]);
}
else
{
_printf (awUsage, awUnload, awUnload);
}
}
return 0;
}
// =================================================================
// END OF PROGRAM
// =================================================================
列表 3-9. 加載 / 卸載設(shè)備驅(qū)動(dòng)
表 3-4 中剩余的庫(kù)函數(shù)在更低一級(jí)的層面上工作,它們都在 w2k_lib.dll 內(nèi)部使用 。當(dāng)然,如果你喜歡的話(huà),你也可以從你的程序里調(diào)用它們 。從 列表 3-8 給出的它們的源代碼中,可以很容易得出它們的使用方式 。

推薦閱讀