日韩欧美视频一区-日韩欧美三区-日韩欧美群交P内射捆绑-日韩欧美精品有码在线播放免费-成人免费一区二区无码视频-成人免费一级毛片在线播放视频

樹人論文網(wǎng)一個(gè)專業(yè)的學(xué)術(shù)咨詢網(wǎng)站!!!
樹人論文網(wǎng)

基于Windows2000開發(fā)WDM設(shè)備驅(qū)動(dòng)程序北大核心論文網(wǎng)

來(lái)源: 樹人論文網(wǎng)發(fā)表時(shí)間:2013-09-10
簡(jiǎn)要:本文介紹了Windows 2000 WDM驅(qū)動(dòng)程序結(jié)構(gòu)及其原理,給出一個(gè)驅(qū)動(dòng)程序的例子

  摘 要:本文介紹了Windows 2000 WDM驅(qū)動(dòng)程序結(jié)構(gòu)及其原理,給出一個(gè)驅(qū)動(dòng)程序的例子

  關(guān)鍵詞: WDM 驅(qū)動(dòng)程序

  1.概述 引入了全新的WDM (Win32 Driver Model)的驅(qū)動(dòng)程序架構(gòu),說(shuō)是新技術(shù),其實(shí)早在1997年Microsoft就提出了該項(xiàng)技術(shù)并在Windows 98中得到了充分的應(yīng)用,換句話說(shuō),Windows 98也支持WDM。這樣WDM就成為了一個(gè)跨平臺(tái)的驅(qū)動(dòng)程序模型不僅如此WDM驅(qū)動(dòng)程序還可以在不修改源代碼的情況下經(jīng)過(guò)重新編譯后在非Intel平臺(tái)上運(yùn)行。

  2.WDM設(shè)備驅(qū)動(dòng)程序的特點(diǎn)和原理

  2.1通用驅(qū)動(dòng)程序

  對(duì)基本上一樣的硬件,因?yàn)樗麄児蚕硪粋€(gè)總線或完成類似的任務(wù),設(shè)備驅(qū)動(dòng)程序可以使用這些標(biāo)準(zhǔn)的驅(qū)動(dòng)程序功能,使公共總線的共享容易,且更容易寫出新的驅(qū)動(dòng)程序,總線驅(qū)動(dòng)程序,如USB、1394,和類驅(qū)動(dòng)程序。

  (1)Win32程序接口: 可以使用Win32函數(shù)像訪問(wèn)文件那樣訪問(wèn)設(shè)備

  CreateFile() 、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl()用于

  發(fā)出特殊請(qǐng)求,可發(fā)送數(shù)據(jù)給驅(qū)動(dòng)和從驅(qū)動(dòng)得到數(shù)據(jù),IOCTL代碼可以是預(yù)先定義的也可是自己定義的。

  (2)創(chuàng)建設(shè)備 大多數(shù)WDM設(shè)備對(duì)象都是在PnP管理器中調(diào)用AddDevice入口時(shí)創(chuàng)建,這個(gè)PnP 例程在插入新設(shè)備和安裝Inf文件時(shí)被調(diào)用,此后一系列的PnP IRP被發(fā)送到驅(qū)動(dòng)程序,指示設(shè)備應(yīng)如何啟動(dòng)和查詢它的功能

  2.2WDM-的工作原理

  WDM是在NT 4.0驅(qū)動(dòng)程序結(jié)構(gòu)上發(fā)展起來(lái)的,所以它與NT 4.0驅(qū)動(dòng)程序極為相似 ,但是它卻有了本質(zhì)上的提高,比如它支持USB、IEEE 1394、ACPI等全新的硬件標(biāo)準(zhǔn)。 雖然Windows 98與Windows 2000都支持WDM,可是并不意味著Windows 98下的VxD可以在 Windows 2000下運(yùn)行,而NT下的WDM卻可以在Windows 98下運(yùn)行。不過(guò)原先準(zhǔn)備在兩個(gè)平臺(tái)上同時(shí)運(yùn)行需要編寫兩個(gè)截然不同的驅(qū)動(dòng)程序,而現(xiàn)在只需要編寫一個(gè)WDM驅(qū)動(dòng)程序就 可以了。同NT 4.0驅(qū)動(dòng)程序一樣,WDM驅(qū)動(dòng)程序也是分層的,即不同層上的驅(qū)動(dòng)程序有著不同的優(yōu)先權(quán),而Windows 9x下的VxD則沒有此結(jié)構(gòu)。另外,WDM還引入了功能設(shè)備對(duì)象 FDO(functional device object)與物理設(shè)備對(duì)象PDO(physical device object)兩 個(gè)新概念來(lái)描述硬件,一個(gè)PDO代表一個(gè)真實(shí)硬件,在驅(qū)動(dòng)程序看來(lái)則是一個(gè)FDO 。 另外值得注意的是,一個(gè)硬件只允許有一個(gè)PDO,但卻可以擁有多個(gè)FDO,而在驅(qū)動(dòng)程序中我們不是直接操作硬件而是操作相應(yīng)的PDO與FDO。在Ring-3與Ring-0通訊方面,操作系統(tǒng)為每一個(gè)用戶請(qǐng)求打包成一個(gè)IRP(IO Request Packet)結(jié)構(gòu),將其發(fā)送至驅(qū)動(dòng)程序并通過(guò)識(shí)別IRP中的PDO來(lái)識(shí)別是發(fā)送給哪一個(gè)設(shè)備的。另外,在驅(qū)動(dòng)程序的加載方面WDM既不靠驅(qū)動(dòng)程序名稱也不靠一個(gè)具有某種特殊意義的ID,而是依靠一個(gè)128位的GUID來(lái)識(shí)別驅(qū)動(dòng)程序(Windows下許多東西都是靠此進(jìn)行識(shí)別的)。

  2.3 IRP處理

  I/O請(qǐng)求包IRP是驅(qū)動(dòng)程序操作的中心,IRP是一個(gè)內(nèi)核對(duì)象,它是預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu),帶有一組對(duì)它進(jìn)行操作的I/O管理器例程,I/O管理器接受一個(gè)I/O請(qǐng)求,然后將它傳送到合適的驅(qū)動(dòng)程序棧中的最高驅(qū)動(dòng)程序之前,分配并處始化一個(gè)IRP,每個(gè)I/O請(qǐng)求有主功能代碼

  2.4 IRP參數(shù)

  比如一個(gè)寫的I/O請(qǐng)求轉(zhuǎn)換成一個(gè)IRP時(shí),I/O管理器填寫主要的IRP首部,并構(gòu)造第一個(gè)個(gè)棧單元,對(duì)寫請(qǐng)求來(lái)講,首部包含用戶緩沖區(qū)信息,而棧單元?jiǎng)t包含寫的具體參數(shù)。如果調(diào)用另一個(gè)驅(qū)動(dòng)則必須創(chuàng)建下一個(gè)棧單元。

  一個(gè)IRP到棧頂時(shí),使用PIO_STACK_LOCATION

  IoGetCurrentIrpStackLocation(

  IN PIRP Irp

  );IoGetCurrentIrpStackLocation returns a pointer to the caller‘s stack location in the given IRP。

  如決定需要把這個(gè)IRP沿設(shè)備棧向下傳遞,使用IoCopyCurrentIrpStackLocationToNext or IoSkipCurrentIrpStackLocation簡(jiǎn)單的將內(nèi)容復(fù)制到下一個(gè)單元,如果要更改下一個(gè)棧單元,要使用LOCATION

  IoGetNextIrpStackLocation(IN PIRP Irp );

  IoGetNextIrpStackLocation gives a higher level driver access to the next-lower driver‘s I/O stack location in an IRP so the caller can set it up for the lower driver.

  可使用IoCallDriver調(diào)用下一個(gè)驅(qū)動(dòng)程序,當(dāng)最低一層的驅(qū)動(dòng)處理玩后調(diào)用IoCompleteRequest,IRP再向上傳遞返回用戶,當(dāng)IRP向上傳遞時(shí)也可以每個(gè)驅(qū)動(dòng)有機(jī)會(huì)再處理它,每個(gè)驅(qū)動(dòng)要設(shè)置IoSetCompletionRoutine掛接一個(gè)例程 ,一個(gè)驅(qū)動(dòng)不一定要沿著設(shè)備棧向下傳遞IRP,如果自己能處理就就使用IoCompleteRequest完成IrP

  2.5 設(shè)備接口

  用戶態(tài)使用Win32 CreateFile訪問(wèn)驅(qū)動(dòng)程序,dwShareMode為0時(shí)來(lái)請(qǐng)求獨(dú)占內(nèi)核對(duì)象在設(shè)備對(duì)象DEVICE_OBJECT結(jié)構(gòu)中存儲(chǔ)設(shè)備的信息,對(duì)于與設(shè)備的每個(gè)交互,相關(guān)的DEVICE_OBJECT被傳遞給驅(qū)動(dòng)的回調(diào)例程。,但是開發(fā)者可以擴(kuò)展設(shè)備結(jié)構(gòu),稱為設(shè)備擴(kuò)展

  在PnP IRP中我們加載設(shè)備NTSTATUS Wdm1AddDevice( IN PDRIVER_OBJECT DriverObject,指向驅(qū)動(dòng)程序的指針 IN PDEVICE_OBJECT pdo指向物理設(shè)備的指針)

  { DebugPrint(AddDevice);

  status = IoCreateDevice (DriverObject,創(chuàng)建設(shè)備

  sizeof(WDM1_DEVICE_EXTENSION),

  NULL, // No Name

  FILE_DEVICE_UNKNOWN,

  0,

  FALSE, // Not exclusive,TRUE為獨(dú)占

  &fdo返回的新設(shè)備對(duì)象);

  if( !NT_SUCCESS(status)

  return status;

  IoAttachDeviceToDeviceStack(fdo,pdo);與設(shè)備棧掛接

  2.6 刪除設(shè)備

  NTSTATUS Wdm1Pnp( IN PDEVICE_OBJECT fdo,

  IN PIRP Irp)

  PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

  ULONG MinorFunction = IrpStack->MinorFunction;

  if( MinorFunction==IRP_MN_REMOVE_DEVICE)

  {

  DebugPrint(PnP RemoveDevice); // disable device interface

  IoSetDeviceInterfaceState(&dx->ifSymLinkName, FALSE);

  RtlFreeUnicodeString(&dx->ifSymLinkName);

  // unattach from stack從設(shè)備棧脫離

  if (dx->NextStackDevice)

  IoDetachDevice(dx->NextStackDevice);

  // delete our fdo刪除設(shè)備

  IoDeleteDevice(fdo);

  }

  CreateFile IRP_MJ_Create WriteFile MJ_WRITE

  CloseHandle MJ_CLOSE DeviceIoControl MJ_DEVICEIOCONTROL

  ReadFile

  MJ_CLOSE所有的分發(fā)例程都有相同的函數(shù)原型,均需傳遞一個(gè)設(shè)備對(duì)象的指針和IRP,IRP由IRP首部和一系列的棧單元組成,每個(gè)棧單元是一個(gè)IO_STACK_LOCATION結(jié)構(gòu),首部和棧單元指出要作的動(dòng)作 ,棧中有主要的重要參數(shù)如MajorFunction和MinorFunction,每個(gè)驅(qū)動(dòng)只認(rèn)識(shí)一個(gè)棧單元。

  2.7 即插即用

  驅(qū)動(dòng)必須有AddDevice例程并處理各種PnP IRP:

  IRP_MN_START_DEVICE分配資源并啟動(dòng)一個(gè)設(shè)備。

  IRP_MN_STOP_DEVICE 停止設(shè)備進(jìn)行資源重新分配。

  3.具體實(shí)現(xiàn) 同許多應(yīng)用程序一樣,WDM驅(qū)動(dòng)程序是PE格式的,但是它卻沒有WinMain或main這樣的入口,取而代之的是DriverEntry:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, //不同于前面的PDO IN PUNICODE_STRING RegistryPath) { DriverObject- >DriverExtension- >AddDevice = AddDevice; // DriverExtension 中存放著驅(qū)動(dòng)程序擴(kuò)展信息,包括設(shè)備所需要的硬件資源等。 DriverObject- >MajorFunction[IRP_MJ_CREATE]= RequestCreate; DriverObject- >MajorFunction[IRP_MJ_CLOSE]= RequestClose; DriverObject- >MajorFunction[IRP_MJ_DEVICE_CONTROL]= RequestControl; DriverObject- >MajorFunction[IRP_MJ_PNP] = RequestPnp; return STATUS_SUCCESS; } ---- 在DriverEntry驅(qū)動(dòng)程序要向操作系統(tǒng)登記并注冊(cè)一些消息處理器,而且還要指明是否對(duì)驅(qū)動(dòng)程序輸入輸出的數(shù)據(jù)進(jìn)行緩沖,另外還要我們提供一個(gè)AddDevice例程來(lái)把驅(qū)動(dòng)程序添加到驅(qū)動(dòng)程序堆棧中。其中,IRP_MJ_XXXXX為驅(qū)動(dòng)程序所收到的系統(tǒng)消息,RequestXXXXX為相應(yīng)的消息處理函數(shù)。在客戶端程序中,我們一般要采用DeviceIoContro l通過(guò)自定義的控制碼與驅(qū)動(dòng)程序通信(在VxD中大多也采用這種方式)。看看驅(qū)動(dòng)程序所收到的系統(tǒng)消息,我們不難發(fā)現(xiàn)當(dāng)用戶調(diào)用DeviceIoControl時(shí)操作系統(tǒng)就會(huì)向驅(qū)動(dòng)程序發(fā)出一條IRP_MJ_DEVICE_CONTROL消息,以觸發(fā)RequestControl消息處理函數(shù)。NTSTATUS RequestControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack; ULONG ControlCode; ULONG InputLength,OutputLength; NTSTATUS status; IrpStack=IoGetCurrentIrpStackLocation(Irp); //獲取當(dāng)前IRP所在的I/O堆棧 ControlCode=IrpStack- >Parameters.DeviceIoControl.IoControlCode; //取得控制碼 InputLength=IrpStack- >Parameters.DeviceIoControl.InputBufferLength; //取輸入緩沖區(qū)大小

  OutputLength=IrpStack- >Parameters.DeviceIoControl. OutputBufferLength;//取輸出緩沖區(qū)大小

  switch(ControlCode) { case HELLOWDM_IOCTL_HELLO: DbgPrint (Hello from WDM.\n);//向調(diào)試器輸出字符串 status=STATUS_SUCCESS; //置返回值 break; default: status=STATUS_INVALID_DEVICE_REQUEST; //輸入的控制碼不支持 } return CompleteRequest(Irp, status, 0); //調(diào)用CompleteRequest通知操作系統(tǒng)完成IRP操作

  立刻注冊(cè),免費(fèi)享受三天的試用收看期,火爆,激情 讓您免費(fèi)欣賞三天

  4.結(jié)束語(yǔ)

  本文是筆者在Windows2000下開發(fā)網(wǎng)卡驅(qū)動(dòng)程序的一些經(jīng)驗(yàn)總結(jié),使用Windows2000 DDK開發(fā)包和Windows2000 platform SDK ,在VC++6.0下調(diào)試通過(guò)。

  參考文獻(xiàn)

  [1] Art Baker Jerry Lozano 著 施 諾 譯 Windows 2000設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)指南 機(jī)械工業(yè)出版社 2001

  [2] 武安河 周利莉 著 Windows 設(shè)備驅(qū)動(dòng)程序開發(fā)實(shí)務(wù) 電子工業(yè)出版社 2002

主站蜘蛛池模板: 国产在线aaa片一区二区99 | 国产亚洲va在线电影 | 亚洲视频精品在线观看 | 三级黄色在线视频中文 | 热久久综合这里只有精品电影 | 沟沟人体一区二区 | 亚洲xxxx动漫 | 久久精品国产只有精品 | AAA级精品无码久久久国片 | 亚洲AV久久久噜噜噜久久 | 99视频免费在线观看 | 777ZYZ玖玖资源站最稳定网址 | 短篇合集纯肉高H深陷骚 | 日本老人oldmantv乱 | 高清不卡伦理电影在线观看 | 野花日本完整版在线观看免费高清 | 18亚洲男同gay1069| 国产成人a在一区线观看高清 | 欧美日韩免费看 | 试看做受120秒免费午夜剧场 | adc影院在线 | 精品手机在线视频 | 日本视频中文字幕一区二区 | 天天槽任我槽免费 | 无码专区久久综合久综合字幕 | 美女久久久 | 日韩视频在线观看 | 我与旗袍老师疯狂床震 | 狼人大香伊蕉国产WWW亚洲 | 美女被艹网站 | 久久久无码精品亚洲A片软件 | 入禽太深在线观看免费高清 | 日本人奶水中文影片 | 国产亚洲精品在浅麻豆 | 国产精品久久久久久人妻精品蜜桃 | 贵妇局长的蕾丝乳罩 | 又大又硬又爽免费视频 | 国产永久视频 | 极品少妇高潮XXXXX | 伊人香蕉在线播放视频免费 | 少妇连续高潮抽搐痉挛昏厥 |