



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Window驱动开发的一些基本概念1. 驱动对象,设备对象。DirverObject VS DeviceObject网上一查,相关的资料一大堆,所有的资料都会说,一个驱动对象对应一个设备对象,一个设备对象对应一个驱动对象。这个说法过于笼统。首先来聊一聊驱动对象。Windows内核编程借鉴了面向对象的思想,很多基本概念都是以对象Object的形式呈现。包括最重要的DRIVER_OBJECT和DEVICE_OBJECT。一个驱动程序,如果仅仅作为一个内核模块,实现特定的功能,不需要与上层应用程序通信,那么,它可以不要设备对象,不需要创建IoCreateDevice。实际上,设备对象存在的意义就在于,它可以接收内核消息,就像上层app中的窗口一样。如果你的程序运行于后台,那就不需要有窗口的存在。在内核里面,同样如此。第二种情况,你可能并没有显式地IoCreateDevice,但你的派遣函数仍然可以收到来自某设备对象的irp。这种情况多见于过滤驱动。比如文件系统过滤等。绑定,就意味着被绑定设备对象的所有请求,都会优先发送到绑定的设备对象上。在某个驱动中,比如串口中,你绑定了某个串口,就是想实现对流经串口的数据的过滤,那么这个时候要注意了,你在你的派遣dispatch函数中,必须要做出决断,是允许数据通过,还是禁止通过,不做决断是不行的,不做决断意味着所有数据都被禁止。这也是为什么要编写派遣历程的原因。不过,判断设备对象是否是我们绑定的设备对象有点诡异,它直接是这样的:if(pDeviceObject = MyDeviceObject)。2. 驱动与应用交互的方式三种。METHORD_BUFFER/缓冲方式METHORD_XX_DIRECT/直接方式METHORD_NEITHER/都不是方式(有点别扭,没办法,英文原意就是这样)我们自己编写应用程序与驱动交互时,可以选择上面三种任意一个,驱动收到控制码后,要对不同的I/O缓冲做不同的处理。三种方式分别对应的buffer获取方式:对于输入缓冲区InputBuffer,如下表所示:METHORD_BUFFERIrp-AssociatedIrp.SystemBufferMETHORD_XX_DIRECTIrp-AssociatedIrp.SystemBufferMETHORD_NEITHERIrp-Parameters.DeviceIoControl.Type3InputBuffer对于输出缓冲区OutputBuffer如下表所示:METHORD_BUFFERIrp-AssociatedIrp.SystemBufferMETHORD_XX_DIRECTIrp-MdlAddressMETHORD_NEITHERIrp-UserBuffer但如果不是自己编的应用程序,驱动还是要做出反应,那么可以利用寒江独钓一书50页上所说的:实际使用中,InputBuffer的获取简单,不是systembuffer,就是type3inputbuffer。OutputBuffer稍微麻烦。不过实际上很少用到,用到的时候一般也是自定义的应用程序请求码。3. 文件过滤驱动sfilter这个例子在wdk自带的src目录中有。看了一遍,有些心得,特此写出,以备忘记。码字真累啊。该驱动目标是实现文件系统的实时监控。稍加改造,添加一些功能,能够实现禁止/允许用户对文件的读,写,打开,新建,重命名,文件重定向等。过滤,形象地说,就是在固有的层面上再添加一层过滤网,让本来流经下面的东西先流到过滤网上,过滤网根据规则判断哪些需要过滤掉。就驱动来说,就是要attach,绑定。文件系统的绑定很麻烦,有两个过程,第一是绑定控制设备对象,第二是绑定文件系统卷设备。第一个过程主要是为了获得发送给文件系统控制设备的文件系统控制请求。IRP_MJ_FILE_SYSTEM_CONTROL。4. LIST_ENTRYLIST_ENTRY是微软为内核开发者定义的一个双向链表指针。这个链表里面没有任何数据:typedef struct _LIST_ENTRY struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; LIST_ENTRY, *PLIST_ENTRY;为了使用它,我们需要自己定义一个结构体类型,将LIST_ENTRY作为结构体的一个成员:typedef struct MyDataStructTagULONG data;LIST_ENTRY list;MyDataStruct ,*PMyDataStruct;LIST_ENTRY的常见操作有:初始化、插入、弹出、取数据。下面是一个例子:VOID TestListEntry()ULONG index = 0;PMyDataStruct pData;LIST_ENTRY MyList;DbgPrint(TestListEntry begin);InitializeListHead(&MyList);for(index = 0;index data = index;InsertHeadList(&MyList,&pData-list);DbgPrint(InsertListHead,data=%dn,pData-data);while(!IsListEmpty(&MyList)/PLIST_ENTRY pEntry = RemoveTailList(&MyList);PLIST_ENTRY pEntry = RemoveHeadList(&MyList);pData = CONTAINING_RECORD(pEntry,MyDataStruct,list);DbgPrint(RemoveTailList,data=%dn,pData-data);ExFreePool(pData);DbgPrint(TestListEntry endn);用DbgView查看,结果是:000000252:39:07 PMTestListEntry begin000000262:39:07 PMInsertListHead,data=0000000272:39:07 PMInsertListHead,data=1000000282:39:07 PMInsertListHead,data=2000000292:39:07 PMInsertListHead,data=3000000302:39:07 PMInsertListHead,data=4000000312:39:07 PMInsertListHead,data=5000000322:39:07 PMInsertListHead,data=6000000332:39:07 PMInsertListHead,data=7000000342:39:07 PMInsertListHead,data=8000000352:39:07 PMInsertListHead,data=9000000362:39:07 PMRemoveTailList,data=9000000372:39:07 PMRemoveTailList,data=8000000382:39:07 PMRemoveTailList,data=7000000392:39:07 PMRemoveTailList,data=6000000402:39:07 PMRemoveTailList,data=5000000412:39:07 PMRemoveTailList,data=4000000422:39:07 PMRemoveTailList,data=3000000432:39:07 PMRemoveTailList,data=2000000442:39:07 PMRemoveTailList,data=1000000452:39:07 PMRemoveTailList,data=0000000462:39:07 PMTestListEntry end注意红色部分代码。如果我用红色部分,结果是:000000012:35:39 PMTestListEntry begin000000022:35:39 PMInsertListHead,data=0000000032:35:39 PMInsertListHead,data=1000000042:35:39 PMInsertListHead,data=2000000052:35:39 PMInsertListHead,data=3000000062:35:39 PMInsertListHead,data=4000000072:35:39 PMInsertListHead,data=5000000082:35:39 PMInsertListHead,data=6000000092:35:39 PMInsertListHead,data=7000000102:35:39 PMInsertListHead,data=8000000112:35:39 PMInsertListHead,data=9000000122:35:39 PMRemoveTailList,data=0000000132:35:39 PMRemoveTailList,data=1000000142:35:39 PMRemoveTailList,data=2000000152:35:39 PMRemoveTailList,data=3000000162:35:39 PMRemoveTailList,data=4000000172:35:39 PMRemoveTailList,data=50000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新型绿色建筑材料对能源消耗的降低作用分析
- 智能科技在运动健康领域的创新应用
- 老年大学教师专业能力与课程教学质量提升
- 茶文化体验式学习在职业价值观教育中的应用模式
- 水电站环保与经济运行的平衡分析
- 虚拟实习与远程工作模式提升大学生就业创业能力
- 基于人工智能的公共卫生疫情预测与应对能力培养
- 市政供水管道施工中土壤与地质条件的适应性分析
- TPO防水材料老化机理及耐久性性能分析
- 排污单位员工环境意识提升与培训方案
- 2025年8月31日湖南省市直遴选笔试真题及答案解析(B卷)
- 液化气瓶安全知识培训课件
- 毕节法院辅警面试题目及答案
- 足浴店突发事件应急处置预案
- 2025国家教育行政学院招聘9人(非事业编)笔试参考题库附答案解析
- 柴油安全知识培训课件
- 中药制备工艺汇报课件
- 南太平洋地区华侨华人的社会与文化研究
- 儿童早期发展中的回应性照护模式研究
- 幼儿园大班自然教育实施策略与效果研究
- 住宅工程质量常见问题防治技术标准DBJ 43T 302-2025知识解读
评论
0/150
提交评论