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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

3、戶程序中最簡(jiǎn)單的類拷貝到內(nèi)核中,編譯鏈接,看看行不行。下面就是筆者定義的整數(shù)類,它封裝一個(gè)整數(shù),對(duì)象能夠被當(dāng)成整數(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.上例是一個(gè)非常簡(jiǎn)單的類定義,我們將在DriverEntry函數(shù)中使用它,分別定義一個(gè)局部變量和動(dòng)態(tài)創(chuàng)建一個(gè)對(duì)象。我們通過(guò)Debug信息來(lái)觀察對(duì)象行蹤,希望能夠得到正確的輸出。入口函數(shù)中的定義如下:1.extern“C“NTSTATUSDriverEntry(2.INPDRIVER_OBJECTDriverObject查看上面的代碼,會(huì)發(fā)現(xiàn)一個(gè)不同于以往的new操作符。這是怎么回事呢?我們這一節(jié)就講講它。在

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論