国产视频www-国产视频xxx-国产视频xxxx-国产视频一二-一本大道香蕉中文日本不卡高清二区-一本久久精品一区二区

樹人論文網一個專業的學術咨詢網站!!!
樹人論文網

基于Windows2000開發WDM設備驅動程序北大核心論文網

來源: 樹人論文網發表時間:2013-09-10
簡要:本文介紹了Windows 2000 WDM驅動程序結構及其原理,給出一個驅動程序的例子

  摘 要:本文介紹了Windows 2000 WDM驅動程序結構及其原理,給出一個驅動程序的例子

  關鍵詞: WDM 驅動程序

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

  2.WDM設備驅動程序的特點和原理

  2.1通用驅動程序

  對基本上一樣的硬件,因為他們共享一個總線或完成類似的任務,設備驅動程序可以使用這些標準的驅動程序功能,使公共總線的共享容易,且更容易寫出新的驅動程序,總線驅動程序,如USB、1394,和類驅動程序。

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

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

  發出特殊請求,可發送數據給驅動和從驅動得到數據,IOCTL代碼可以是預先定義的也可是自己定義的。

  (2)創建設備 大多數WDM設備對象都是在PnP管理器中調用AddDevice入口時創建,這個PnP 例程在插入新設備和安裝Inf文件時被調用,此后一系列的PnP IRP被發送到驅動程序,指示設備應如何啟動和查詢它的功能

  2.2WDM-的工作原理

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

  2.3 IRP處理

  I/O請求包IRP是驅動程序操作的中心,IRP是一個內核對象,它是預先定義好的數據結構,帶有一組對它進行操作的I/O管理器例程,I/O管理器接受一個I/O請求,然后將它傳送到合適的驅動程序棧中的最高驅動程序之前,分配并處始化一個IRP,每個I/O請求有主功能代碼

  2.4 IRP參數

  比如一個寫的I/O請求轉換成一個IRP時,I/O管理器填寫主要的IRP首部,并構造第一個個棧單元,對寫請求來講,首部包含用戶緩沖區信息,而棧單元則包含寫的具體參數。如果調用另一個驅動則必須創建下一個棧單元。

  一個IRP到棧頂時,使用PIO_STACK_LOCATION

  IoGetCurrentIrpStackLocation(

  IN PIRP Irp

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

  如決定需要把這個IRP沿設備棧向下傳遞,使用IoCopyCurrentIrpStackLocationToNext or IoSkipCurrentIrpStackLocation簡單的將內容復制到下一個單元,如果要更改下一個棧單元,要使用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調用下一個驅動程序,當最低一層的驅動處理玩后調用IoCompleteRequest,IRP再向上傳遞返回用戶,當IRP向上傳遞時也可以每個驅動有機會再處理它,每個驅動要設置IoSetCompletionRoutine掛接一個例程 ,一個驅動不一定要沿著設備棧向下傳遞IRP,如果自己能處理就就使用IoCompleteRequest完成IrP

  2.5 設備接口

  用戶態使用Win32 CreateFile訪問驅動程序,dwShareMode為0時來請求獨占內核對象在設備對象DEVICE_OBJECT結構中存儲設備的信息,對于與設備的每個交互,相關的DEVICE_OBJECT被傳遞給驅動的回調例程。,但是開發者可以擴展設備結構,稱為設備擴展

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

  { DebugPrint(AddDevice);

  status = IoCreateDevice (DriverObject,創建設備

  sizeof(WDM1_DEVICE_EXTENSION),

  NULL, // No Name

  FILE_DEVICE_UNKNOWN,

  0,

  FALSE, // Not exclusive,TRUE為獨占

  &fdo返回的新設備對象);

  if( !NT_SUCCESS(status)

  return status;

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

  2.6 刪除設備

  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從設備棧脫離

  if (dx->NextStackDevice)

  IoDetachDevice(dx->NextStackDevice);

  // delete our fdo刪除設備

  IoDeleteDevice(fdo);

  }

  CreateFile IRP_MJ_Create WriteFile MJ_WRITE

  CloseHandle MJ_CLOSE DeviceIoControl MJ_DEVICEIOCONTROL

  ReadFile

  MJ_CLOSE所有的分發例程都有相同的函數原型,均需傳遞一個設備對象的指針和IRP,IRP由IRP首部和一系列的棧單元組成,每個棧單元是一個IO_STACK_LOCATION結構,首部和棧單元指出要作的動作 ,棧中有主要的重要參數如MajorFunction和MinorFunction,每個驅動只認識一個棧單元。

  2.7 即插即用

  驅動必須有AddDevice例程并處理各種PnP IRP:

  IRP_MN_START_DEVICE分配資源并啟動一個設備。

  IRP_MN_STOP_DEVICE 停止設備進行資源重新分配。

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

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

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

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

  4.結束語

  本文是筆者在Windows2000下開發網卡驅動程序的一些經驗總結,使用Windows2000 DDK開發包和Windows2000 platform SDK ,在VC++6.0下調試通過。

  參考文獻

  [1] Art Baker Jerry Lozano 著 施 諾 譯 Windows 2000設備驅動程序設計指南 機械工業出版社 2001

  [2] 武安河 周利莉 著 Windows 設備驅動程序開發實務 電子工業出版社 2002

主站蜘蛛池模板: 一级做a爰全过程免费视频毛片 | 1204国产成人精品视频 | 热99re久久精品这里都是免费 | 亚洲精品国产一区二区三区四区 | 一区二区三区精品国产 | 欧美高清日韩 | 韩国免费网站成人 | 一区二区三区免费观看 | 日本三级香港三级网站 | 国产精品色内内在线播放 | 亚洲一区二区三区福利在线 | 国产欧美日韩另类 | 亚洲精品久久久久影院 | 一级毛片儿 | 久久高清一区二区三区 | 亚洲精品在线影院 | 国产一级毛片夜一级毛片 | 日韩成人毛片高清视频免费看 | 日本高清在线精品一区二区三区 | 亚洲逼 | 毛片在线高清免费观看 | 99视频在线免费观看 | 国产一区二区在线视频 | 欧美日韩在线视频免费完整 | 国产真实孩交 | 亚洲男人天堂手机版 | 在线视频欧美日韩 | 亚洲成人影院在线 | 女初高中福利视频在线观看 | 免费一级毛片私人影院a行 免费一级毛片无毒不卡 | 久久国产精品一国产精品 | 亚洲国产精品久久网午夜 | 黄色免费看片网站 | 国产三级精品在线 | 欧美综合一区 | 久久久久久色 | 免费永久国产在线视频 | 亚洲精品第五页中文字幕 | 成人午夜网站 | 日本www免费视频网站在线观看 | 亚洲不卡一区二区三区在线 |