2011-06-09 29 views
1

我想在驅動程序代碼(DDK)中使用「printf」,因此我已經包含了stdio.h。但編譯器說:stdio的printf和Windows驅動程序

error LNK2001: unresolved external symbol __imp__printf 

任何想法?我在某處看到這是不可能的 - 但那太可怕了 - 我無法相信它。爲什麼我不能在內核代碼中使用標準C例程?

  1. C函數像printf來自靜態cstd.lib或別的什麼AFAIK不是嗎?
  2. 爲什麼WDK會爲我提供stdio.h呢?
+6

你不在堪薩斯了,內核驅動程序沒有控制檯。你可以使用KdPrintf(),輸出到調試器。 – 2011-06-09 23:24:10

回答

5

Windows內核僅支持部分標準C運行時。特別是,不支持像文件流,控制檯I/O和網絡—這樣的高級功能—。相反,您需要使用本機內核API來實現類似的功能。

stdio.h包含在WDK中的原因是因爲C運行庫的某些部分是爲了您的方便而提供的。例如,您可以使用memcmp(儘管本機RtlCompareMemory是首選)。微軟還沒有選擇通過CRT頭來#ifdef出內核模式下不可用的零碎。一旦你開發了編寫內核驅動程序的一些經驗,你就會得到內核中可能的東西,以及可能無法工作的東西。

爲了解決您的高級問題:您可能正在尋找一些調試/日誌記錄機制。你真的有兩個選擇:

  1. DbgPrintEx是最容易使用。它基本上是printf的一個插件(儘管在運行> = DISPATCH_LEVEL時需要注意某些類型的字符串插入)。輸出到調試器,或者,如果您願意,可以到DbgView
  2. WPP是工業強度的選擇。最初的學習曲線非常陡峭(儘管WDK中有樣本)。但是,它非常靈活(例如,您可以創建自己的尖叫,如Print("My IP address is: %!IPV4!", ip);),並且速度非常快(Microsoft在大多數Windows組件的非調試版本中發佈了WPP跟蹤)。
+0

你應該總是使用'RtlCompareMemory'。實際上'#define'd是'memcmp',但不能保證永遠保持這種狀態。 – 2016-06-27 16:35:27