好啦,辛辛苦苦終於寫完了程式,讓我們編譯執行吧!按下ctrl+f5(嘿嘿,讓我們先假設你習慣用vc來寫程式),我等啊等……疑?怎麼毫無動靜的?再看看output視窗,哇!有幾百個錯誤啊!!不禁頭大——這是怎麼回事呢?
原來,wdm程式編譯出來的並不是我們常見的.exe,而是.sys檔案,在未經設定編譯環境之前,是不能直接用vc來編譯的(這就是為什麼會有幾百個錯誤了)。這種型別的檔案你可以在winnt/system32/drivers裡面找到很多。其實驅動程式也是一種pe檔案,它同樣由dos mz header開頭,也有完整的dos stub和pe header,同樣擁有import table和export table——……那跟普通的pe檔案有什麼不一樣呢?那麼就讓我們先來做個小剖析,加深對.sys檔案的認識吧
首先祭出delphi裡附帶的tdump.exe程式。讓我們鍵入:
c:/winnt/system32/drivers>tdump ccport.sys -em -ee
引數-em是列出import table,-ee是列出export table。回車之後,螢幕列出一大堆東西:
看到了嗎?它主要呼叫了ntoskrnl.exe和hal.dll檔案(實際上你會發現,幾乎所有的wdm驅動程式都會呼叫ntoskrnl.exe檔案,從它的名字你可以看出為什麼了吧?),並且輸出了乙個函式「vcomm_drivercontrol」。這表明,其實.sys跟.exe檔案一樣,都是一種pe檔案來的。不同的是,.sys檔案import的通常是ntoskrnl.exe,而.exe檔案import的通常是kernel32.dll和user32.dll。
知道了這些有什麼用呢?實際上,由於.sys通常不呼叫kernel32.dll和user32.dll,所以你是不能在裝置驅動程式裡面呼叫任何c、c++和win32函式的,而且也不能用c++關鍵字new和delete等(可以用malloc和free來代替),而必須使用大量的核心函式。另外,你應該也能看到她呼叫了像iodeletedevice、ioattachdevicetodevicestack等等函式,這些你以前可能沒有見過的函式都是些核心函式。為了讀者的方便,下面我列出一些常見的驅動程式可用的核心函式:
ex… 執行支援
hal… 硬體抽象層(僅nt/windows 2000)
io… i/o管理器(包括即插即用函式)
ke… 核心
ks… 核心流irp管理函式
mm… 記憶體管理器
ob… 物件管理器
po… 電源管理
ps… 程序結構
rtl… 執行時庫
se… 安全引用監視
zw… 其他函式
最後讓我們再來看看,寫裝置驅動程式時必須注意的一些問題:
1、核心巨集
如果檢視ddk標頭檔案,會發現有幾個核心函式是以巨集的方式實現的。這種巨集中有幾個巨集的定義是相當糟糕的。例如,我們看到removeheadlist的定義如下:
#define removeheadlist(listhead)
(listhead)->flink;
如果以以下方式呼叫removeheadlist,則將編譯錯誤的**:
if(somethinginlist)
entry = removeheadlist(list);
使這個呼叫安全的唯一方法是使用花括號:
if(somethinginlist)
所以我們切勿為了貪圖一時的方便,而使用不太規範的寫法,最好是在所有的if、for和while等語句中使用花括號。
2、驅動程式函式名稱
跟c/c++的main()函式一樣,裝置驅動程式也有乙個必須存在,而且只能以driverentry()為名稱的入口函式。然而,除此之外,我們可以使用任何名字來給其他函式命名——只要你自己記得就行了,當然,最好符合某些特定的規範啦,例如匈牙利命名法……
3、安裝時的問題
·在windows98中驅動程式可執行檔案必須是8.3檔名。(別問我為什麼,我也不知道,我只能建議你去問比爾該死)
·如果inf檔案中含有非法節的詳細資料,windows將不使用這個inf檔案。
本節羅羅嗦嗦講了一大堆,跟實際的程式設計卻並沒有太大的關係,前傳嘛!就是這樣的啦!
介面驅動程式開發
介面驅動程式開發 介紹了在android開發環境下,採用 j a 編寫介面驅動程式。包括 led介面及驅動程式 背光調節控制程式 鍵盤介面及驅動程式 uart 序列口及通訊程式 wi fi 介面及通訊程式 3g介面及驅動程式 mediaplayer led燈由 gpio 介面的gpj3 0 和gpj...
windows驅動程式開發初探
最近,由於需求推動,自己得開始學一下在windows下如何開發驅動程式。雖然,後來由於其他的原因使得學習沒繼續下去,但是我還是把一些粗略的學習經歷與體會寫在這裡,方便自己日後捲土重來,也方便其他的對windows開發一竅不通的有志之士參考一下。一 開發的目的 二 開發的歷程 1 學習的歷程 要開發出...
Linux input子系統二 驅動程式的編寫
本文主要以分析通用gpio按鍵驅動 gpio keys.c檔案為主,將其中牽涉到linux驅動架構流程,以及架構設計思想進行分析。概述 gpio keys是基於input架構實現的乙個通用gpio按鍵驅動。該驅動基於pladform driver架構,實現了驅動和裝置分離,減少了程式的耦合性,同時提...