




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中间层驱动工作原理作者:noble联系方式:noble _shi 21本文如有错误,请联系作者,谢谢。(1)注册表常识:1)、设备数据库所在的注册表健值为:HKLMSYSTEMCurrentControlSetEnumENUM子项中是一个设备数据库,在数据库存放计算机中所有安装的,并且被系统认识到的设备。所有的用户(包括管理员)都不能更改ENUM项的内容。这是为了保护操作系统和安装的设备的完整性。为了更改设备的设置,应该使用“设备管理器”。为了在设备管理器中现实隐藏的,非即插即用的,以及没有连接到计算机上的所有设备,你应该首先在命令解释器中敲入命令set DEVMGR_SHOW_NONPRESENT_DEVICES=1,然后启动设备管理器,就可以在设备管理器中删除和重新配置这些设备了。2)、硬件设备类所在的注册表健值为:HKLMSYSTEMCurrentControlSetControlClassClass项下存放硬件设备类的配置信息。在Class项下的每个子项都代表一个设备类,子项的名称使用“唯一全局标识符(GUIS)”,这些标识符存放该设备类的配置信息。在每个类标识符下,还会有以4位数命名的子项,他们代表该设备类里的具体设备,其他的配置数据只应用于该具体设备。如网卡的设备类是4D36E972-E325-11CE-BFC1-08002BE10318,并假定我们网卡对应的4为数命名子项名为0005。其中HKLMSYSTEMCurrentControlSetClass4D36E972-E325-11CE-BFC1-08002BE103180005Linkage 中:Export:代表该设备在设备名字空间输出的设备名字。RootDevice:代表当前设备的GUID。中间层驱动这里有两个GUID,第一个是自己的GUID,第二个是该中间层驱动绑定的下层MINIPORT的GUID。UpperBind:代表上层绑定它的NDIS协议驱动或NDIS中间层驱动。当某个协议驱动绑定该MINIPORT设备时,则这个协议驱动的名字必须出现在UpperBind健值的字符串中,否则不能进行绑定。也就是说,UpperBind健值的字符串决定了那个协议驱动(当然也包括中间层驱动注册的协议)和当前的MINIPORT设备绑定,即,它决定了NDIS的上下层绑定关系。注:一般添加中间层驱动后,中间层驱动只插入到真是网卡和相应协议中间,不会插入到虚拟网卡(如安装虚拟机后虚拟出来的网卡设备)和相应协议中间。3)、驱动程序所在的注册表健值为:HKLMSYSTEMCurrentControlSetServicesENUM子项通常如果某个服务下存在ENUM子项,表明该服务是用来控制某个设备或者设备交互的,它的下面存放该设备的实例。用户不要去试图修改该子项的内容,因为每次系统启动时,都会重写该子项的内容。LINKAGE子项 值项Bind存放该协议所在绑定栈的最低层小端口设备实例(即MINIPORT)。 值项Export存放该服务必须访问的对象,该对象必须已经安装在系统中,并且该服务能够使用。 值项Route指定子项Linkage从那里获取绑定数据。Parameters Adapters子项这里,我们只解释中间层驱动中该子项的意义。为此,我们假设当前我们讨论的HKLMSYSTEMCurrentControlSetServicesXXXX中的XXXX为中间层驱动。对于中间层驱动,该子项下含有一个子项,是以我们当前中间层驱动绑定的下层MINIPORT设备的GUID命名的,在我的系统中,健值如下:102454C2-9DB3-42A1-B4CF-6A8B67A516C0在102454C2-9DB3-42A1-B4CF-6A8B67A516C0子项有个健,名称为UpperBindings,该健的健值是当前中间层驱动的MINIPORT设备名称,在我的系统中为如下健值:Device 5BF5A311-13E4-4746-8865-339DDD6C73AF(2)中间层驱动在我们的函数NDIS_PROTOCOL_CHARACTERISTICS- BindAdapterHandler()中,会调用一系列函数(如NdisOpenProtocolConfiguration、NdisReadConfiguration)来访问注册表,其实都是访问ParametersAdapters102454C2-9DB3-42A1-B4CF-6A8B67A516C0子项。注意,函数NDIS_PROTOCOL_CHARACTERISTICS- BindAdapterHandler()的倒数第二个参数是SystemSpecific1,如果我们安装的是XPASSTHRU,则其具体指的是如下字符串:xfilterParametersAdapters102454C2-9DB3-42A1-B4CF-6A8B67A516C0其中xfilter 是XPASSTHRU的,而102454C2-9DB3-42A1-B4CF-6A8B67A516C0在不同的系统中不同。函数NdisOpenProtocolConfiguration()其实只是构造一个查询注册表的RTL_QUERY_REGISTRY_TABLE结构(该结构在利用函数RtlQueryRegistryValues()查询注册表是使用)。并将这个结构封装到NDIS_WRAPPER_CONFIGURATION_HANDLE结构中,然后作为NdisOpenProtocolConfiguration()的第二个参数返回。其实NdisOpenProtocolConfiguration()构造的RTL_QUERY_REGISTRY_TABLE结构的含义也就是查询HKLMSYSTEMCurrentControlSetServices xfilterParametersAdapters102454C2-9DB3-42A1-B4CF-6A8B67A516C0下的健值(xfilter 会随着安装不同的中间层驱动而不同,102454C2-9DB3-42A1-B4CF-6A8B67A516C0在不同的系统中不同,下面均省略这些注释)。函数NdisReadConfiguration()有两个作用,它首先修改在函数NdisOpenProtocolConfiguration()构造的RTL_QUERY_REGISTRY_TABLE结构。也就是在查询HKLMSYSTEMCurrentControlSetServices xfilterParametersAdapters102454C2-9DB3-42A1-B4CF-6A8B67A516C0的基础上加上了一个健,将其变成HKLMSYSTEMCurrentControlSetServices xfilterParametersAdapters102454C2-9DB3-42A1-B4CF-6A8B67A516C0UpperBindings。然后函数NdisReadConfiguration()会调用函数RtlQueryRegistryValues()查询新构造的这个注册表,并将结果存储在调用函数NdisReadConfiguration()时的第二个参数中。在我的系统中,RtlQueryRegistryValues()读出的这个新构造的这个注册表的健值是:Device 5BF5A311-13E4-4746-8865-339DDD6C73AF(后面我们称为RESULT1),它其实是我们注册的中间层驱动(XPASSTHRU)的设备输出(其构造是DeviceGUID)。其实我们读出的这个中间层驱动(XPASSTHRU)的设备(即我们刚才读出的那个健值RESULT1)只在后面的函数NdisIMInitializeDeviceInstanceEx()中才用得着,并且RESULT1是作为函数NdisIMInitializeDeviceInstanceEx()的第二个参数的。这里有个地方让人感到迷惑,即在函数BindAdapterHandler()我们一旦调用了函数NdisOpenAdapter()绑定了一个下层的MINIPORT,为什么还要调用函数NdisIMInitializeDeviceInstanceEx()初始化我们中间层驱动自己的MINIPORT(因为函数NdisIMInitializeDeviceInstanceEx()的参数是RESULT1,而RESULT1代表我们中间层驱动的MINIPORT)。为了解释这个原因,我们先做如下假设。PROT-IMPROT-TCPIPNDIS_OPEN_BLOCK2NDIS_OPEN_BLOCK1MINIPORT-IMMINIPORT-NIC我们假设我们系统安装了一个中间层驱动(假设为XPASSTRHU),在上图中,PROT-IM和MINIPORT-IM分别代表我们中间层驱动的协议驱动程序和小端口驱动程序,PROT-TCPIP代表真正的协议驱动程序,MINIPORT-NIC代表真是网卡的小端口驱动程序。当PROT-TCPIP需要发送数据时,会调用函数NdisSend(),其实它会调用MINIPORT-IM中的发送数据函数,但是MINIPORT-IM和MINIPORT-NIC没联系,按照常规是不能发送数据到MINIPORT-NIC的。但是我们可以看到PROT-IM是可以和MINIPORT-NIC互相发送数据的,所以我们必须将MINIPORT-IM和PROT-IM联系起来。另外当MINIPORT-NIC需要将数据提交给PROT-TCPIP时,只能首先将数据提交给PROT-IM,PROT-IM也只能通过MINIPORT-IM才能和PROT-TCPIP联系起来。所以必须将PROT-IM和MINIPORT-IM联系起来。有人说这两个东西都是我们中间层驱动注册得,难道还联系不起来吗?不错,但是不管怎样你都得通过你得代码才能将他们联系起来呀!下面我们就介绍联系得方法。我们以XPASSTHRU为例,在其函数ProtocolBindAdapter()中,先分配了一个ADAPT结构(这个结构是自己定义的,可根据用户的需要定义)。当调用函数ProtocolBindAdapter()调用函数NdisOpenAdapter()进行绑定时,是以&Adapt-BindingHandle作为函数NdisOpenAdapter()的第三个参数的,这样Adapt-BindingHandle就指向了NDIS_OPEN_BLOCK1(注意,调用函数NdisOpenAdapter()时的第三个参数会返回指向绑定以后的NDIS_OPEN_BLOCK指针)。然后函数ProtocolBindAdapter()会调用函数NdisIMInitializeDeviceInstanceEx(),该函数会进一步调用XPASSTHRU的NDIS_MINIPORT_CHARACTERISTICS-InitializeHandler()函数。上面我们讨论过,NdisIMInitializeDeviceInstanceEx()中的第二个参数就是XPASSTHRU注册的小端口驱动的设备实例(即上面的RESULT1)。在函数NdisIMInitializeDeviceInstanceEx()中会根据设备名称(RESULT1),找到对应的MINIPORT结构,并将其指针作为参数传递给NDIS_MINIPORT_CHARACTERISTICS-InitializeHandler()函数(以后简称InitializeHandler()函数)。在InitializeHandler()函数中,会进一步将MINIPORT结构指针赋值给ADAPT-MiniportHandle(ADAPT就是上面在函数ProtocolBindAdapter()中分配的那个结构)。这样数据结构ADAPT中就含有了两个指针,一个指向NDIS_OPEN_BLOCK1,另一个指向MINIPORT-IM,而NDIS_OPEN_BLOCK1和PROT-IM是密切联系的,所以ADAPT就将PROT-IM和MINIPORT-IM紧密的联系起来了。另外注意,NDIS_MINIPORT_BLOCK-DeviceContext是指向我们的ADAPT结构的,这个赋值在函数NdisIMInitializeDeviceInstanceEx()中完成。上面谈到了也是在函数NdisIMInitializeDeviceInstanceEx()中完成了从ADAPT- MiniportHandle到MINIPORT的绑定,所以在函数NdisIMInitializeDeviceInstanceEx()中完成了ADAPT和MINIPORT的互相连接(即指针互相指向)。函数InitializeHandler()中可以利用句柄MINIPORT的句柄得到我们的ADAPT结构,具体实现这个功能的函数是NdisIMGetDeviceContext(),这个函数的参数是个NDIS_HANDLE类型,但是在该函数内部,会将这个参数转换成NDIS_MINIPORT_BLOCK结构,并返回NDIS_MINIPORT_BLOCK-DeviceContext。在函数NdisOpenAdapter()中,除了上面提到的完成了由Adapt-BindingHandle到NDIS_O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度电焊工施工现场安全管理合同规范
- 2025年度理财代客服务亏损赔偿合同
- 海南省琼海市2025年上半年公开招聘村务工作者试题含答案分析
- 2025版企事业单位食堂食材供应合同范本
- 2025版供应链金融数据保密及风险评估服务协议合同
- 2025年度稻谷种植技术交流与推广合同
- 2025版共有产权住房买卖合同下载
- 2025年拆迁项目风险评估与居间代理服务协议
- 贵州省黄平县2025年上半年事业单位公开遴选试题含答案分析
- 2025版商场展位装修及设备采购合同
- 2025年交社保免责协议书
- 2025-2026学年北师大版小学数学六年级上册教学计划及进度表
- 语文开学第一课课件2025-2026学年统编版语文七年级上册
- 2025年军队文职招聘-军队文职技能岗-军队文职招聘(电工)历年参考题库含答案解析(5套)
- (2025年标准)签夫妻忠诚协议书
- 2025年宁夏中考数学试卷试题真题(含答案详解)
- 肿瘤重点专科汇报
- 2024年杭州市公务员考试行测真题及完整答案详解一套
- 2025 八项规定应知应会100题题库及参考答案详解(综合题)
- 单位保安执勤方案(3篇)
- 二三轮车安全知识培训课件
评论
0/150
提交评论