驱动对象与设备对象资料_第1页
驱动对象与设备对象资料_第2页
驱动对象与设备对象资料_第3页
驱动对象与设备对象资料_第4页
驱动对象与设备对象资料_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、驱动对象与设备对象 DRIVER_OBJECT 和 DEVICE_OBJECT 的关系 DRIVER_OBJECT 是驱动程序在内核中的数据结构,每个驱动程序有唯一 DRIVER_OBJ ECT , IO管理器使用驱动程序对象代表每个设备驱动程序,驱动程序描述了驱动程序的载 入到内存什么地方,驱动程序的大小和它的主要入口点(MajorFu nction数组);驱动程 序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。 DEVICE_OBJECT 是物理设备或逻辑设备在内核中的数据结构,跟这个概念相关的有 PD O和FDO ; PDO对应于具体的硬件设备,每个

2、硬件设备对应一个 PDO,而一个PDO可以 对应多个FDO ; PDO和FDO都是DEVICE_OBJECT 的实体;同一个设备驱动程序对象 下的所有设备通过 NextObject 域连接成一个链表(即上述驱动程序设备对象的一个域); AttachedDevice域是针对 早期驱动的(Window NT4以前的版本,在以后的版本中也 可以正常使用);DriverObject域指向与该设备相关的驱动程序对象。 这里所说的驱动对象是一种数据结构,在DDK中名为DRIVER_OBJECT。任何驱动 程序都对应一个 DRIVER_OBJECT.如何获得本人所写的驱动对应的DRIVER_OBJE CT呢

3、?驱动程序的入口函数为DriverEntry ,因此,当你写一个驱动的开始,你会写下如 下的代码: NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_ST RING RegistryPath ) 这个函数就相当与喜欢 c语言的你所常用的 main()N 是无意义的宏,仅仅表明后边的参 数是一种输入,而对应的 OUT则代表这个参数是一种返回。这里没有使用引用,因此如果 想在参数中返回结果,一律传入指针。 DriverObject就是你所写的驱动对应的DRIVER_OBJECT ,是系统在加载你的驱动 时候所分配的。

4、 RegisteryPath是专用于你记录你的驱动相关参数的注册表路径。这两者都由系统分配 并通过这两个参数传递给你。 DriverObject重要之处,在于它 拥有一组函数指针,称为dispatchfunctions. 开发驱动的 主要任务就是亲手撰写这些dispatch functions .当系统用到你的驱动,会向你 的驱动发送IRP (这是windows所有驱动的共同工作方式)。你的任务是在dispatch f unction中处理这些请求。你可以让irp失败,也可以成功返回,也可以修改这些irp , 甚至可以自己发出irp。 设备对象 则是指DEVICE_OBJECT.下边简称DO.

5、 但是实际上每个irp都是针对DO发出的。只有针对由该驱动所生成的DO的IRP ,才 会发给该驱动来处理。具体的分发函数,决定于 DO下的DriverObject 域。 当一个应用程序打开文件并读写文件的时候,windows系统将这些请求变成irp发送给文 件系统驱动。文件系统过滤驱动将可以过滤这些irp .这样,你就拥有了捕获和改变文件系统 操作的能力。 象Fat32,NTFS这样的文件系统(File System,简称FS),可能生成好几种设备。首先 文件系统驱动本身往往生成一个控制设备(CDO).这个设备的主要任务是 修改整个驱动的 内部配置。因此一个Driver 只对应一个CDO .

6、另一种设备是被这个文件系统 Mount 的Volume 。一个FS可能有多个 Volume ,也可 能一个都没有。解释一下,如果你有 C:,D:,E:,F: 四个分区。C:,D :为NTFS ,E:,F :为Fat 32 .那么E:,F :则是Fat的两个Volume设备对象.实际上C:是该设备的符号连接 (Sy mbolic Link )名。而不是真正的设备名。可以打开 Symbolic Links Viewer ,能看到: C: DeviceHarddiskVolume1 因此该设备的设备名为“HarddiskVolume1 ”. 这里也看出来,文件系统驱动是针对每个Volume 来生成一

7、个 DeviceObject ,而不是针 对每个文件的。实际上对文件的读写的irp ,都发到Volume设备对象上去了。并不会生 成一个 文件设备对象”。掌握了这些概念的话,我们现在用简单的代码来生成我们的CDO, 作为我们开发文件系统驱动的第一步牛刀小试。 NTSTATUS DriverE ntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) /定义一个Uni code 字符串。 UNICODE_STRINGn ameStri ng; RtlInitUnicodeString( /生成控制设备 stat

8、us = IoCreateDevice ( DriverObject, 0, /has no device extension /如果因为路径没找到而生成失败 if (status = STATUS_OBJECT_PATH_NOT_FOUND ) /这是因为一些低版本的操作系统没有这个目录 /如果没有,我们则改变位置,生成到下 RtlInitUnicodeString( status = IoCreateDevice ( DriverObject, 0, if (! NT_SUCCESS ( status ) KdPrint ( SFilter!DriverEntry:Error creati

9、ngcontroldevice object %wZ, status=%08xn, return status; else if (! NT_SUCCESS( status ) /失败也打印一个。并直接返回错误 KdPrint ( SFilter!DriverEntry:Error creatingcontroldevice object %wZ, status=%08xn, return status; sfilter.sys.把这个文件与前所描述的inf文件同一目录,按上节所叙述方法安装。 这个驱动不起任何作用,但是你已经成功的完成了hello world. 初次看这些代码可能有一些慌乱。

10、但是只要注意了以下几点,你就会变得轻松了: 1 )习惯使用UNICODE_STRING字符串。这些字符串用Rtl -系列的函数来操作。你应 该阅读DDK帮助,然后熟悉这些字符串的用法。 2 ) 用KdPrint()来代替printf 输出信息。这些信息可以在DbgView 中看到。KdPri nt()自身是一个宏,为了完整传入参数所以使用了两重括弧。这个比DbgPrint调用要稍 好。因为在free版不被编译。 3) 查看DDK帮助了解生成设备对象IoCreateDevice的用法。 请注意CDO 生成后,保存在gSFilterControlDeviceObject中。这样以后我们得到一个 D

11、EVICE_OBJECT 时, 就很容易判断是否是我们的控制设备。 1 驱动对象(DRIUEROBJECT) SI疊覩蠶鈔励象与之对应并且该驱动对象是在驱动加载是被内核中的对象管理程 typedef struct _DRIUER_OBJECT CSHORT Type; CSHORT Size; PDEUICE_OBJECT DeuiceObject; 督土驱顼程疥含頁一个或多个殳簣对象其中, 最启一个设备对象指向空;此处的DeuiceObjec DeuiceOb动对漿里的所有设备肝象 驱动卸载时,遍历每个设备对象,将其删除; 勰飜蠶二哪A对瓠 展备对象有翟序贾创建,而非榛作萦统完成;在 ULO

12、HG Flags; PUOID DriuerStart; ULOHG DriuerSize; PUOID DriuerSection; PDRIUEREXTENSION DriuerExtension; UNICODESTRING DriuerNdiw; 驱动程序的名字,格解般为:Driuer驱动程序名称; PUNICODE_STRING HardwareDatabase; 在注册表申的键值名REGISTRYMACHINEHARDWAREDESCRIPTIONSVSTEM; PFAST_ld_DISPATCH FastIoDispatch; PDRIUER_YNITIALIZE Driuerl

13、nit; PDRIUEfiZsTARTIO DriuerStartlo; PDRIUER_UNLOAD DriuerUnload; 驱动程序卸载时所用的回调函数; PDRIUER_DISPATCH MajorFunctionIRPJ1J_MAXIMUrLFUNCTION * 1; IRP的派遣函数数组; DRIUER_OBJECT; typedef struct _DRIUER_OBJECT *PDRIUER_OBJECT; DEUICE OBJECT) J F会创建一个裁铤殳翔象,甩)EUICEJJBJECT数据结构表示海个设爸对象 针扌旨向下一不设备对象,形麽一个i購锂;设留链的第一个设备

14、是在DRIUERJJBJECT曙杓体 鬼善构为: typedef struct _DEUICE_OBJECT 有更咼一层的驱动附加到这个驱动的时候,AttachedDeuice指向的就是那 个更高一层的驱岛; PIRP Currentlrp; 抬向的是当前IRP结构; PIOTIMER Tiner; ULONG Flags; ULONG Characteristics; _uolatile PUPB Upb; PUOID DeuiceExtension; DEUICETVPE DeuiceType; CCHAR StackSize; union LIST_ENTRY ListEntry; WA

15、IT一CONTEXT BLOCK Web; Queue; ULONG AlignnentRequirement: KDEUICEQUEUE DeuiceQueue; KDPC Dpc; ULONG ActiueThreadCount; PSECURITVDESCRIPTOR SecurityDescriptor; KEUENT USHORT USHORT PDEUOBJ PUOID Reserved; DEUICEOBJECT, *PDEUICE_OBJECT; 2. ,从而可乞 DeuiceLock; SectorSize; Sparel; EXTENSION DeuiceObjectExtension; USHORT SectorSize; USHORT Sparel; PDEUOBJ_EXTENSION DeuiceObjectExtension; PUOID Reserued; DEU(CE_OBJECT *PDEUICE_OBJECT; 3 创建设备对象匚 IoCreateDeuice; 證一嘗号譬霞用户模式下的识别;如: 真正的设备对塚是:DeuiceHarddiskUolune1; 漲蠶礬墾話箴盟嚨暑e Object PDO总线驱动创建 能设备对象Function Deuice Object F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论