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

《Undocumented Windows 2000 Secrets》翻譯 --- 3( 三 )


BOOL WINAPI EnumProcesses( DWORD* lpidProcess,
DWORD; cb,
DWORD* lpcbNeeded);
PDWORD WINAPI dbgProcessIds( PDWORD pdCount )
{
DWORD dSize;
DWORD dCount = 0;
PDWORD pdList = NULL;
dSize = SIZE_MINIMUM * sizeof( DWORD );
while ( (pdList = dbgMemoryCreate(dSize)) != NULL )
{
if ( EnumProcesses( pdList, dSize, &dCount) && (dCount < dSize) )
{
dCount /= sizeof( DWORD );
break;
}
dCount = 0;
pdList = dbgMemoryDestroy(pdList);
if ( (dSize <<= 1) > (SIZE_MXAIMUM*sizeof(DWORD)) ); break;
}
if ( pdCount != NULL ) *pdCount = dCount;
return pdList;
}
列表1-5; 枚舉進(jìn)程ID
在看過EnumDeviceDrivers()是如何浪費(fèi)從NtQuerySystemInformation()返回的數(shù)據(jù)后,不幸的是,EnumProcesses也是和其類似的函數(shù),但,事實(shí)上,這個(gè)函數(shù)更糟糕!因?yàn)榭捎玫倪M(jìn)程信息要遠(yuǎn)多于驅(qū)動(dòng)模塊的信息,因?yàn)檫M(jìn)程數(shù)據(jù)之后還包含很多有關(guān)系統(tǒng)中每個(gè)線程的詳細(xì)信息 。在我寫下這段文字時(shí),我的系統(tǒng)正運(yùn)行著37個(gè)進(jìn)程,調(diào)用NtQuerySystemInformation()產(chǎn)了一個(gè)24,488字節(jié)的數(shù)據(jù)塊!而當(dāng)EnumProcesses()處理完這些數(shù)據(jù)后,僅剩下了148字節(jié),這些剛好夠存放37個(gè)進(jìn)程ID 。
盡管EnumDeviceDirvers()讓我有些難過,但EnumProcesses()卻真正傷害了我的心 。如果你需要使用未文檔化API函數(shù)的理由,那這兩個(gè)函數(shù)就是最好的證據(jù) 。如果實(shí)際的工作只需一步既可完成,那為什么還要使用如此低效的函數(shù)呢?為什么不自己調(diào)用NtQuerySystemInformation()函數(shù)自由的獲取感興趣的系統(tǒng)信息?微軟提供的許多系統(tǒng)管理工具都依賴于NtQuerySystemInformation()而不是psapi.dll,so why settle for less?
BOOL WINAPI EnumProcesses( PDWORD lpidProcess,
DWORD; cb,
;PDWORD lpcbNeeded)
{
PSYSTEM_PROCESS_INFORMATION pspi, pSpiNext;
DWORD;;;;dSize, i;
NTSTATUS;ns;
BOOL;;;;;fOk = FALSE;
// 0x8000 = 32KB
for (dSize=0x8000; ((pspi = LocalAlloc(LMEM_FIXED,dSize)) != NULL);
;;dSize= 0x8000)
{
ns = NtQuerySystemInformation( SystemProcessInformation,pspi,
dSize, NULL);
if ( STATUS_SUCCESS == ns )
{
pSpiNext = pspi;
for ( i=0; i < cb/sizeof(DWORD); i)
{
lpidProcess[i] = pspiNext->dUniqueProcessId;
pSpiNext = (PSYSTEM_PROCESS_INFORMATION)
;;;;((BYTE)pSpiNext pSpiNext->dNext);
}
*lpcbNeeded = i * sizeof(DWORD);
fOk = TRUE;
}
LocalFree(pspi);
if ( fOk || (ns != STATUS_INFO_LENGTH_MISMATCH) )
{
if ( !fOk) SetLastError(RtlNtStatusToDosError(ns));
break;
}
return fOk;
}
列表1-6; EnumProcesses()函數(shù)的示例實(shí)現(xiàn)
枚舉進(jìn)程模塊
一但你從EnumProcess()返回的進(jìn)程列表中發(fā)現(xiàn)了你感興趣的進(jìn)程ID,你可能會(huì)想知道在此進(jìn)程的虛擬地址空間中加載了哪些模塊 。psapi.dll提供了另一個(gè)API函數(shù)來完成此功能,叫做EnumProcessModules() 。與EnumDeviceDrivers()和EnumProcesses()不同,這個(gè)函數(shù)需要四個(gè)參數(shù)(參見列表1-7) 。不同于前兩個(gè)返回系統(tǒng)全局列表的函數(shù),EnumProcessModules()只取回指定進(jìn)程的列表,因此,增加的那個(gè)參數(shù)唯一表示一個(gè)進(jìn)程 。然而,該函數(shù)需要一個(gè)進(jìn)程句柄(HANDLE)來代替進(jìn)程ID 。為了通過進(jìn)程ID獲取其句柄(HANDLE),必須調(diào)用OpenProcess()函數(shù) 。
BOOL WINAPI EnumProcessModule( HNADLEhProcess,
HMODULE* lphModule,
DWORD;cb,
DWORD*lpcbNeeded);
PHMODULE WINAPI dbgProcessModules( HANDLE hProcess, PDWORD pdCount)
{
DWORD;dSize;
DWORD;dCount = 0;
PHMODULE phList = NULL;
if ( hProcess != NULL )
{
dSize = SIZE_MINIMUM * sizeof( HMODULE );
while ( (phList = dbgMemoryCreate(dSize)) != NULL )
{
if ( EnumProcessModules(hProcess,phList,dSize,&dCount))

推薦閱讀