Принтер stdio и драйвер Windows - PullRequest
1 голос
/ 10 июня 2011

Я хочу использовать «printf» в коде драйвера (DDK), поэтому я включил stdio.h.Но компилятор говорит:

error LNK2001: unresolved external symbol __imp__printf

Есть идеи?Я где-то видел, что это невозможно - но это ужасно - я не могу в это поверить.Почему я не могу использовать стандартные подпрограммы C в коде ядра?

  1. Функции C, такие как printf, происходят из статического cstd.lib или чего-то AFAIK, не так ли?
  2. Почему WDKтогда предоставь мне stdio.h?

1 Ответ

5 голосов
/ 11 июня 2011

Ядро Windows поддерживает только часть стандартной среды выполнения C.В частности, высокоуровневая функциональность, такая как файловые потоки, консольный ввод-вывод и работа в сети, не поддерживается.Вместо этого вам нужно использовать собственные API ядра для аналогичной функциональности.

Причина, по которой stdio.h включен в WDK, заключается в том, что некоторые части среды выполнения C предоставлены для вашего удобства.Например, вы можете использовать memcmp (хотя нативный RtlCompareMemory предпочтительнее).Microsoft не выбрала заголовки CRT, чтобы #ifdef вывести кусочки, которые недоступны в режиме ядра.Как только вы приобретете некоторый опыт написания драйверов для ядра, вы поймете, что в ядре возможно, а что, вероятно, не будет работать.некоторый механизм отладки / регистрации.У вас действительно есть два варианта:

  1. DbgPrintEx - самый простой в использовании.Это в основном вставка для printf (хотя вам нужно быть осторожным с некоторыми типами вставок строк при запуске> = DISPATCH_LEVEL).Выходные данные отправляются в отладчик или, если хотите, DbgView .
  2. WPP - это опция промышленного уровня.Начальная кривая обучения довольно крутая (хотя в WDK есть примеры).Однако он очень гибкий (например, вы можете создавать свои собственные крики, например Print("My IP address is: %!IPV4!", ip);), и он очень быстрый (Microsoft поставляет трассировку WPP в неотлаженных сборках большинства компонентов Windows).
...