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。