我即將鑽入內核土地。我的問題涉及編程語言。我看過大多數教程都是用C編寫的。我目前使用C++和Assembly進行編程。我在C++之前也學過C,但我沒有太多用處。是否有可能使用簡單的C++在內核模式下編程而不使用任何高級構造?基本上我試圖避免兩種語言之間存在的細微差別(例如C中沒有bool
,沒有自動從main
返回0,實際上有細微差別)。我不會使用模板,類和類似的東西。那麼,在沒有任何主要煩惱的情況下,可以使用簡單的C++在內核模式下進行編程?使用簡單的C++進行內核模式編程?
回答
即使沒有官方支持,也可以使用C++作爲Windows內核開發的開發語言。 你應該知道下面的事情:
必須定義new和delete運算符來映射到ExAllocatePoolWithTag函數ExFreePool。
儘量避免虛擬功能。似乎無法控制對象的vtable的位置,如果它處於可分頁部分並且您的代碼是使用IRQL> = DISPATCH_LEVEL調用的,則可能會產生意想不到的結果。
如果在IRQL> = DISPATCH_LEVEL上使用它之前仍然需要使用虛擬方法表而不是鎖定.rdata段。
除了這些限制,您可以使用C++進行驅動程序開發。
爲vtable gotcha +1。我正要提到同樣的事情。 –
謝謝!所以我看到有一些併發症。你會主張使用C還是使用C++?我有點困惑於此。 – devjeetroy
使用C++作爲更好的C將會正常工作。編譯器生成代碼時會出現複雜情況 - 包括模板,vtable和默認構造函數以及標量刪除存根等。您無法控制C++編譯器決定將哪些部分放到您的可執行文件中,這意味着當需要它們的代碼不可以時,它們可以是可分頁的。這可能會導致一些嚴重的問題。如果你小心,你可以避免這一點。 – Stewart
如果你仔細編寫你的代碼,知道每個定義,運算符,調用等背後究竟是什麼,那麼在C++中編寫內核代碼應該沒有問題。上面評論中提到的Microsoft文檔是一個很好的解讀,因爲它描述了C++不像C那樣透明或者沒有提供類似重要保證的情況,並且你知道該怎麼避免。
Microsoft已編寫guide。基本上他們告訴我們除了使用C++放鬆的變量聲明規則之外,什麼都不要幹。別的,你自己。無論如何,它不可能是那麼糟糕,但這裏有一些你需要記住的例子:
- 在分頁池中分配的內存可以分頁。如果你在
IRQL
高於PASSIVE_LEVEL時試圖訪問它,那麼你就會被搞砸了(或者至少當你的客戶抱怨你的驅動程序阻止他們的系統時,你會每隔一段時間)!在負載下的低內存系統上測試您的驅動程序! - 非分頁池是有限的,你很可能無法從中分配所有的需求。
- 堆棧比用戶模式下小得多〜12-24K。你涉及內核浮點路徑
- 事情,都必須通過
KeSaveFloatingPointState
和KeRestoreFloatingPointState
- C++異常的保護:沒有
閱讀指南,瞭解更多。現在,如果您可以確保生成的代碼遵循規則,請繼續並使用C++。
本指南有些過時。最大NonPaged池是物理RAM的一半,那麼多少內存會將所有代碼標記爲不可分頁消耗?其他的觀點是正確的。 – Christopher
如果您想在WDK中執行C++,請添加兩個鏈接。這是一次設置努力。
The NT Insider:Guest Article: C++ in an NT Driver
The NT Insider:Global Relief Effort - C++ Runtime Support for the NT DDK
見過內核代碼使用大量的自鎖/智能指針;雖然他們使代碼簡潔,但我覺得它有一條初學者完全理解的學習曲線,如果濫用,大量構造/破壞代碼會減慢速度。
- 1. 問題編譯簡單的C程序對定製Linux內核
- 2. 使用Qemu進行內核模擬
- 3. 以編程方式對Word文檔進行簡單的編輯
- 4. 進行簡單[C#]
- 5. 創建簡單的內核模塊
- 6. MySQL進程在用戶模式還是內核模式下運行?
- 7. 使用EPROCESS結構在內核模式下枚舉進程ID
- 8. Linux內核模塊編程
- 9. Android內核模塊編程
- 10. 簡單內核編譯問題
- 11. 如何從Windows中的內核模式找到進程使用的內存
- 12. 簡單的內核多線程
- 13. 爲什麼進程最初以內核模式運行
- 14. 以編程方式取消gridview行編輯模式使用C#
- 15. 簡單的c編程gui
- 16. 使用簡單恢復模式進行完整備份嗎?
- 17. 使用jQuery在'select'中進行簡單模式搜索
- 18. 使用C#進行並行編程
- 19. 如何喚醒內核中的用戶模式睡眠進程?
- 20. 從內核模式調用dll C++ windows
- 21. 一個簡單的x86反彙編程序開源內核使用
- 22. 內核死亡運行使用Python的簡單平均操作
- 23. 使用Python進行簡單的遠程進程監控
- 24. 在編寫Linux內核模塊時獲取用戶進程pid
- 25. 進程ID在用戶模式和內核模式下是相同的
- 26. 使用Android內核爲Nexus 7編譯C++內核模塊時出錯
- 27. C編程簡單指針
- 28. 內核編程
- 29. 簡單的C/C++進程內緩存類似於memcached
- 30. 從內核模式執行用戶模式可執行文件
你的意思是Windows內核開發或其他操作系統開發? –
Windows內核開發,對不起 – devjeetroy
如果您同意C是簡單化的C++ ... – sehe