Собственная разработка 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.

РЕДАКТИРОВАТЬ: Чтобы было ясно, упомянутая ошибка также возникает при запуске приложения, дважды щелкнув значок.

Эта загрузка происходит прежде, чем любой из моего кода, я не могу найти ничего ни в Интернете, ни в свойствах проекта в рассматриваемом файле. Итак, подведем итог: у меня есть следующие вопросы:

  1. Почему werkernel.sys вообще загружается для моего приложения?
  2. Почему он загружается из 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

Другие вопросы по тегам