Установка точки останова в API CreateFile() в WinDbg

Я настроил WinDbg для гибридной отладки (от пользовательского режима к режиму ядра).

В приложении пользовательского режима я вызываю CreateFile() с определёнными параметрами. Я хочу прервать вызов CreateFile() в контексте процесса пользовательского режима и оттуда проследить его выполнение.

Я попробовал найти символ CreateFile с помощью команды x. Проблема в том, что x nt!*CreateFile* не может найти соответствующий символ. Из множества символов, перечисленных в нем, ближайшим, что я смог найти, был nt!NtCreateFile, который, похоже, имеет другую подпись и, предположительно, внутренний API.

Почему в WinDbg отсутствует символ CreateFile()?


1
51
1

Ответ:

Решено

Имена функций в Windows

Вы можете искать функции 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)}