內核中c++編程_第1頁
已閱讀1頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、很少有專題講內核中的C編程,中文資料恐怕更是罕見。由于C的普及性、與C的親密關系,以及大部分情況下程序員都使用C編譯器編譯C程序的事實,當初學者聽說內核中“不容易”(筆者也聽說過“無法”二字)用C進行編程時,會大吃一驚。不管是說者無意,還是聽者有心,Windows內核的現(xiàn)狀,決定了C語言是內核編程的首選。其實內核驅動中也能使用C,也能使用類,但和用戶程序中的用法有一些區(qū)別,一些特殊的地方需要特別注意。從筆者的經驗來看,WDK給出的AVS

2、tream小端口驅動示例工程,就都是C代碼,這是由于AVStream的模塊性非常強,在實現(xiàn)較大功能模塊時,非得用類封裝,否則難以表述清楚。本章專門講述如何在內核中編寫C驅動程序。筆者先寫一個簡單的例子,顯示類的一些基本特性,并由此交代出幾項關鍵點;然后改造《WDFUSB設備驅動開發(fā)》一章中的WDFCY001驅動的例子,將它全部改造成一個驅動類,并最終實現(xiàn)C的最大優(yōu)點:多態(tài)。6.1.16.1.1一個簡單的例子一個簡單的例子首先我們嘗試把用

3、戶程序中最簡單的類拷貝到內核中,編譯鏈接,看看行不行。下面就是筆者定義的整數(shù)類,它封裝一個整數(shù),對象能夠被當成整數(shù)使用。1.classclsInt2.Public:3.clsInt()m_nValue=04.clsInt(intnValue)m_nValue=nValue5.voidprint()KdPrint((“m_nValue:%d”m_nValue))6.operatint()returnm_nValue7.8.private:

4、9.intm_nValue10.上例是一個非常簡單的類定義,我們將在DriverEntry函數(shù)中使用它,分別定義一個局部變量和動態(tài)創(chuàng)建一個對象。我們通過Debug信息來觀察對象行蹤,希望能夠得到正確的輸出。入口函數(shù)中的定義如下:1.extern“C“NTSTATUSDriverEntry(2.INPDRIVER_OBJECTDriverObject查看上面的代碼,會發(fā)現(xiàn)一個不同于以往的new操作符。這是怎么回事呢?我們這一節(jié)就講講它。在

5、用戶程序中,創(chuàng)建和釋放一個對象使用new方法,其底層乃是調用HeapAllocateHeapFree堆API從線程堆棧中申請空間。但問題是,內核CRT沒有提供new操作符,所以需要自己定義。自定義的new操作符,自然也是能夠從堆棧中分配內存的,內核中有RtlAllocateHeapRtlFreeHeap堆棧服務函數(shù)。但在內核中,我們一般使用內存池來獲取內存,實際上內存池和堆棧使用了同一套實現(xiàn)機制。使用ExAllocatePoolExFr

6、eePool函數(shù)對從內存池申請釋放內存,下面是一個例子。1.__fceinline2.void__cdecloperatnew(size_tsize3.POOL_TYPEpool_type4.ULONGpool_tag)5.6.ASSERT((pool_type(size)15.pool_tag)16.上面的函數(shù)定義有幾個細節(jié)的地方應當注意一下。首先注意new操作符重載,它的第一個參數(shù)一定是size_t,用來表示將分配緩沖區(qū)的長度;其次

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論