序号 |
函数名称 |
ImageHlp.DLL |
DbgHelp.DLL |
1 |
Bindlmage |
N/A |
|
2 |
BindlmageEx |
N/A |
|
3 |
CheckSumMappedFile |
N/A |
|
4 |
EnumerateLoadedModules |
||
5 |
EnumerateLoadedModules64 |
||
6 |
ExtensionApiVersion |
N/A |
|
7 |
FindDebuglnfoFile |
||
8 |
FindDebuglnfoFileEx |
||
9 |
FindExecutablelmage |
||
10 |
FindExecutablelmageEx |
||
11 |
FindFilelnSearchPath |
||
12 |
GetlmageConfiglnformation |
N/A |
|
13 |
GetlmageUnusedHeaderBytes |
N/A |
|
14 |
GetTimestampForLoadedLibrary |
||
15 |
ImageAddCertificate |
N/A |
|
16 |
ImageDirectoryEntryToData |
||
17 |
ImageDirectoryEntryToDataEx |
||
18 |
ImageEnumerateCertificates |
N/A |
|
19 |
ImageGetCertificateData |
N/A |
|
20 |
ImageGetCertificateHeader |
N/A |
|
21 |
ImageGetDigestStream |
N/A |
|
22 |
ImagehlpApiVersion |
||
23 |
ImagehlpApiVersionEx |
||
24 |
ImageLoad |
N/A |
|
25 |
ImageNtHeader |
||
26 |
ImageRemoveCertificate |
N/A |
|
27 |
ImageRvaToSection |
||
28 |
ImageRvaToVa |
||
29 |
ImageUnload |
N/A |
|
30 |
MakeSureDirectoryPathExists |
||
31 |
MapAndLoad |
N/A |
|
32 |
MapDebuglnformation |
||
33 |
MapFileAndCheckSumA |
N/A |
|
34 |
MapFileAndCheckSumW |
N/A |
|
35 |
ReBaselmage |
N/A |
|
36 |
ReBaseImage64 |
N/A |
|
37 |
RemovePrivateCvSymbolic |
N/A |
|
38 |
RemovePrivateCvSymbolicEx |
N/A |
|
39 |
RemoveRelocations |
N/A |
|
40 |
SearchTreeForFile |
||
41 |
SetlmageConfiglnformation |
N/A |
|
42 |
SplitSymbols |
N/A |
|
43 |
StackWalk |
||
44 |
StackWalk64 |
||
45 |
Sym |
N/A |
|
46 |
SymCleanup |
||
47 |
SymEnumerateModules |
||
48 |
SymEnumerateModules64 |
||
49 |
SymEnumerateSymbols |
||
50 |
SymEnumerateSymbols64 |
||
51 |
SymEnumerateSymbolsW |
||
52 |
SymFunctionTableAccess |
||
53 |
SymFunctionTa ble Access64 |
||
54 |
SymGetLineFromAddr |
||
55 |
SymGetLineFromAddr64 |
||
56 |
SymGetLineFromName |
||
57 |
SymGetLineFromName64 |
||
58 |
SymGetLineNext |
||
59 |
SymGetLineNext64 |
||
60 |
SymGetLinePrev |
||
61 |
SymGetLinePrev64 |
||
62 |
SymGetModuleBase |
||
63 |
SymGetModuleBase64 |
||
64 |
SymGetModulelnfo |
||
65 |
SymGetModuleInfo64 |
||
66 |
SymGetModulelnfo Ex |
||
67 |
SymGetModulelnfo Ex64 |
||
68 |
SymGetModulelnfoW |
||
69 |
SymGetModulelnfo W64 |
||
70 |
SymGetOptions |
||
71 |
SymGetSearchPath |
||
72 |
SymGetSymbolInfo |
||
73 |
SymGetSymbolInfo64 |
||
74 |
SymGetSymFromAddr |
||
75 |
SymGetSymFromAddr64 |
||
76 |
SymGetSymFromName |
||
77 |
SymGetSymFromName64 |
||
78 |
SymGetSymNext |
||
79 |
SymGetSymNext64 |
||
80 |
SymGetSymPrev |
||
81 |
SymGetSymPrev64 |
||
82 |
Symlnitialize |
||
83 |
SymLoadModule |
||
84 |
SymLoadModule64 |
||
85 |
SymMatchFileName |
||
86 |
SymEnumerateSymbolsW64 |
||
87 |
SymRegisterCallback |
||
88 |
SymRegisterCallback64 |
||
89 |
SymRegisterFunctionEntryCallback |
||
90 |
SymRegisterFunctionEntryCallback64 |
||
91 |
SymSetOptions |
||
92 |
SymSetSearchPath |
||
93 |
SymUnDName |
||
94 |
SymUnDName64 |
||
95 |
SymUnloadModule |
||
96 |
SymUnloadModule64 |
||
97 |
TouchFileTimes |
N/A |
|
98 |
UnDecorateSymbolName |
||
99 |
UnMapAndLoad |
N/A |
|
100 |
UnmapDebuglnformation |
||
101 |
UpdateDebuglnfoFile |
N/A |
|
102 |
UpdateDebuglnfoFileEx |
N/A |
|
103 |
WinDbgExtensionDllInit |
N/A |
在本节的示例代码中,我会演示如何使用psapi.dll和imagehlp.dll完成如下任务:
l 枚举所有内核组件和驱动程序
l 枚举系统当前管理的所有进程
l 枚举加载到进程地址空间的所有模块(modules)
l 枚举一个给定组件的所有符号(如果其符号文件可用的话)
psapi.dll的接口并不像其设计的那样好。它提供了最小的功能集,尽管它曾试图增加一些便利性。虽然,它能从内核获取一些信息但却扔掉了其中的大多数,只留下很少一部分。
由于psapi.dll和imagehlp.dll的函数并不是标准Win32 API的一部分,它们所需的头文件和导入库不会自动包括在Visual C/C++工程中。因此,列表1-2中列出的四个指示符(directives)应该在你的原文件中出现。第一部分是所需的头文件,剩余部分用于和这两个DLL中的导出函数建立动态链接。
#include <imagehlp.h>
#include <psapi.h>
#pragma comment (linker,”/defaultlib:imagehlp.dll”)
#pragma comment (linker,”/defaultlib:psapi.dll”)
列表1-2增加psapi.dll和imagehlp.dll到Visual C/C++工程
译注:
其实,也可以采用静态链接,如下:
#pragma comment(lib,”psapi.lib”)
#pragma comment(lib,”imagehlp.lib”)
这样,就不需要目标平台必须有这两个DLL了。
光盘中的示列代码
在本书的附带光盘中,有两个工程是构建与psapi.dll和imagehlp.dll之上。其中一个示例工程是w2k_sym.exe----一个Windows 2000符号浏览器,它可以从任意符号文件中提取符号名称(假如你已经安装了的话)。它输出的符号表可以按照名称、地址和大小来排序,同时接受一个采用通配符的过滤器。作为附送功能,w2k_sym.exe还可列出当前活动的系统模块/驱动程序的名称,运行的进程和每个进程加载的模块。另一个示例工程是调试支持库w2k_dbg.dll,这个库包含几个便于使用的针对psapi.dll和imagehlp.dll的外包函数。w2k_sym.exe完全依赖这个DLL。这些工程的源代码分别位于光盘的srcw2k_dbg和srcw2k_sym目录。
表1-2列出了w2k_dbg.dll用到的函数名称。A./W列表示对ANSI和Unicode的支持情况。稍早提示过,psapi.dll同时支持ANSI和Unicode。不幸的是,imagehlp.dll和dbghelp.dll没有这么聪明,其中几个函数只能接受ANSI字符串。这有些烦人,因为Windows 2000的调试程序通常不能运行在Windows 9x上,所以不该限制使用Unicode。若将imagehlp.dll假如你的工程中,你就必须选择是使用ANSI还是来回转化Unicode字符串。因为我很讨厌在一个可处理16位字符串的系统中使用8位的字符串,所以我选择后一种方法。w2k_dbg.dll导出的所有函数中涉及的字符串默认都是Unicode。所以,如果你在自己的Windows 2000工程中使用这个DLL不需要再关心字符大小问题。
另一方面,imagehlp.dll和dbghelp.dll有一个psapi.dll没有的特性:他们同样适用于Win64----让每个开发人员恐惧的64位Windows,这是因为没人知道将Win32程序移植到Win64有多困难。这些DLL导出了Win64 API函数,好吧----或许有一天我们会用到他们。
名称 |
A/W |
库 |
EnumDeviceDrivers |
psapi.dll |
|
EnumProcesses |
psapi.dll |
|
EnumProcessModules |
psapi.dll |
|
GetDeviceDriverFileName |
A/W |
psapi.dll |
GetModuleFileNameEx |
A/W |
psapi.dll |
GetModulelnformation |
psapi.dll |
|
ImageLoad |
A |
imagehlp.dll |
ImageUnload |
imagehlp.dll |
|
SymCleanup |
imagehlp.dll |
|
SymEnumerateSymbols |
A/W |
imagehlp.dll |
Symlnitialize |
A |
imagehlp.dll |
SymLoadModule |
A |
imagehlp.dll |
SymUnloadModule |
imagehlp.dll |
表1-2; w2k_dbg.dll使用的调试函数
我没有深入的探究psapi.dll和imagehlp.dll。本书的焦点在于未文档化的接口,而且在SDK中与这两个DLL的接口有关的文档还算不错。可是,我并不打算完全绕过它们,因为它们和Windows 2000 Native API(将在第2章讨论)紧密联系在一起。而且,psapi.dll是证明为什么未文档化的接口比文档化的那个更好的最佳实例。该DLL的接口不仅仅只是看上去的简单和笨拙---在某些地方它竟然会返回明显矛盾的数据。如果我不得不编写一个专业的调试工具来出售,我是不会指望这个DLL的。Windows 2000内核提供了强大、通用和更加合适的调试API函数。然而,这些几乎都没有文档化。幸运的是,微软提供的许多系统工具都广泛的使用了这些API,so it has undergone only slight changes across Windows NT versions。是的,如果你使用了这些API,每当发布了新版的NT,你就必须修订和小心的测试你的软件,但是它们带来的好处远大于这些障碍。
本章随后的大多数示例代码都来自w2k_dbg.dll,你可以在光盘的srcw2k_dbgw2k_dbg.c中发现它们。这个DLL封装了多个步骤,以返回更丰富的信息。数据会以合适的大小、链表(包括可选的索引值)返回,以便于对它们进行排序等操作。表1-3列出了w2k_dbg.dll导出的所有API函数。这些函数很多,详细讨论每个函数已经超出了本章的范围,因此我鼓励你去参考w2k_sym.exe的源代码(位于光盘srcw2k_symx),来学习它们的典型用法。
表1-3
函数名称 |
描 述 |
dbgBaseDriver |
Return the base address and size of a driver, given its path |
dbgBaseModule |
Return the base address and size of a DLL module |
dbgCrc32Block |
Compute the CRC32 of a memory block |
dbgCrc32Byte |
Bytewise computation of a CRC32 |
dbgCrc32Start |
CRC32 preconditioning |
dbgCrc32Stop |
CRC32 postconditioning |
dbgDriverAdd |
Add a driver entry to a list of drivers |
dbgDriverAddresses |
Return an array of driver addresses (EnumDeviceDrivers ( ) wrapper) |
dbgDriverlndex |
Create an indexed (and optionally sorted) driver list |
dbgDriverList |
Create a flat driver list |
dbgFileClose |
Close a disk file |
dbgFileLoad |
Load the contents of a disk file to a memory block |
dbgFileNew |
Create a new disk file |
dbgFileOpen |
Open an existing disk file |
dbgFileRoot |
Get the offset of the root token in a file path |
dbgFileSave |
Save a memory block to a disk file |
dbgFileUnload |
Free a memory block created by dbgFileLoad ( ) |
dbglndexCompare |
Compare two entrIEs referenced by an index (used by dbgindexsort ( ) ) |
dbglndexCreate |
Create a pointer index on an object list |
dbglndexCreateEx |
Create a sorted pointer index on an object list |
dbglndexDestroy |
Free the memory used by an index and its associated list |
dbglndexDestroyEx |
Free the memory used by a two-dimensional index and its associated lists |
dbglndexList |
Create a flat copy of a list from its index |
dbglndexListEx |
Create a flat copy of a two-dimensional list from its index |
dbglndexReverse |
Reverse the order of the list entries referenced by an index |
dbglndexSave |
Save the memory image of an indexed list to a disk file |
dbglndexSaveEx |
Save the memory image of a two-dimensional indexed list to a disk file |
dbglndexSort |
Sort the list entries referenced by an index by address, size, ID, or name |
dbgListCreate |
Create an empty list |
dbgListCreateEx |
Create an empty list with reserved space |
dbgListDestroy |
Free the memory used by a list |
dbgListFinish |
Terminate a sequentially built list and trim any unused memory |
dbgListlndex |
Create a pointer index on an object list |
dbgListLoad |
Create a list from a disk file image |
dbgListNext |
Update the list header after adding an entry |
dbgListResize |
Reserve memory for additional list entries |
dbgListSave |
Save the memory image of a list to a disk file |
dbgMemory |
Align Round up a byte count to the next 64-bit boundary |
dbgMemoryAlignEx |
Round up a string character count to the next 64-bit boundary |
dbgMemoryBase |
Query the internal base address of a heap memory block |
dbgMemoryBaseEx |
Query the internal base address of an individually tagged heap memory block |
dbgMemoryCreate |
Allocate a memory block from the heap |
dbgMemoryCreateEx |
Allocate an individually tagged memory block from the heap |
dbgMemoryDestroy |
Return a memory block to the heap |
dbgMemoryDestroyEx |
Return an individually tagged memory block to the heap |
dbgMemoryReset |
Reset the memory usage statistics |
dbgMemoryResize |
Change the allocated size of a heap memory block |
dbgMemoryResizeEx |
Change the allocated size of an individually tagged heap memory block |
dbgMemoryStatus |
Query the memory usage statistics |
dbgMemory |
Track Update the memory usage statistics |
dbgModulelndex |
Create an indexed (and optionally sorted) process module sub-list |
dbgModuleList |
Create a flat process module sub-list |
dbgPathDriver |
Build a default driver path specification |
dbgPathFile |
Get the offset of the file name token in a file path |
dbgPrivilegeDebug |
Request the debug privilege for the calling process |
dbgPrivilegeSet |
Request the specified privilege for the calling process |
dbgProcessAdd |
Add a process entry to a list of processes |
dbgProcessGuess |
Guess the default display name of an anonymous system process |
dbgProcessIds |
Return an array of process IDs (EnumProcesses ( ) wrapper) |
dbgProcessIndex |
Create an indexed (and optionally sorted) process list |
dbgProcessIndexEx |
Create a two-dimensional indexed (and optionally sorted) process/module list |
dbgProcessList |
Create a flat process list |
dbgProcessModules |
Return a list of process module handles (EnumProcessModules ( )wrapper) |
dbgSizeDivide |
Divide a byte count by a power of two, optionally rounding up or down |
dbgSizeKB |
Convert bytes to KB, optionally rounding up or down |
dbgSizeMB |
Convert bytes to MB, optionally rounding up or down |
dbgStringAnsi |
Convert a Unicode string to ANSI |
dbgStringDay |
Get the name of a day given a day-of-week number |
dbgStringMatch |
Apply a wildcard filter to a string |
dbgSymbolCallback |
Add a symbol entry to a list of symbols (called by SymEnumerateSymbols ( ) ) |
dbgSymbolIndex |
Create an indexed (and optionally sorted) symbol list |
dbgSymbolList |
Create a flat symbol list |
dbgSymbolLoad |
Load a module's symbol table |
dbgSymbolLookup |
Look up a symbol name and optional offset given a memory address |
dbgSymbolUnload |
Unload a module's symbol table |
标签: