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

《Undocumented Windows 2000 Secrets》翻譯 --- 3

第一章 Windows 2000對調(diào)試技術(shù)的支持
翻譯:Kendiv
更新:Monday, January 17, 2005
枚舉系統(tǒng)模塊和驅(qū)動(Drivers)
psapi.dll可以返回當(dāng)前內(nèi)存中的內(nèi)核模塊 。這本是非常簡單的工作 。psapi.dll的EnumDeviceDrivers()函數(shù)接受一個(gè)PVOID類型的數(shù)組,它將用當(dāng)前活動的內(nèi)核驅(qū)動模塊(active kernel-mode driver)的映像基址(image base address)來填充這個(gè)數(shù)組,這包括基本的內(nèi)核模塊ntdll.dll、ntoskrnl.exe、Win32K.sys、hal.dll和bootvid.dll 。返回值是這些可執(zhí)行文件映射到的虛擬內(nèi)存地址(譯注,也稱作線性地址) 。如果你使用內(nèi)核調(diào)試器或其他調(diào)試工具檢查這些地址的最初幾個(gè)字節(jié),你將清楚地認(rèn)出那個(gè)有名的Dos stub程序,它以著名的Mark Zbikowski的首字母大寫“MZ”開始,內(nèi)含一個(gè)文本消息--“This program cannot be run in DOS mode”或類似的東西 。列表1-3展示了一個(gè)使用EnumDeviceDrivers()的簡單函數(shù),以及EnumDeviceDrivers函數(shù)的原型 。
BOOL WINAPI EnumDeviceDrivers ( PVOID* lpImageBase,
DWord; cb,
PDWORD lpcbNeeded);
PPVOID WINAPI dbgDriverAddresses( PDWORD pdCount )
{
DWORD dSize;
DWORD dCount = 0;
PPVOID ppList = NULL;
dSize = SIZE_MINIMUM * sizeof( PVOID );
【《Undocumented Windows 2000 Secrets》翻譯 --- 3】 while ( (ppList = dbgMemoryCreate(dSize)) != NULL )
{
if ( EnumDeviceDrivers( ppList, dSize, &dCount) && (dCount < dSize) )
{
dCount /= sizeof( PVOID );
break;
}
dCount = 0;
ppList = dbgMemoryDestroy( ppList );
if ( (dSize <<= 1) > (SIZE_MAXIMUM * sizeof( PVOID )))
{
break;
}
}
if ( pdCount != NULL )
{
*pdCount = dCount;
}
return ppList;
}
列表1-3枚舉系統(tǒng)模塊地址
EnumDeviceDrivers()期望三個(gè)參數(shù):一個(gè)數(shù)組指針,一個(gè)表示輸入大小的值以及一個(gè)用于輸出的類型為DWORD的變量 。第二個(gè)參數(shù)指定了傳入的數(shù)組的字節(jié)數(shù),第三個(gè)參數(shù)表示復(fù)制到該數(shù)組中的字節(jié)數(shù) 。因此,你必須將返回值除以sizeof(PVOID)來確定有多少個(gè)地址數(shù)據(jù)復(fù)制到了數(shù)組中 。不幸的是,該函數(shù)不能幫助你確定該提供多大的數(shù)組,盡管它實(shí)際上知道有多少個(gè)Driver在運(yùn)行 。但它僅僅告訴你返回了多少字節(jié),而且,如果數(shù)組太小,它會隱藏多出的字節(jié) 。因此,你必須使用無聊的trial-and-error循環(huán)來確定適當(dāng)?shù)臄?shù)組大小,就如同列表1-3所示的那樣,只要返回值與數(shù)組大小相同就假定還有數(shù)據(jù)未復(fù)制到數(shù)組中 。在剛開始時(shí),代碼中使用了一個(gè)合理的最小值--256(由SIZE_MINIMUM表示),這通常都足夠大了,但是如果不夠的話,在開始新的循環(huán)時(shí),數(shù)組大小會增加為原來的2倍,直到獲取了所有的指針或者數(shù)組大小超過了65,536 。數(shù)組使用的內(nèi)存緩沖區(qū)由兩個(gè)幫助函數(shù)dbgMemoryCreate()和dbgMemoryDestroy()提供,這兩個(gè)函數(shù)只是Win32函數(shù)LocalAlloc和LocalFree的外包而已,這兒就不列出了 。
BOOL WINAPI EnumDeviceDrivers( PVOID* lpImageBase,
DWORD; cb,
DWORD* lpcbNeeded)
{
SYSTEM_MODULE_INFORMATION; smi;
PSYSTEM_MODULE_INFORMATION psmi;
DWORD;;;dSize, i;
NTSTATUSns;
BOOL;;;;fOk = FALSE;
ns = NtQuerySystemInformation( SystemModuleInformation,
&smi, sizeof(smi),NULL);
if ( (STATUS_SUCCESS == ns) | (STATUS_INFO_LENGTH_MISMATCH == ns) )
{
dSize = sizeof(SYSTEM_MODULE_INFORMATION)
;(smi.dCount*sizeof(SYSTEM_MODULE));
if ( (psmi = LocalAlloc(LEME_FIXED,dSize)) != NULL )
{
ns = NtQuerySystemInformation( SystemModuleInformation,psmi,dSize,NULL );
if ( ns == STATUS_SUCCESS )
{
for( i = 0; (i < psmi->dCount) && (i < cb/sizeof(DWORD))i)
lpImageBase[i] = psmi->aModules[i].pImageBase;

推薦閱讀