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





Вы можете искать функции 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)}
Почему один и тот же символ экспортируется дважды — как из Kernel32, так и из Kernelbase?
Kernel32 - это заглушка, которая перенаправляет на kernelbase, реализация которой смотрит на дизассемблирование kernel32 в ответе, который просто перескакивает
Происходит что-то странное. Когда я вчера запустил x *!CreateFileA, он вернул эти два символа. Когда я сегодня выполняю ту же команду, она ничего не возвращает. Если я снимаю x KERNEL32!*, там написано Couldn't resolve 'x kernel32'. Есть идеи?
@TracyMcDowell: Что говорит lm m kernel?
Из lm, насколько я вижу, kernel32/kernelbase не загружено. Я вижу там win32k/win32kfull/win32kbase/nt среди других. lm m kernel возвращает пустой список
kernel32 и kernelbase — это модули, которые загружаются еще до начальной точки останова, поэтому они должны быть там. Исключения редки, могу себе представить вирусы. См. попытку Павла Иосифовича удалить зависимость от ядра32. Не могли бы вы поделиться дампом?
Вирусы исключены. Это тестовая программа, которую я написал и сейчас отлаживаю. Клянусь x *!CreateFileA работал раньше, выпустил точно такой же результат, как у тебя. Я думаю, не «сломан» ли WinDbg каким-то образом. Кроме того, kernel32.dll указан в выводе dumpbin /imports.
Потому что нет такого символа. Существуют
CreateFileWиCreateFileA. И он экспортируется с помощью kernel32.dll и kernelbase.dll. Не автор: ntoskrnl