Собственная разработка Windows: debuggee пытается загрузить werkernel.sys из system32
Я сейчас изучаю Windows Native API, Nt*/Zw*
методы. Я скачал WDK, установил его и успешно скомпилировал приложение (x64, под Win 8.1 x64, VS2013). Единственное, что он делает, это вызов NtOpenFile()
,
Чтобы успешно скомпилировать / связать его, мне пришлось внести следующие изменения в свойства проекта (шаблон приложения для драйверов):
- Добавить включает папку из WDK
- Добавить папку Lib из WDK
- Скажите компоновщику использовать ntoskrnl.lib
Неожиданно, после запуска отладчика, мне выдается сообщение об ошибке "Программа не может запуститься, потому что C:\Windows\SYSTEM32\werkernel.sys отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы решить эту проблему". Очевидно, что файл werkernel.sys существует в system32\drivers.
РЕДАКТИРОВАТЬ: Чтобы было ясно, упомянутая ошибка также возникает при запуске приложения, дважды щелкнув значок.
Эта загрузка происходит прежде, чем любой из моего кода, я не могу найти ничего ни в Интернете, ни в свойствах проекта в рассматриваемом файле. Итак, подведем итог: у меня есть следующие вопросы:
- Почему werkernel.sys вообще загружается для моего приложения?
- Почему он загружается из System32?
Я понимаю, что это возможно mklink werkernel.sys drivers\werkernel.sys
, но такое чувство, что я делаю что-то ужасно неправильно.
2 ответа
Соединение ntdll.lib
скорее, чем ntoskrnl.lib
работал для меня, когда у меня была похожая проблема.
NtOpenFile
это то, что Microsoft называет "внутренним API", его нельзя использовать для производственного программного обеспечения, не следует использовать его для экспериментов или вообще использовать; эти функции могут изменяться между каждым выпуском SP или основной версией Windows.
Если вы хотите открывать файлы в пользовательском режиме (WDK и usermode? Не вычисляет... если вы на самом деле не пишете для UMDF), вам рекомендуется использовать OpenFile
:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365430(v=vs.85).aspx
или в вашем драйвере:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff567011(v=vs.85).aspx.
tl; dr: не используйте эти старые функции, они не предназначены для использования.
Заявление Microsoft о "внутреннем" API: https://msdn.microsoft.com/en-us/library/bb432200(v=vs.85).aspx