青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

10分鐘完成一個USB驅(qū)動程序

10分鐘完成一個USB驅(qū)動程序
責任編輯:admin   更新日期:2005-8-6
??很多寫Windows Device Driver的開發(fā)人員基本上都是使用Windows DDK進行開發(fā)的。但是,現(xiàn)在也有不少人都開始借助一些輔助工具。筆者去年開始接觸到riverStudio,發(fā)現(xiàn)它真的是一個不錯的開發(fā)工具,不僅寫代碼的時候思路清晰,而且和DDK的結(jié)合很好。

????當然,也有很多人覺得用DriverStudio不夠正宗,或者說不能很好的理解Windows Device Driver的架構(gòu)。我感覺這就有點像MFC和SDK的關(guān)系,關(guān)于這個問題在很多地方都有爭論,比如在萬千新聞組上,就討論了將近2個月。每個人都有自己的最愛,都有自己的習慣,只要你能把事情做好,我想用什么方法應(yīng)該都是一樣的。如果你已經(jīng)習慣了用DDK開發(fā),那完全還可以繼續(xù)用下去;如果你覺得DriverStudio不錯,那嘗試用一個可以給你按照OOP概念來編程的工具有什么不好呢?



在驅(qū)動開發(fā)網(wǎng)上,經(jīng)??吹接腥嗽儐栆恍╆P(guān)于DriverStudio的使用的問題。我正好很有幸用它作了幾個驅(qū)動程序,包括VXD, KMD和WDM,稍微有點心得,因此想寫下來給大家作一個小小的參考。如果其中有錯誤,歡迎大家給我指出,謝謝。



下面我就介紹一下用DriverStudio開發(fā)一個USB驅(qū)動程序的過程。這個USB設(shè)備有3個雙向端點,每個端點的配置如下:

EP 類型 地址 buffer(Bytes)

0 IN/OUT Control 0x80/0x00 16/16

1 IN/OUT Bulk 0x81/0x01 16/16

2 IN/OUT Bulk 0x82/0x02 64/64

我們的驅(qū)動程序需要實現(xiàn)的功能就是控制設(shè)備上的LED燈的亮和滅,以及通過Endpoint 2對設(shè)備進行讀寫。



由于DriveStudio由幾個部分組成,我們寫這個驅(qū)動程序只要用到DriverWorks,因此下面我們就簡稱它為DW。在這里,我們假定讀者已經(jīng)正確的安裝了DW,并且已經(jīng)編譯好了各個庫文件。



1. 首先,我們通過快捷方式“Setup DDK and Start MSVC“來啟動VC IDE。這個快捷方式所指向的程序,會進行一些必要的設(shè)置,然后再啟動VC IDE,這樣我們的程序就可以使用DDK和DW的頭文件和庫了。

2. 從VC IDE的菜單"DriverStudio"中選擇"DriverWizard", 在如圖1所示的對話框中, 寫上項目名稱. 在這里, 我們將這個項目稱為: TEST, 所在的目錄為D:\TEST. 然后點按鈕"Next >".


圖1

3. 在接下來的這個對話框中(如圖2), 我們需要選擇驅(qū)動程序的類型. 由于USB設(shè)備驅(qū)動程序是WDM類型的, 所以我們選擇第二項并且點按鈕"Next >".


圖2

4. 在第3個對話框中(如圖3), 選擇我們的驅(qū)動程序所操作的總線類型. 這里, 我們選擇USB. 在USB Vendor ID和USB Product ID中填入USB設(shè)備的VID和PID. 假定我們的USB設(shè)備的VID和PID分別是16進制的0471和1801. 然后點按鈕"Next >". 關(guān)于VID和PID的規(guī)定請參考USB-IF的規(guī)范.


圖3

5. 在接下來的對話框中(如圖4), 我們需要加入Endpoint 1和Endpoint 2的定義. 由于在USB中規(guī)定Endpoint 0是必須存在的, 所以我們不需要對Endpoint 0進行定義. 點"Add..."按鈕, 彈出一個如圖5所示的對話框. 我們將它修改成如圖6所示. 其中, 按照USB的規(guī)定, 對于端點, 它的地址是1; 按照前面說明的設(shè)備的特點, Endpoint 1的最大的包大小為16字節(jié), 因此在"Max Transer Size"中填入16; Endpoint Name可以通過"Suggest Name"得到. 按照這些原則, 繼續(xù)設(shè)置其他的配置, 以使對話框4變成如圖7所示. 接下來, 繼續(xù)按"Next >"按鈕.


圖4


圖5




圖6


圖7

6. 在如圖8所示的對話框中, 可以填入我們需要的Driver Class的名字和文件名. 一般我們不需要更改. 繼續(xù)按"Next >"按鈕.


圖8

7. 在如圖9所示的對話框中, 因為不需要給其他的驅(qū)動程序提供接口, 也不需要提供Flush功能, 所以不需要任何修改, 直接按"Next >"按鈕.


圖9

8. 在如圖10所示的對話框中, 我們選擇給端點2產(chǎn)生BULK Read的代碼, 并且按"Next >"按鈕. DW會給我們產(chǎn)生一套對端點2進行讀的代碼, 不用修改, 就可以直接使用.


圖10

9. 在如圖11所示的對話框中, 我們選擇給端點2產(chǎn)生BULK Write的代碼, 并且按"Next "按鈕. 這樣, DW也會給我們產(chǎn)生一套對端點2進行寫的代碼, 不用修改, 就可以直接使用.


圖11

10. 對于如圖12的對話框, 我們直接按"Next >"按鈕. 這里是設(shè)置是否要將I/O請求排隊, 在這里, 我們不需要排隊.


圖12

11. 在如圖13所示的對話框中, 我們不需要創(chuàng)建任何注冊表項, 所以直接按"Next >"按鈕.


圖13

12. 如圖14所示的對話框, 是讓我們設(shè)置一些驅(qū)動程序的屬性, 比如接口, 緩沖區(qū)之類的. 一般的都可以使用缺省設(shè)置. 繼續(xù)按"Next >"按鈕.


圖14

13. 在如圖15所示的對話框中, 是讓我們給驅(qū)動程序增加一些IOCTL接口. 我們只增加一個如圖16所示的IOCTL來控制USB設(shè)備的LED燈. 然后按"Next >"按鈕.


圖15


圖16

14. 在最后一個如圖17所示的對話框中, 可以設(shè)置一些驅(qū)動程序的屬性, 產(chǎn)生一個console測試程序. 按下"Finish"按鈕, 就結(jié)束了Wizard.


圖17

這樣, 我們就創(chuàng)建好了一個基本的驅(qū)動程序, 下面來看看還要做哪些工作才可以和我們的設(shè)備以及上層的應(yīng)用程序通訊.



把函數(shù)NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)改成如下面的樣子:

NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)

{

NTSTATUS status = STATUS_INVALID_PARAMETER;



t << "Entering TESTDevice::TEST_IOCTL_LED_Handler, " << I << EOL;



__try

{

// TODO: Verify that the input parameters are correct

// If not, return STATUS_INVALID_PARAMETER

if(I.IoctlOutputBufferSize() || !I.IoctlBuffer() ||

(I.IoctlInputBufferSize() != sizeof(UCHAR)))

__leave;

// TODO: Handle the the ZBUARD_IOCTL_LED_ON request, or

// defer the processing of the IRP (i.e. by queuing) and set

// status to STATUS_PENDING.

PURB pUrb = m_Lower.BuildVendorRequest(

NULL, // transfer buffer

0, // transfer buffer size

0, // request reserved bits

(UCHAR)(*(PUCHAR)I.IoctlBuffer()), // request. 1 = LED_ON, 0 = LED_OFF

0 // Value

);



// transmit

status = m_Lower.SubmitUrb(pUrb, NULL, NULL, 5000L);

}

__finally

{

// TODO: Assuming that the request was handled here. Set I.Information

// to indicate how much data to copy back to the user.

I.Information() = 0;

I.Status() = status;

}



return status;

}

這個函數(shù)是控制LED燈的,它是通過USB Vendor Request來向設(shè)備傳送的。其中,request=1的時候表示讓LED亮,request=0的時候讓LED滅。它是通過DeviceIoControl由上層應(yīng)用程序傳下來。



再看看讀寫部分,經(jīng)過檢查NTSTATUS TESTDevice::Read(KIrp I)和NTSTATUS TESTDevice::Write(KIrp I)可以發(fā)現(xiàn),DW已經(jīng)給我們寫好了讀寫的代碼,我們可以直接使用了。這些代碼就是在上面的第8和第9步中產(chǎn)生的代碼。



最后,修改編譯一下DriverStudio產(chǎn)生的測試程序Test_TEST程序,我們就可以通過命令行來測試我們的驅(qū)動程序了。對于LED的控制,我們可以直觀的在設(shè)備上看到,但對于讀寫的操作就需要和firmware程序配合,這已經(jīng)超出了本文的范圍,不在這里討論了。



通過上面的講解,我們可以看到有了DriverStudio,就可以快速的產(chǎn)生一個驅(qū)動程序,然后在里面作一些小的改動就可以使用了。即使是寫一個比較復(fù)雜的USB驅(qū)動程序,我們也可以不用管一些系統(tǒng)的IRP處理,只要專注于我們自己的特定應(yīng)用就可以了。而且它把一個驅(qū)動程序概括成幾個類的概念,并且DW還附帶有一些很有用的STL類,在VC IDE里面有了一個很清晰直觀的表示。這樣,對一些從上層應(yīng)用轉(zhuǎn)向驅(qū)動程序的開發(fā)人員,或者一些對C++/OOP很熟悉但不太了解系統(tǒng)內(nèi)核的開發(fā)人員,都比較容易上手。即使對于推崇直接用DDK編程的人來說,通過閱讀DriverStudio附帶的源代碼,也可以對驅(qū)動程序的開發(fā)有一個更加深入的了解。
 

posted on 2007-10-26 00:55 旅途 閱讀(1240) 評論(1)  編輯 收藏 引用 所屬分類: 驅(qū)動開發(fā)

Feedback

# re: 10分鐘完成一個USB驅(qū)動程序 2008-07-20 03:27 faning

大哥你太強大了。我都感覺是在做夢。編寫操作系統(tǒng)。啊啊啊。我最近才領(lǐng)悟編程。也從匯編看看了。你博客我收藏了、。  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美大片免费观看| ●精品国产综合乱码久久久久| 亚洲一区精品电影| 一区二区av在线| 亚洲无人区一区| 先锋影音久久久| 久久手机免费观看| 欧美激情亚洲| 国产精品狼人久久影院观看方式| 国产精品美女www爽爽爽| 国产午夜亚洲精品不卡| 亚洲国产老妈| 亚洲欧美日本视频在线观看| 欧美在线视频一区二区| 欧美成人免费视频| 在线中文字幕日韩| 久久午夜精品一区二区| 欧美日韩福利在线观看| 国产日韩欧美麻豆| 亚洲毛片在线免费观看| 午夜宅男欧美| 欧美大胆人体视频| 亚洲夜晚福利在线观看| 卡通动漫国产精品| 国产精品久久久久久五月尺| 亚洲电影免费观看高清| 翔田千里一区二区| 亚洲级视频在线观看免费1级| 亚洲一区二区不卡免费| 欧美国产精品日韩| 国产一区二区在线免费观看| 在线亚洲伦理| 亚洲高清中文字幕| 久久九九精品99国产精品| 国产精品高潮呻吟视频| 亚洲区免费影片| 卡通动漫国产精品| 欧美亚洲三区| 国产精品制服诱惑| 亚洲一区自拍| 日韩一级片网址| 欧美精品手机在线| 亚洲人成网站999久久久综合| 久久精品亚洲热| 中国亚洲黄色| 国产精品xvideos88| 一区二区激情视频| 亚洲人成在线观看网站高清| 免费视频最近日韩| 亚洲国产成人久久综合| 久久精品中文| 亚洲精品小视频在线观看| 久久女同互慰一区二区三区| 欧美日韩大片一区二区三区| 欧美国产免费| 久久免费视频这里只有精品| 国产亚洲午夜高清国产拍精品| 欧美激情视频网站| 国产欧美日韩综合一区在线观看| 欧美国产在线观看| 国产日韩欧美在线| 亚洲免费观看视频| 亚洲国内自拍| 欧美在线一区二区| 午夜宅男久久久| 欧美日韩成人综合| 久久久久久97三级| 国产精品久久久久久av下载红粉| 欧美激情精品久久久久久久变态| 国产欧美精品日韩精品| 日韩西西人体444www| 亚洲国产精品毛片| 久久精品动漫| 久久国产精品一区二区三区四区| 欧美精品一区二区视频 | 久久久91精品国产一区二区精品| 欧美精品久久99久久在免费线| 久久久久综合| 国产精自产拍久久久久久| 一本久久a久久免费精品不卡| 91久久精品一区二区别| 久久久中精品2020中文| 久久久噜噜噜久噜久久 | 亚洲乱码国产乱码精品精98午夜| 久久精品一本| 另类酷文…触手系列精品集v1小说| 国产精品成人av性教育| 日韩午夜免费| 在线综合欧美| 欧美午夜性色大片在线观看| 日韩午夜av在线| 亚洲一区图片| 国产精品美女久久| 亚洲一区二区三区色| 亚洲一区在线播放| 国产精品一区二区三区久久| 亚洲欧美精品一区| 久久精品主播| 尤物精品在线| 免费不卡在线观看| 91久久午夜| 中文精品一区二区三区| 欧美日韩亚洲一区二区三区在线| 99综合电影在线视频| 亚洲中字在线| 国产欧美一区二区精品忘忧草| 欧美一区二区高清在线观看| 久久资源av| 亚洲九九九在线观看| 欧美日韩情趣电影| 亚洲午夜未删减在线观看| 亚洲精品久久嫩草网站秘色| 欧美日韩综合在线| 亚洲久久在线| 亚洲欧美日韩精品| 国产欧美在线| 免费精品视频| 一本高清dvd不卡在线观看| 亚洲欧美国产另类| 极品尤物av久久免费看| 欧美激情亚洲| 羞羞漫画18久久大片| 免费试看一区| 亚洲在线不卡| 伊人成人开心激情综合网| 欧美电影在线免费观看网站| 9人人澡人人爽人人精品| 久久国产精品亚洲77777| 亚洲精品一区二区在线观看| 国产精品亚洲激情| 欧美成人tv| 亚洲欧美日韩精品久久亚洲区| 麻豆精品网站| 亚洲欧美日韩综合| 亚洲国产精品黑人久久久| 国产精品theporn88| 久久久久国产一区二区三区| 99国产精品久久久久久久| 久久亚洲综合| 亚洲欧美综合| 99热这里只有成人精品国产| 国产欧美日韩视频一区二区三区 | 在线看欧美视频| 欧美日韩在线一二三| 久久久久国产精品午夜一区| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲午夜精品久久久久久app| 一区免费视频| 国产精品一区二区黑丝| 欧美激情小视频| 久久婷婷国产麻豆91天堂| 亚洲欧美日韩另类精品一区二区三区| 亚洲国产精品va在线观看黑人| 久久精品日产第一区二区三区| 亚洲午夜性刺激影院| 亚洲精品美女久久7777777| 激情av一区二区| 国产欧美韩国高清| 欧美午夜精品电影| 欧美精品一区三区| 欧美成人中文字幕| 乱码第一页成人| 久久久久国产一区二区三区| 欧美一区成人| 欧美亚洲免费在线| 亚洲欧美在线免费观看| 亚洲视频在线一区| 一区二区三区四区蜜桃| 日韩午夜免费| 日韩一级欧洲| 一区二区三区产品免费精品久久75| 91久久精品视频| 亚洲精品黄色| 一二三区精品| 一区二区免费看| 99亚洲精品| 一区二区三区四区国产| 一区二区三区精密机械公司| 亚洲高清视频一区二区| 夜色激情一区二区| 久久精品91| 久久精品1区| 久久久噜噜噜| 蜜臀91精品一区二区三区| 免费精品视频| 亚洲国产高清aⅴ视频| 亚洲国产天堂久久综合| 91久久香蕉国产日韩欧美9色| 亚洲国产精品久久久久久女王| 亚洲国产精品成人综合| 亚洲人久久久| 在线综合亚洲欧美在线视频| 亚洲一区二区三区精品在线 | 国产日韩在线一区| 黑丝一区二区| 亚洲人成毛片在线播放| 国产精品99久久久久久久久久久久| 亚洲欧美日韩国产一区二区| 香蕉久久夜色精品国产| 久久婷婷国产麻豆91天堂|