




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、驱动对象与设备对象 DRIVER_OBJECT和DEVICE_OBJECT的关系DRIVER_OBJECT是驱动程序在内核中的数据结构,每个驱动程序有唯一DRIVER_OBJECT,IO管理器使用驱动程序对象代表每个设备驱动程序,驱动程序描述了驱动程序的载入到内存什么地方,驱动程序的大小和它的主要入口点(MajorFunction数组);驱动程序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。DEVICE_OBJECT是物理设备或逻辑设备在内核中的数据结构,跟这个概念相关的有PDO和FDO;PDO对应于具体的硬件设备,每个硬件设备对应一个PDO,而一个PDO
2、可以对应多个FDO;PDO和FDO都是DEVICE_OBJECT的实体;同一个设备驱动程序对象下的所有设备通过NextObject域连接成一个链表(即上述驱动程序设备对象的一个域);AttachedDevice域是针对“早期”驱动的(Window NT4以前的版本,在以后的版本中也可以正常使用);DriverObject域指向与该设备相关的驱动程序对象。这里所说的驱动对象是一种数据结构, 在DDK 中名为DRIVER_OBJECT。任何驱动程序都对应一个DRIVER_OBJECT.如何获得本人所写的驱动对应的DRIVER_OBJECT 呢?驱动程序的入口函数为DriverEntry,因此,当你
3、写一个驱动的开始,你会写下如下的代码:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )这个函数就相当与喜欢c 语言的你所常用的main().IN 是无意义的宏,仅仅表明后边的参数是一种输入,而对应的OUT 则代表这个参数是一种返回。这里没有使用引用,因此如果想在参数中返回结果,一律传入指针。DriverObject 就是你所写的驱动对应的DRIVER_OBJECT, 是系统在加载你的驱动时候所分配的。RegisteryPath 是专用于你记录你的驱动相关参数的注册表路径。
4、这两者都由系统分配并通过这两个参数传递给你。DriverObject 重要之处,在于它拥有一组函数指针,称为dispatch functions.开发驱动的主要任务就是亲手撰写这些dispatch functions.当系统用到你的驱动,会向你的驱动发送IRP(这是windows 所有驱动的共同工作方式)。你的任务是在dispatch function 中处理这些请求。你可以让irp 失败,也可以成功返回,也可以修改这些irp,甚至可以自己发出irp。设备对象则是指DEVICE_OBJECT.下边简称DO.但是实际上每个irp 都是针对DO 发出的。只有针对由该驱动所生成的DO 的IRP, 才
5、会发给该驱动来处理。具体的分发函数,决定于DO 下的DriverObject 域。当一个应用程序打开文件并读写文件的时候,windows 系统将这些请求变成irp 发送给文件系统驱动。文件系统过滤驱动将可以过滤这些irp.这样,你就拥有了捕获和改变文件系统操作的能力。象Fat32,NTFS 这样的文件系统(File System,简称FS),可能生成好几种设备。首先文件系统驱动本身往往生成一个控制设备(CDO).这个设备的主要任务是修改整个驱动的内部配置。因此一个Driver 只对应一个CDO.另一种设备是被这个文件系统Mount 的Volume。一个FS 可能有多个Volume,也可能一个都
6、没有。解释一下,如果你有C:,D:,E:,F:四个分区。C:,D:为NTFS,E:,F:为Fat32.那么E:,F:则是Fat 的两个Volume 设备对象.实际上"C:"是该设备的符号连接(Symbolic Link)名。而不是真正的设备名。可以打开Symbolic Links Viewer,能看到:C: DeviceHarddiskVolume1因此该设备的设备名为“DeviceHarddiskVolume1”.这里也看出来,文件系统驱动是针对每个Volume 来生成一个DeviceObject,而不是针对每个文件的。实际上对文件的读写的irp,都发到Volume 设备
7、对象上去了。并不会生成一个“文件设备对象”。掌握了这些概念的话,我们现在用简单的代码来生成我们的CDO,作为我们开发文件系统驱动的第一步牛刀小试。NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)/ 定义一个Unicode 字符串。UNICODE_STRING nameString;RtlInitUnicodeString( &nameString, L"FileSystemFiltersSFilter" );/ 生成控制设备status = IoCr
8、eateDevice( DriverObject,0, /has no device extension&nameString,FILE_DEVICE_DISK_FILE_SYSTEM,FILE_DEVICE_SECURE_OPEN,FALSE,&gSFilterControlDeviceObject );/ 如果因为路径没找到而生成失败if (status = STATUS_OBJECT_PATH_NOT_FOUND) / 这是因为一些低版本的操作系统没有FileSystemFilters这个目录/ 如果没有,我们则改变位置,生成到FileSystem下.RtlInitUni
9、codeString( &nameString, L"FileSystemSFilterCDO" );status = IoCreateDevice( DriverObject,0,&nameString,FILE_DEVICE_DISK_FILE_SYSTEM,FILE_DEVICE_SECURE_OPEN,FALSE,&gSFilterControlDeviceObject );/ 成功后,用KdPrint 打印一个log.if (!NT_SUCCESS( status ) KdPrint( "SFilter!DriverEntry:
10、Error creating control device object "%wZ",status=%08xn", &nameString, status );return status; else if (!NT_SUCCESS( status ) / 失败也打印一个。并直接返回错误KdPrint( "SFilter!DriverEntry: Error creating control device object "%wZ",status=%08xn", &nameString, status );return 2) 用KdPrint()来代替printf 输出信息。这些信息可以在DbgView 中看到。KdPrint()自身是一个宏,为了完整传入参数所以使用了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微信小程序上线发布流程图文详解
- 《化学反应动力学》课件
- 幼师的心得体会模版
- 2025地板代理合同范本
- 《临床护理风险预防》课件
- 探索杨荣平课件制作的智慧之路
- 品酒师、调酒师题库练习试题及答案
- 《DELL品管经验检讨》课件
- 《环境保护与可持续发展课件》课件
- 2025年磐安县合作社茶叶种植收购合同
- 乙烯高压气相本体聚合制备低密度聚乙烯的合成工艺
- DB23T 3104-2022 油田含油污泥处置与利用污染控制要求
- 2030冷轧车间设计
- 中华人民共和国飞行基本规则
- 大型污泥脱水离心机机组安装及调试工法
- 塔式起重机大臂减臂使用的受力分析和计算
- 三年高考高考生物试题分项版解析 专题01 组成细胞的分子
- 电力供应与使用条例考试卷及答案
- 生物大分子晶体学基础(I)2016
- 申请增值电信业务经营许可证材料范本说明书
- 关于电商平台对入驻经营者的审核要求或规范文件
评论
0/150
提交评论