设为首页收藏本站

美丽的网站-英华家电维修论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 346|回复: 0
打印 上一主题 下一主题

设备绑定的内核API

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-11 11:31:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
行过滤的最主要的方法是对一个设备对象(DevICe Object)进行绑定。读者可以想象, Windows 系统之所以可以运作,是因为 Windows 中已经存在许多提供了各种功能的设备对象。这些设备对象接收请求,并完成实际硬件的功能。  我们可以首先认为:一个真实的设备对应一个设备对象(虽然实际对应关系可能复杂得多)。通过编程可以生成一个虚拟的设备对象,并“绑定”(Attach)在一个真实的设备上。一旦绑定,则本来操作系统发送给真实设备的请求,就会首先发送到这个虚拟设备。  下面结合代码进行讲解。读者可能希望编译执行这些代码,驱动的初学者请先阅读本书第1章,以便学会如何安装开发环境、编译代码和调试程序。  在WDK中,有多个内核API能实现绑定功能。下面是其中一个函数的原型:  NTSTATUS  IoAttachDevice(  IN PDEVICE_OBJECT SourceDevice,  IN PUNICODE_STRING TargetDevice,  OUT PDEVICE_OBJECT *AttachedDevice  );  IoAttachDevice参数如下:  SourceDevice是调用者生成的用来过滤的虚拟设备;而TargetDevice是要被绑定的目标设备。请注意这里的TargetDevice并不是一个PDEVICE_OBJECT(DEVICE_OBJECT是设备对象的数据结构,以P开头的是其指针),而是一个字符串(在驱动开发中字符串用UNICODE_STRING来表示)。实际上,这个字符串是要被绑定的设备的名字。  Windows中许多设备对象是有名字的,但是并不是所有的设备对象都有名字。必须是有名字的设备,才能用这个内核API进行绑定。  这里有一个疑问:假设这个函数绑定一个名字所对应的设备,那么如果这个设备已经被其他的设备绑定了,会怎么样呢?  如果一个设备被其他设备绑定,它们在一起的一组设备,被称为设备栈(之所以称为栈,是由于和请求的传递方式有关)。实际上,IoAttachDevice总是会绑定设备栈上最顶层的那个设备。  AttachedDevice是一个用来返回的指针的指针。绑定成功后,被绑定的设备指针被返回到这个地址。  下面这个例子绑定串口1。之所以这里绑定很方便,是因为在Windows中,串口设备是有固定名字的。第一个串口名字为“\Device\Serial0”,第二个为“\Device\Serial1”,依次类推。请注意实际编码时C语言中的“\”要写成“\\”。  UNICODE_STRING com_name = RLT_CONSTANT_STRING(L" \\Device\\Serial0 ");  NTSTATUS status = IoAttachDevice(  com_fiLTEr_device, // 生成的过滤设备  &com_device_name, // 串口的设备名  &attached_device); // 被绑定的设备指针返回到这里  当然,试图执行这段代码的读者可能会发现,这里没有提供如何生成一个过滤设备的代码。在接下来的第二个API介绍之后,读者会看到完整的例子。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|粤ICP备13038386号|粤ICP备13038386号|美丽的网站-英华家电维修论坛 ( 粤ICP备13038386号 )     站长邮箱 505966338@qq.com

GMT+8, 2025-5-5 02:35 , Processed in 0.155018 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表