第乙個驅動程式

2021-04-30 16:37:24 字數 2154 閱讀 9518

原始出處:

驅動程式的開發,向來是令人感到有所畏懼的,可能很多人像我一樣,看了很久卻還是一頭霧水,不得其門而入。我們今天就通過乙個簡單的程式來使讀者學會初步的驅動程式開發。

在開發windows驅動程式之前,我們需要首先安裝ddk,win98及其以前的vxd我們就不要再考慮了;windows 2000 ddk也比較老了點,很少有人使用了,微軟最新的wdk貌似都不支援2000了;在本文中假設我們已經安裝了win xp ddk或2003 ddk(2003會包括xp)。

驅動開發通常有兩種環境,一種是使用任意文字編輯器來編寫**,然後通過編寫makefile和sources檔案在winddk的命令列環境下使用build命令編譯;另一種方法是使用各種各樣的方法以圖可以利用ide的環境來搭建驅動框架,比如使用驅動嚮導檔案或一些小工具,我經常使用的是easysys這個小工具。

廢話不多說了,假設我們已經通過easysys生成了乙個驅動框架,現在我們就向裡面新增**。下面我們編寫了乙個函式,它的作用是根據形參來建立乙個檔案,形參中給出了將要被建立的檔案完整路徑。(注意,以下程式有許多錯誤,具體請看後面的講解)

bool createfiletest( in punicode_string filename)

else

if (hfile)

return bret;

}當我們激動地編譯上述程式時,卻很鬱悶地發現編譯器報出了十幾個錯誤,不要急,這是大多數新手都必須要跨過的乙個坎兒。很多時候你能看懂別人的程式並不等於你就能自己寫程式,很有可能你看懂了別人的程式,但自己寫的過程中卻出現了很多錯誤,因為這中間有很多細節性的東西。下面我們來分析上述**中存在的錯誤:

1. 函式返回型別有誤,因為ddk中並沒有直接定義bool型別,雖然我們在ring3經常使用。這裡我們要麼使用define或typedef定義bool型別;要麼直接使用ddk中定義有的boolean型別。

2. 驅動程式多是使用c語言編寫的(也可以使用c++),因此我們的變數必須函式開頭進行定義。或許使用vc程式設計的人早就習慣了「使用前再定義」的做法,那就改改習慣嘛,要麼就使用c++來編寫(需要自己動手修改點東西)。

3. 第三個錯誤比較隱蔽,我們注意看,形參的型別是punicode_string,但我卻是這樣使用的:&filename,很慚愧啊,俺去面壁10分鐘~~

4. 呼叫zwcreatefile函式的**裡面有兩個明顯的錯誤(你找到了嗎?)。第乙個是io_status_block的用法有誤,實際應該這樣呼叫:&io_status_block,因為它該函式要求乙個指標引數,這就需要我們在呼叫一些陌生函式前,認真地檢視幫助檔案的說明,千萬不能靠自己的直覺行事;第二個問題非常隱蔽,注意在前面定義了乙個obj_attrib變數,但卻沒有用到,它的作用是將檔案路徑傳遞給zwcreatefile,而我卻隨手把zwcreatefile的第三個引數設為null,函式呼叫肯定會失敗,唉,又沒臉見人了。

5. 其實,在呼叫zwcreatefile的**裡面還有乙個非常隱蔽的錯誤。我們認真看下ddk的幫助文件,會發現函式zwcreatefile的第乙個引數(返回控制代碼)是phandle型別的,因此在呼叫的時候應該寫&hfile;在ring3我們很少會遇到返回控制代碼指標的情況,因此這個問題不認真查詢的話將很難發現。

除此之外,上述**還寫的不夠規範,比如判斷函式呼叫是否成功的**就有問題,下面是我們修改後的正確**(請注意它與原**的不同之處):

ntstatus  createfiletest( in punicode_string filename )

else

kdprint(("hfile = %08x", hfile));

// 關閉控制代碼

if (hfile)

return status;

}下面我們在driverentry中編寫**測試上述函式,如下所示:

// 測試函式

rtlinitunicodestring( &ustrfilename, l"

//??//c://nokyo.dat

");status = createfiletest(&ustrfilename);

if (nt_success(status))

else

注意ustrfilename變數必須在函式開頭進行定義,上述**的執行效果如下圖所示。

第乙個驅動程式

從今天開始就要進入核心驅動程式部分了,在這一節裡就通過第乙個驅動程式來介紹一下核心驅動模組的編寫框架。static intfirst drv open struct inode inode,struct file file static ssize t first drv write struct ...

我的第乙個驅動程式

arm編譯器版本 3.32 核心版本 2.6.28.7 arm號 s3c2440 驅動原始碼 include include include include include include include include define device name leds define led majo...

第乙個驅動程式點亮led

include include include include include include include include include include static struct class firstdrv class static struct class device firstdrv...