IoAttachDeviceToDeviceStack作用详解
来源:互联网 发布:james blunt 知乎 编辑:程序博客网 时间:2024/06/06 17:06
【 在 savagelee (黯然销魂饭) 的大作中提到: 】
: Ntstatus Ezusb_PnpAddDevice(PDRIVER_OBJECT DriverObject,
: PDEVICE_OBJECT pdo1)
: {
: PDEVICE_OBJECT pdo2 = NULL;
: PDEVICE_EXTENSION pdx;
: ....
: ntStatus = IoCreateDevice(DriverObject,....., pdo2);
: pdx = pdo2->DeviceExtension;
: pdx->PhysicalDeviceObject pdo1;
: 下面这句
: pdx->StackDeviceObject = IoAttachDeviceToDeviceStack(pdo2, pdo1);
: }
: 其中PhysicalDeviceObject和StackDeviceObject是DEVICE_EXTENSION结构中的两个字段,
: 类型都是PDEVICE_OBJECT;
: 整个函数,Ezusb.....是DriverEntry中为AddDevice分配的例程
: 情况就是这些了,2个问题:
: 1、pdo1是哪儿传进来的?这是个usb添加设备函数,驱动程序中只是把这个函数指针
: 在DriverEntry中分配给了AddDevice项啊,到底是谁调用了这个函数呢
pdo1是系统传进来的,你的函数是系统在合适的时候调用的,这个就是Pnp管理器添加设备的时候调用的。
记住在内核态的驱动程序是和系统在一起工作的,在驱动程序的周围还有很多的系统组件,你需要的时候会调用它们,他们在需要的时候也会调用你的驱动程序。
: 2.IoAttachDeviceToDeiceStack(SourceDevice, TargetDevice)干什么了,本程序中
: 返回什么啊
: MSDN上说:IoAttachDeviceToDeviceStack attaches the caller’s device object to
: the highest device object in the chain and returns a pointer to the
: previously highest device object. I/O requests bound for the target device
: are routed first to the caller. 不太明白啊,本程序中谁是previously highest
: object,哪儿来的chain啊。
Windows是通过向目标Device传递IRP的方式进行I/O操作的,系统会把一个IRP传递给一个Driver来控制一个Device,这个Device处理完了IRP之后,可以把这个IRP传递给下一层的驱动程序,这样驱动程序就形成一个链。这个函数就是把SourceDevice放到TargetDevice所在的链的末端。
比如原来有一个Device A,在这个Device的上层有一个过滤驱动程序的设备Device B,
可以用这个图表示:
+---+
| B |
+---+
| A |
+---+
然后我们有一个新的Device C,用IoAttachDeviceToDeviceStack(C, A)之后,就把C放到了A所在的链的末端,如下:
+---+
| C |
+---+
| B |
+---+
| A |
+---+
同时返回B。
- IoAttachDeviceToDeviceStack作用详解
- IoAttachDevice;IoAttachDeviceToDeviceStack
- IoAttachDeviceToDeviceStack routine
- IoAttachDeviceToDeviceStack方法
- IoAttachDevice和IoAttachDeviceToDeviceStack 基础解说以及实现
- Hibernate包作用详解
- Hibernate包作用详解
- Hibernate包作用详解
- Hibernate包作用详解
- Hibernate包作用详解-
- Hibernate包作用详解
- Hibernate- 包作用详解
- Hibernate包作用详解
- Hibernate--包作用详解
- Hibernate包作用详解
- Hibernate包作用详解
- Hibernate包作用详解
- Hibernate包作用详解
- 怎么祭奠,不堪一击的爱情:伤感日志
- C# 创建window服务
- JAVA 类 IE浏览器前进、后退等功能操作
- word2003设置编号间距的方法
- UBI - Unsorted Block Images 概览
- IoAttachDeviceToDeviceStack作用详解
- 害我郁闷一天的利用调试状态关闭无效对象句柄而产生C08异常
- Microchip单片机 使用malloc()函数的注意事项
- Bluetooth sco audio是什么?
- Flex动态加载swc和swf中的class
- Windows编程之滚动条
- how to chase a girl
- 分析Android 根文件系统启动过程(init守护进程分析)
- 活动主题:人人都爱易电源——转发有礼