我已经设置了 WinDbg 进行混合(用户模式到内核模式)调试。
在用户模式应用程序中,我使用某些参数调用
CreateFile()
。我想在用户模式进程上下文中的 CreateFile()
调用处中断,并从那里跟踪其执行情况。
我尝试使用
CreateFile
命令搜索 x
符号。问题是 x nt!*CreateFile*
找不到相应的符号。在它列出的一堆符号中,我能找到的最接近的是 nt!NtCreateFile
,它似乎有不同的签名,并且可能是一个内部 API。
为什么 WinDbg 中缺少
CreateFile()
符号?
您可以使用搜索词“MSDN
CreateFileA()
。该网站告诉您该函数是在 fileapi.h
中定义的。
查看内部
fileapi.h
(在本地计算机上找到它,例如使用Everything),您会发现这些行:
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
因此,
CreateFile()
只是 CreateFileA()
或 CreateFileW()
的别名,具体取决于您是针对 ASCII 还是 Unicode 进行编译。
您会发现许多像这样重定向的函数,并且具有
...A()
和 ...W()
命名约定。
在同一个网站上,有一个名为 Requirements 的部分,其中写着
Header fileapi.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll
因此可以设置断点
0:001> bp kernel32!CreateFileA
0:001> bp kernel32!CreateFileW
但是,如果您在所有模块中进行搜索,则您的
x
方法也有效,例如
0:001> x *!CreateFileA
00007ff8`23dc1320 KERNELBASE!CreateFileA (void)
00007ff8`25fa4e90 KERNEL32!CreateFileA (CreateFileA)
设置两个断点(A 和 W)后,您应该找到该函数:
0:001> g
Breakpoint 1 hit
KERNEL32!CreateFileW:
00007ff8`25fa4ea0 ff251af40500 jmp qword ptr [KERNEL32!_imp_CreateFileW (00007ff8`260042c0)] ds:00007ff8`260042c0={KERNELBASE!CreateFileW (00007ff8`23dc1410)}