Я настроил WinDbg для гибридной отладки (от пользовательского режима к режиму ядра).
В приложении пользовательского режима я вызываю CreateFile()
с определёнными параметрами. Я хочу прервать вызов CreateFile()
в контексте процесса пользовательского режима и оттуда проследить его выполнение.
Я попробовал найти символ CreateFile
с помощью команды x
. Проблема в том, что x nt!*CreateFile*
не может найти соответствующий символ. Из множества символов, перечисленных в нем, ближайшим, что я смог найти, был nt!NtCreateFile
, который, похоже, имеет другую подпись и, предположительно, внутренний API.
Почему в WinDbg отсутствует символ CreateFile()
?
Вы можете искать функции Microsoft Windows API, используя условия поиска «MSDN <функция>». Если вы это сделаете, это приведет вас к CreateFileA(). На этом веб-сайте сообщается, что функция определена в fileapi.h
.
Загляните внутрь fileapi.h
(найдите его на своем локальном компьютере, например, используя Все), вы найдете эти строки:
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
Итак, CreateFile()
— это просто псевдоним для CreateFileA()
или CreateFileW()
, в зависимости от того, компилируете ли вы для ANSI или Unicode.
Вы найдете множество функций, которые перенаправляются таким образом и имеют соглашения об именах ...A()
и ...W()
. Это описано MS в Unicode в Windows API , и они объясняют соглашения на другом примере.
На том же сайте есть раздел Требования, в котором написано
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)}