国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

基于Windows2000的過濾器驅(qū)動程序設(shè)計

發(fā)布時間:2010-6-30 17:56    發(fā)布者:我芯依舊
關(guān)鍵詞: 2000 , Windows , 過濾器 , 驅(qū)動程序
WDM(Windows Driver Mode)是微軟公司為Windows的驅(qū)動程序設(shè)計的一種通用的驅(qū)動程序模型。相比以前的KDM和VXD來說,他的性能更高、系統(tǒng)之間移植更加方便。所以,隨著系統(tǒng)的升級,WDM已經(jīng)成為Windows 2000系統(tǒng)下驅(qū)動程序開發(fā)的主流。作為WDM模型之中一類特殊的驅(qū)動程序,過濾器驅(qū)動程序(Filter driver)可以在不更改現(xiàn)有驅(qū)動程序的情況下,方便地修改、增加現(xiàn)有驅(qū)動程序的功能。特別是對于Windows 2000已經(jīng)提供了通用驅(qū)動程序的硬件設(shè)備,通過編寫過濾器驅(qū)動程序,可以以較小的代價擴展硬件現(xiàn)有的功能。因此具有很強的實際應(yīng)用價值。

1 Windows 2000 I/O請求處理結(jié)構(gòu)

如圖1所示,Windows 2000是分態(tài)的操作系統(tǒng)。用戶應(yīng)用程序運行在用戶態(tài),操作系統(tǒng)代碼(如系統(tǒng)服務(wù)和設(shè)備驅(qū)動程序)在核心態(tài)下運行。用戶態(tài)程序只能調(diào)用Win32子系統(tǒng)提供的API來同設(shè)備交互,當(dāng)請求傳遞到I/O管理器時,他進行必要的參數(shù)匹配和操作安全性檢查,然后由這個請求構(gòu)造出合適的IRP(IO Request Package,I/O請求包),并把此IRP傳遞到適當(dāng)?shù)尿?qū)動程序去,并給應(yīng)用程序一個消息,通知這次I/O操作還沒完成。驅(qū)動程序一般通過硬件抽象層來和硬件交互,從而完成I/O請求工作。驅(qū)動程序完成I/O操作后,他將調(diào)用一個特殊的內(nèi)核服務(wù)例程來完成IRP。這時,I/O管理器把數(shù)據(jù)和結(jié)果返回給Win32和用戶應(yīng)用程序。



2 WDM驅(qū)動程序模型體系結(jié)構(gòu)

Windows驅(qū)動程序模型重新定義驅(qū)動程序分層使用了如圖2的層次結(jié)構(gòu)。圖中左邊是一個設(shè)備對象堆棧。設(shè)備對象是系統(tǒng)為幫助軟件管理硬件而創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。一個物理硬件可以有多個這樣的數(shù)據(jù)結(jié)構(gòu)。處于堆棧最底層的設(shè)備對象稱為物理設(shè)備對象PDO(Physical Device Object),代表了設(shè)備和總線之間的連接。在設(shè)備對象堆棧的中間的對象稱為功能設(shè)備對象FDO(Functional Device Object),代表了設(shè)備的功能。在FDO的上面和下面還會有一些過濾器設(shè)備對象FIDO(Filter Device Object)。位于FDO上面的過濾器設(shè)備對象稱為上層過濾器,位于FDO下面(但仍在PDO之上)的過濾器設(shè)備對象稱為下層過濾器。


總線驅(qū)動程序負(fù)責(zé)枚舉他的總線,這意味著發(fā)現(xiàn)總線上的全部設(shè)備和檢測設(shè)備何時被添加或刪除并為每個設(shè)備創(chuàng)建一個PDO。功能驅(qū)動程序知道如何控制設(shè)備的主要功能,他分層在總線驅(qū)動程序的上面。功能驅(qū)動程序創(chuàng)建一個功能設(shè)備對象,放在設(shè)備棧中。對總線上的所有設(shè)備,總線過濾驅(qū)動程序被加在總線驅(qū)動程序之上;設(shè)備過濾驅(qū)動程序僅對特定的設(shè)備添加。上層的過濾驅(qū)動程序在功能驅(qū)動程序之上,而下層過濾驅(qū)動程序在功能驅(qū)動程序之下。這種層次結(jié)構(gòu)可以使I/O請求過程更加明了。I/O管理器發(fā)送的IRP,先被送到設(shè)備堆棧的上層過濾器驅(qū)動程序(FIDO),他可以根據(jù)要求決定IRP的處理方式,是沿著設(shè)備棧繼續(xù)向下傳,或者是做一些額外的處理。依次,每一層驅(qū)動程序都可以決定如何處理IRP。高層的驅(qū)動程序可以把請求劃分成更簡單的請求并傳遞給下層驅(qū)動程序。中間層次的驅(qū)動程序進一步處理請求,將一個IRP中的請求劃分為若干個小的請求并傳給下層驅(qū)動程序。最后,最低層的驅(qū)動程序與硬件打交道。因此一些IRP在到達(dá)總線程序之前,在設(shè)備棧傳遞過程中可能就被過濾掉了。

3 過濾器驅(qū)動程序

過濾驅(qū)動程序是一種中間驅(qū)動程序,他位于其他的驅(qū)動程序?qū)哟沃g。過濾驅(qū)動程序可以監(jiān)視、攔截和修改IRP流,在不影響其他驅(qū)動程序的前提下提供一些附加的功能。他的功能可分為:

(1)利用過濾器驅(qū)動程序修改現(xiàn)有功能驅(qū)動程序的行為而不必重新編寫功能驅(qū)動程序。

(2)上層過濾器驅(qū)動程序在功能驅(qū)動程序之前看到IRP,可以很方便地為用戶提供額外的特征。還可以修正功能驅(qū)動程序或硬件存在的毛病或缺陷。

(3)下層過濾器驅(qū)動程序在功能驅(qū)動程序要向總線驅(qū)動程序發(fā)送IRP時看到IRP。可以監(jiān)視、攔截、修改功能驅(qū)動程序要執(zhí)行的總線操作流,截獲數(shù)據(jù),進行必要的數(shù)據(jù)處理,再將處理過的數(shù)據(jù)傳遞下去,實現(xiàn)一定的數(shù)據(jù)處理功能。

(4)下層過濾器驅(qū)動程序可以實現(xiàn)驅(qū)動程序的總線無關(guān)性,使功能驅(qū)動程序完全獨立于總線結(jié)構(gòu)而不直接與設(shè)備對話。針對不同的總線編寫不同的下層過濾器,每個下層過濾器對應(yīng)一個總線類型。當(dāng)功能驅(qū)動程序需要與硬件對話時,他只需向相應(yīng)的下層過濾器驅(qū)動程序發(fā)送IRP即可。

4 過濾器驅(qū)動程序設(shè)計

過濾器驅(qū)動程序設(shè)計與功能驅(qū)動程序相似。這里限于篇幅主要討論一下過濾器驅(qū)動程序設(shè)計中與功能驅(qū)動程序相區(qū)別的幾個關(guān)鍵的技術(shù)要點。

4.1 DriverEntry例程

DriverEntry例程是驅(qū)動程序的人口點。當(dāng)I/O管理器裝入驅(qū)動程序時,他調(diào)用DriverEntry例程用來初始化驅(qū)動程序范圍的數(shù)據(jù)結(jié)構(gòu)和資源,包括輸出該驅(qū)動程序的其他人口點,初始化該驅(qū)動程序使用的特定對象,并設(shè)置驅(qū)動程序系統(tǒng)資源。與功能驅(qū)動程序相區(qū)別的是:他必須為每種類型的IRP都安裝派遣函數(shù),而不僅僅只是其希望處理的IRP。

4.2 AddDevice例程

AddDevice函數(shù)的基本職責(zé)是創(chuàng)建一個設(shè)備對象并把他連接到以物理設(shè)備對象PDO為底的設(shè)備堆棧中,并負(fù)責(zé)設(shè)備對象初始化。與功能驅(qū)動程序相區(qū)別的是:過濾驅(qū)動程序創(chuàng)建的設(shè)備對象可能是2種,一種是不命名的過濾設(shè)備對象,過濾器工作時把這個無名的設(shè)備對象連接到以物理設(shè)備對象PDO為底的設(shè)備堆棧中。一種是為了和用戶程序通信而創(chuàng)建的命名的設(shè)備對象并不連接到以物理設(shè)備對象PDO為底的設(shè)備堆棧中。命名可以采用2種方法:第一種方法是采用可顯示的"硬編碼"符號鏈接名,用戶態(tài)程序必須把設(shè)備名硬編碼到源代碼中;另外一種方法是使用設(shè)備接口,每個設(shè)備接口是由一個全局惟一標(biāo)志符GUID標(biāo)志。設(shè)備注冊為一個特定的設(shè)備接口就創(chuàng)建了一個符號鏈接。

相關(guān)步驟如下:

(1)調(diào)用IoCreateDevke創(chuàng)建過濾設(shè)備對象,并建立一個私有的設(shè)備擴展對象。
(2)寄存一個或多個設(shè)備接口,以便應(yīng)用程序能知道設(shè)備的存在。另外,還可以給出設(shè)備名并創(chuàng)建符號連接。
(3)初始化設(shè)備擴展和設(shè)備對象的F1ag成員。
(4)調(diào)用IOAttachDevkeToDeviceStack函數(shù)把新設(shè)備對象放到堆棧上。

具體實現(xiàn)程序如下:

NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo)
{
PDEVICE_OBJECT fido=NULL;
//創(chuàng)建沒有設(shè)備名的過濾設(shè)備對象
NTSTATUS status=IoCreateDevice (DriverObjeot,sizeof (DEVICE-EXTENSION),
NULL,F(xiàn)ILE_DEVICE_UNKNOWN,0,F(xiàn)ALSE,&fido);
if(!NT_SUCCESS(status)) return status;
//初始化設(shè)備擴展和設(shè)備對象的Flag成員
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;
pdx->DeviceObject=fido;
pdx->Pdo=pdo;
pdx->eDeviceType =FILTER;
//把沒有設(shè)備名的設(shè)備對象放到堆棧上
PDEVICE- OBJECT fdo =
IoAttachDeviceToDeviceStack (fido,pdo);
pdx->TopDevObj=fdo;
fido->Flags ︱=pdo->F1ags&(DO_DIRECT-IO ︱DO-BUFFERED-IO ︱ DO_POWER_PAGABLE ︱DO_POWER_INRUSH);
………
//建立一個命名的設(shè)備對象創(chuàng)建符號鏈接
CreateSymbOlicLink (DriverObject,pdo);
return STATUS_SUCCESS;
}

4.3 派遣例程

派遣例程處理來自應(yīng)用程序的打開、關(guān)閉、讀、寫等I/O請求命令。與功能驅(qū)動程序的區(qū)別是:過濾器驅(qū)動程序不能影響其他驅(qū)動程序接受IRP。對于未知的IRP或不處理的IRP過濾驅(qū)動程序的原則是必須沿設(shè)備棧傳遞下去。因此他必須為每種類型的IRP都安裝派遣函數(shù),而不僅僅只是其希望處理的IRP。對于希望處理的IRP必須指定特殊的派遣函數(shù),直接用CompleteIRP來完成接收到的這類IRP,不往下層傳送。

這里由DispatchDeviceControl處理來自應(yīng)用程序的所有希望處理的I/O操作命令。通常采用給予所有自定義的I/O請求代碼的SWITCH語句,而對于每個命令使用相應(yīng)的處理函數(shù)。下面列出了主要的代碼框架:

NTSTATUS DispatchDeviceControl (PDEVICE_OBJECT fido,PIRP Irp)
{
NTSTATUS status;
PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fido->DeviceExtension;
PlO_STACK_LOCATION IrpStack =
IoGetCurrentlrpStackLocation(1rp);
//取I/O控制命令代碼
ULONG IoControlCode = IrpStack >
Parameters.DeviceloContr01.IoControlCode;
switch(IoControlCode)
{
case IOCTL-XXX:
…… //處理I/O控制命令代碼
case IOCTL-XXX:
……
default:
……
break;
}
//完成接收到的IRP
IoCompleteRequest(Irp,IO_NO_INCREMENT);
……
return status;
}
對于不需要處理的IRP則交由DispatchAny例程處理,將IRP沿著設(shè)備棧直接傳遞下去:
NTSTATUS DispatchAny(PDEVICE_OBJECT fido,PIRP Irp)
{
PDEVICE_ EXTENSION pdx=(PDEVICE-EXTENSION)
fido->DeviceExtension
//使堆棧指針少前進一步。
IoSkipCurrentlrpStackLocation(hp);
Status=IoCallDriver(pdx->LowerDeviceObject,Irp);
……
return status;

4.4 Unload例程功能

在Unload例程中,驅(qū)動程序必須釋放所有創(chuàng)建的對象和所有分配給驅(qū)動程序的資源。

5 結(jié) 語

筆者就采用在Windows提供的USB聲卡驅(qū)動程序下方插入自己編寫的下層過濾器驅(qū)動程序?qū)崿F(xiàn)了對USB聲卡輸出的數(shù)據(jù)流的截獲并進行語音信號處理,取得了不錯的效果,現(xiàn)已投入實際應(yīng)用。可見過濾器驅(qū)動程序作為一類特殊的驅(qū)動程序,它可以以較小的代價實現(xiàn)對驅(qū)動數(shù)據(jù)流的截獲,修改、增加現(xiàn)有驅(qū)動常需的功能,具有很強的實用性。
本文地址:http://m.qingdxww.cn/thread-14193-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
nuaachu 發(fā)表于 2010-7-1 09:39:43
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節(jié)省時間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: ww视频在线观看 | 成人情趣片免费看 | 日本大片aa特黄 | 麻豆亚洲 | 欧美日本韩国一区二区 | 久热综合 | 国产精品久久福利网站 | 日韩一级在线观看 | 久久亚洲精品国产亚洲老地址 | 亚洲男人的天堂久久无 | 免费看黄的视频网站 | 女人十八毛片免费特黄 | 国产欧美日本在线观看 | 91在线播放网站 | 中文字幕第12页 | 亚洲欧美日韩中文综合v日本 | 91亚洲精品第一综合不卡播放 | 亚洲自拍偷拍专区 | 九九热在线观看视频 | 精品欧美 | 91在线中文| 婷婷色婷婷 | 日本另类视频 | 欧美精品二区 | 轻轻草在线视频 | 国产伦精一区二区三区视频 | 一区二区国产在线观看 | 中文欧美日韩 | 免费国产一区二区在免费观看 | 欧美专区亚洲 | 一级毛片在线播放免费 | 国产午夜视频在线观看 | 国产三级全黄在线观看 | 九九九九九热 | 日韩综合在线 | 欧美日韩另类国产 | 在线欧美不卡 | 亚洲人成网站看在线播放 | 日本中文字幕在线播放 | 国产高清一级在线观看 | 国产中文字幕免费 |