懶人日記4 驅動程式開發 編譯前傳

2021-04-20 12:29:11 字數 2139 閱讀 5900

好啦,辛辛苦苦終於寫完了程式,讓我們編譯執行吧!按下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架構,實現了驅動和裝置分離,減少了程式的耦合性,同時提...