词条 | IoAttachDevice |
释义 | 通过编程可以生成一个虚拟的设备对象,并“绑定”(Attach)在一个真实的设备上。一旦绑定,则本来操作系统发送给真实设备 的请求,就会首先发送到这个虚拟设备。 在WDK中,有多个内核API能实现绑定功能。下面是其中一个函数的原型: NTSTATUS IoAttachDevice参数如下: SourceDevice是调用者生成的用来过滤的虚拟设备; TargetDevice是要被绑定的目标设备。请注意这里的TargetDevice并不是一个PDEVICE_OBJECT(DEVICE_OBJECT 是设备对象的数据结构,以P开头的是其指针),而是一个字符串(在驱动开发中字符串用UNICODE_STRING来表示)。实际上, 这个字符串是要被绑定的设备的名字。Windows中许多设备对象是有名字的,但是并不是所有的设备对象都有名字。必须是有名字 的设备,才能用这个内核API进行绑定。在Windows中,串口设备是有固定名字的。 这里有一个疑问:假设这个函数绑定一个名字所对应的设备,那么如果这个设备已经被其他的设备绑定了,会怎么样呢? 如果一个设备被其他设备绑定,它们在一起的一组设备,被称为设备栈(之所以称为栈,是由于和请求的传递方式有关)。实际上, IoAttachDevice总是会绑定设备栈上最顶层的那个设备。 AttachedDevice是一个用来返回的指针的指针。绑定成功后,被绑定的设备指针被返回到这个地址。 前面已经提到了并不是所有的设备都有设备名字,所以依靠IoAttachDevice无法绑定没有名字的设备。另外还有两个API:一个是 IoAttachDeviceToDeviceStack,另一个是IoAttachDeviceToDeviceStackSafe。这两个函数功能一样,都是根据设备对象的 指针(而不是名字)进行绑定;区别是IoAttachDeviceToDeviceStackSafe更加安全,而且只有在Windows 2000SP4和Windows XP 以上的系统中才有。一般都使用IoAttachDeviceToDeviceStackSafe,但当试图兼容较低版本的Windows 2000时, 应该使用IoAttachDeviceToDeviceStack。 NTSTATUS 在Window 2000下应该使用另外一个函数IoAttachDeviceToDeviceStack,这个函数除了缺少最后一个参数之外(实际上放到返回值里了), 其他的和IoAttachDeviceToDeviceStackSafe函数相同。 PDEVICE_OBJECT 这个函数返回了最终被绑定的设备指针,这也就导致了它不能返回一个明确的错误码。但是如果为NULL,则表示绑定失败了。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。