我同一个驱动中创建了两个设备对象,都使用了同一个派遣函数 ,形成了一个设备堆栈 A和B,B在最上层是栈顶, 当IRP 传来的时候 ,IRP最先到设备堆栈的栈顶B,
我有个疑问 当应用程序如果是访问A设备,那么IRP 最先到达的是B 设备,那么此时派遣函数 DispatchRoutine 的 PDEVICE_OBJECT DeviceObject 是 目标设备A 的设备对象,还是 栈顶B的设备对象呢,我的目标设备是A,IRP 访问时候中有记录目标设备的(应用程序需要访问的) 数据结构吗
NTSTATUS DispatchRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
}
在a层device_object就是a的device_object,
在b层device_object就是b的device_object,
当你创建b时使用IoAttachDeviceToDeviceStack将b添加到a时,返回值就是a,a的device_object你要自己保存起来,
当b向下传递irp你要把先前保存的a取出来在使用IoCallDriver向下传递
有的
有的
WDM(Windows Driver Model)是一种驱动程序模型,它是微软开发的一种用于在Windows操作系统中编写设备驱动程序的标准模型。WDM 设备栈是指 Windows 操作系统中的设备管理层次结构,它包括了设备驱动程序、设备树和系统服务,它们一起协同工作,完成设备的管理和控制。
WDM 设备栈中包含了各种设备驱动程序,这些驱动程序负责与硬件设备进行打交道,让操作系统能够识别和控制硬件设备。设备驱动程序一般包括了三个部分:设备对象、驱动程序和I/O 管理对象。设备对象代表了硬件设备,驱动程序则是控制设备的程序,I/O 管理对象则是负责处理输入输出(I/O)操作的对象。
在 WDM 设备栈中,设备树是用来管理硬件设备的,它包含了计算机中所有硬件设备的信息,而且每个设备都有一个唯一的设备名称和设备标识符。设备树还包括了设备驱动程序和设备对象,它们共同组成了设备层次结构。在设备树中,每个设备都可以有多个子设备,这些子设备可以是物理设备或者虚拟设备。
除了设备驱动程序和设备树之外,WDM 设备栈还包含了系统服务。系统服务是计算机中运行着的程序,它们提供了一些基本的功能,如安全性、网络和文件系统等。系统服务可以通过设备驱动程序和设备对象来访问和控制硬件设备。
总的来说,WDM 设备栈提供了一套用于管理和控制硬件设备的标准模型。在 WDM 设备栈中,设备驱动程序、设备树和系统服务共同协作,让操作系统能够识别和控制硬件设备。设备驱动程序是 WDM 设备栈中的核心组件,它们是与硬件设备进行交互的程序。设备树是用来管理硬件设备的,它包含了计算机中所有硬件设备的信息。系统服务则提供了一些基本的功能,如安全性、网络和文件系统等。这些组件共同构成了 WDM 设备栈,让操作系统能够更好地管理和使用硬件设备。
WDM是Windows Driver Model的缩写,是Windows操作系统中的一种设备驱动程序模型。WDM设备栈指的就是在Windows操作系统中,用于管理设备驱动程序的一种层次结构。在WDM设备栈中,每个设备驱动程序都被分配到不同的层次,形成了一种从下到上的层级结构,最终形成一个完整的设备驱动程序堆栈。下面详细讲解WDM设备栈的组成、作用以及使用。
在Windows操作系统中,每个设备都需要一个驱动程序来控制它的操作。在WDM设备栈中,设备驱动程序被分为四个层次:
(1) 传输层:该层次负责管理设备之间的物理连接,例如USB或PCI总线。在传输层中,设备驱动程序通常是一个内核模式驱动程序。
(2) 总线层:该层次负责管理总线系统,例如USB、PCI、SATA等。在总线层中,设备驱动程序也是一个内核模式驱动程序。
(3) 设备层:该层次负责管理设备的硬件资源,例如设备的寄存器、中断和DMA。在设备层中,设备驱动程序可以是一个内核模式驱动程序或用户模式驱动程序。
(4) 上层驱动程序:该层次负责管理设备的应用程序接口,例如设备的API、GUI等。在上层驱动程序中,设备驱动程序通常是用户模式驱动程序。
WDM设备栈的主要作用是为设备提供驱动程序支持。通过层次结构的方式,WDM设备栈可以对设备进行分层管理,使得设备驱动程序能够更加专注于自己的任务,同时也更容易维护和升级。另外,WDM设备栈还可以提供统一的设备接口,使得应用程序可以更方便地与设备进行交互。
在Windows操作系统中,设备驱动程序通常是使用C或C++编写的。如果想要编写一个WDM设备驱动程序,需要掌握以下几个方面的知识:
(1) Windows内核编程:WDM驱动程序运行在Windows的内核态中,因此需要掌握Windows内核编程的相关知识。
(2) 设备驱动程序开发:需要掌握设备驱动程序的开发基础知识,例如如何访问设备的操作接口、如何处理设备的中断等。
(3) 内核调试:WDM驱动程序运行在Windows内核态中,因此需要掌握如何进行内核调试的技能。
(4) Windows设备接口:WDM驱动程序需要使用Windows设备接口进行与设备的交互,因此需要掌握Windows设备接口的相关知识。
总之,WDM设备栈是Windows操作系统中一个非常重要的组件,它为设备驱动程序提供了一种分层管理的方式,使驱动程序更加专注于自己的任务。如果想要编写一个WDM设备驱动程序,需要掌握Windows内核编程、设备驱动程序开发、内核调试和Windows设备接口等相关知识。
有的
在 WDM 设备栈中,当派遣函数 DispatchRoutine 被调用时,参数 PDEVICE_OBJECT DeviceObject 表示的是目标设备的设备对象,而不是栈顶设备对象。在派遣函数中,可以通过 DeviceObject 参数来确定当前操作针对的是哪个设备。
关于 IRP 访问时是否有记录目标设备的数据结构,通常情况下是没有的。IRP 是 I/O 请求数据结构,用于在设备栈中传递和管理 I/O 请求。IRP 中包含了与请求相关的信息,例如请求的类型、数据缓冲区、IO_STACK_LOCATION 等等。但 IRP 并没有直接记录目标设备的信息。
在 WDM 设备栈中,目标设备的信息通常通过 IRP 的 IO_STACK_LOCATION 结构中的 DeviceObject 字段来确定。
每个设备对象都有一个指向下一个设备对象的指针,IRP是按照设备堆栈的顺序从上到下传递,IRP到达栈顶B时,会调用B的派遣函数,并且携带参数,是具有指向性的