版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 译林版(三起)三年级英语上册课件Unit 2 What's your name第3课时(Wrap-up time Assessment time)
- 精算师考试精算师考试难点解析(带详解)
- 导游证全国导游基础知识测试题库
- 计算机高级考试实战模拟(解析版)
- 动脉粥样硬化性缺血性卒中短暂性脑缺血发作合并冠心病诊治中国专家共识解读2026
- 幼儿礼貌用语日常交流礼仪科普课
- 五禽戏中医养生原理科普
- 2026 年台风来袭不要前往海边科普知识
- 人工智能与金融创新模式
- 2026年秋季高中新生军训 军训拉练与自然探索
- 2026年上海(中考)语文考试试题含答案
- 连云港市东海县招聘事业单位人员考试真题2025
- 2026年飞控算法工程师(无人机稳定控制)试题及答案
- 2026重庆科技馆管理有限公司招聘9人笔试备考试题及答案详解
- 道路工程监理旁站要点
- 人教版九年级上册数学《习题29.1》教学课件(新教材)
- 公立医院行政管理岗招聘考试核心考点笔记:医院管理学基础
- 《NOSQL数据库技术》课件全套完整版
- 2026中国生物医药CDMO行业政策红利及企业战略布局评估
- JJF(鄂) 182-2026 电学法热阻测试仪校准规范
- 2026年高考真题-化学(上海卷) 含解析
评论
0/150
提交评论