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

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


枚舉服務(wù)和驅(qū)動(dòng)
有時(shí)很有必要知道系統(tǒng)當(dāng)前加載了那個(gè)服務(wù)或驅(qū)動(dòng),以及它們現(xiàn)在處于什么狀態(tài) 。為了實(shí)現(xiàn)這一目的,SC 管理器提供了另一個(gè)名為 EnumServiceStatus() 的強(qiáng)大函數(shù) 。該函數(shù)需要一個(gè)管理器句柄和一個(gè)類型為 ENUM_SERVICE_STATUS 的數(shù)組,該數(shù)組中將包含有關(guān)當(dāng)前已加載的服務(wù)或驅(qū)動(dòng)的信息 。這個(gè)列表可以根據(jù)服務(wù) / 驅(qū)動(dòng)的類型和狀態(tài)來過濾 。如果調(diào)用者提供的緩沖區(qū)不能一次性的容納所有項(xiàng)目,可反復(fù)調(diào)用該函數(shù)直到獲取所有的項(xiàng)目 。
不過很難預(yù)先計(jì)算出所需的緩沖區(qū)大小,這是因?yàn)榫彌_區(qū)必須為那些大小未知的字符串提供額外的空間,這些字符串由 ENUM_SERVICE_STATUS 的成員引用 。幸運(yùn)的是,EnumServiceStatus() 會(huì)返回剩余的項(xiàng)目所需的字節(jié)數(shù),因此可以通過反復(fù)嘗試得出確定的緩沖區(qū)大小 。列表 3-10 給出了 SERVICE_STATUS 和 ENUM_SERVICE_STATUS 結(jié)構(gòu)的定義 。這些聲明位于 Win32 頭文件 WinSvc.h 中 。
typedef struct _SERVICE_STATUS
{
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;
typedef struct _ENUM_SERVICE_STATUS
{
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS ServiceStatus;
} ENUM_SERVICE_STATUS;
列表 3-10 SERVICE_STATUS 和 ENUM_SERVICE_STATUS 結(jié)構(gòu)的定義
列表 3-11 給出的 w2kServiceList() 函數(shù)是來自 w2k_lib.dll 工具庫的另一個(gè)好東東 。它省略了前面提到的動(dòng)作,并返回一個(gè)隨時(shí)可用的結(jié)構(gòu),該結(jié)構(gòu)中包含所有請求的數(shù)據(jù)以及一對擴(kuò)展結(jié)構(gòu) 。該函數(shù)將返回一個(gè)指向 W2K_SERVICES 結(jié)構(gòu)的指針,該結(jié)構(gòu)定義于 w2k_lib.h ,在 列表 3-11 的頂部給出了其定義 。隨 ENUM_SERVICE_STATUS 結(jié)構(gòu)數(shù)組 aess[] ,W2K_SERVICES 結(jié)構(gòu)體還包含四個(gè)附加成員 。dEntrIEs 表示向狀態(tài)數(shù)組中復(fù)制了多少項(xiàng)目,dBytes 表示返回的 W2K_SERVICES 結(jié)構(gòu)的大小 。dDisplayName 和 dServiceName 被分別設(shè)置為 aess[] 中的 lpDisplayName 和 lpServiceName 字符串的最大長度 。這些值將提供很大的方便,尤其是當(dāng)你編寫一個(gè)控制臺(tái)模式的程序,在屏幕上輸出服務(wù) / 驅(qū)動(dòng)列表,并要求名稱列采用合適的對齊方式 。
為了提供精確的系統(tǒng)快照,w2kServiceList() 試圖通過一次調(diào)用 EnumServiceStatus() 來獲取所有的項(xiàng)目 。為此目的,該函數(shù)首先提供一個(gè)長度為 0 的緩沖區(qū),這通常會(huì)導(dǎo)致返回 ERROR_MORE_DATA 錯(cuò)誤代碼 。在此種情況下,EnumServiceStatus() 將返回需要的緩沖區(qū)大小,然后按照此大小分配適當(dāng)?shù)木彌_區(qū),然后再次調(diào)用 EnumServiceStatus()。此時(shí),EnumServiceStatus() 應(yīng)該返回成功 。不過,這存在一個(gè)很小的概率事件 --- 在兩次調(diào)用 EnumServiceStatus() 之間另一個(gè)項(xiàng)目可能會(huì)被增加到列表中 。因此,將會(huì)在一個(gè)循環(huán)中重復(fù)這一過程直到所有的一切都正確或者一個(gè)非 ERROR_MORE_DATA 的錯(cuò)誤返回 。
// -----------------------------------------------------------------
typedef struct _W2K_SERVICES
{
DWORD dEntries; // number of entries in aess[]
DWORD dBytes; // overall number of bytes
DWORD dDisplayName; // maximum display name length
DWORD dServiceName; // maximum service name length
ENUM_SERVICE_STATUS aess []; // service/driver status array
}
W2K_SERVICES, *PW2K_SERVICES, **PPW2K_SERVICES;
#define W2K_SERVICES_ sizeof (W2K_SERVICES)
#define W2K_SERVICES__(_n)
(W2K_SERVICES_((_n) * ENUM_SERVICE_STATUS_))
// -----------------------------------------------------------------
PW2K_SERVICES WINAPI w2kServiceList (BOOL fDriver,
BOOL fWin32,
BOOL fActive,
BOOL fInactive)

推薦閱讀