在WinDbg中的CreateFile() API上设置断点

问题描述 投票:0回答:1

我已经设置了 WinDbg 进行混合(用户模式到内核模式)调试。

在用户模式应用程序中,我使用某些参数调用

CreateFile()
。我想在用户模式进程上下文中的
CreateFile()
调用处中断,并从那里跟踪其执行情况。

我尝试使用

CreateFile
命令搜索
x
符号。问题是
x nt!*CreateFile*
找不到相应的符号。在它列出的一堆符号中,我能找到的最接近的是
nt!NtCreateFile
,它似乎有不同的签名,并且可能是一个内部 API。

为什么 WinDbg 中缺少

CreateFile()
符号?

windows winapi windbg debug-symbols
1个回答
0
投票

Windows 中的函数名称

您可以使用搜索词“MSDN ”来搜索 Microsoft Windows API 函数。如果您这样做,您将看到

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)}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.