阅读:1499回复:3
请问关于过滤驱动的问题?
请问各位大侠,本人由于工作需要编写一个设备下层的过滤驱动,请问用"代码"还是用"INF文件"决定过滤驱动的层次位于上层还是下层.详细如何做?
十分感谢你们的回答~ |
|
沙发#
发布于:2007-12-13 19:27
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2007-12-13 21:33
非常感谢你(tracera)的回答,但我未找到任何有关,关于过滤驱动层次的文章,
我要表达的是: 例如,我要过滤一个FDO发往下层的IRP,那我是不是应该将我的驱动挂到那个FDO的下层? 我要问的是,怎样才能把我的过滤驱动挂到那个FDO的下层,上次看过有些文章,挂到上层可以用IoAttachDeviceToDeviceStack,但怎么决定把我的过滤驱动放到下层我仍然不清楚, 可否再具体指点一下? |
|
地板#
发布于:2008-01-12 15:01
不知道你的问题解答了吗?看看下面,再看看Programming the Microsoft Windows Driver Model ,第一版有中文,大概第九章,第二版只有英文.
本文采用对磁盘驱动器进行过滤的方法实现USB存储设备单向控制。以DDK中的filter为原形,采用标准的WDM过滤,拦截所有的对USB存储设备的写操作,实现了U盘的单向控制。过滤器驱动程序是可选择的驱动程序,给设备增加值或修改设备的行为。过滤器驱动程序能服务于一个或多个设备。顶层过滤器驱动程序典型地为一设备提供增值的特征,低层过滤器驱动程序典型地修改设备硬件的行为。所以本文选择使用低层设备过滤器驱动程序,监视和修改磁盘驱动器的I/O请求。 2.1 驱动程序基本结构 一个WDM 驱动程序的基本结构包括一组必要的系统定义的标准驱动程序函数,加上一些可选的标准函数与内部函数,这取决于驱动程序的类型和下层设备。所有的驱动程序,不管它们在附属驱动程序链中所处的层,都必须有一组基本标准函数以处理IRP。一个驱动程序是否必须执行附加标准函数取决于该驱动程序的类型和下层设备,是控制一个物理设备的驱动程序,还是在一个物理设备驱动程序之上的驱动程序,也取决于下层物理设备的属性。控制物理设备的最低层驱动程序比较高层驱动程序拥有更多要求的函数,较高层驱动程序一般传送IRP给较低层驱动程序处理。 下面列出了本驱动程序所需要的标准驱动程序函数, (1)DriveEntry:初始化驱动程序并设置其他标准函数的入口点 当驱动程序的DriverEntry函数被调用,它直接在驱动程序对象中设置Dispatch、和Unload入口点,如下所示: DriverObject->MajorFunction[IRP_NJ_xxx]=DispatchXxx; : : DriverObject->MajorFunction[IRP_NJ_yyy]=DispatchYyy; : : DriverObject->DriverUnload=Unload; 在驱动程序对象内的DriverExtension中,设置它的AddDevice函数的入口点,如下: DriverObject->DriverExtension->AddDevice=DDAddDevice;驱动程序能定义若干Dispatch入口点,但是它只能在其驱动程序对象中定义一个AddDevice入口点,和一个Unload入口点。 (2)AddDevice:创建设备对象,在DriverObject-> DriverExtension->AddDevice (3)Dispatch:至少一个Dispatch入口点,用一个或多个主要功能编码处理IRP,以得到请求PnP、电源、和I/O操作的IRP。 (4)Unload:如果驱动程序能动态地被装载和/或者替换,还需要一个Unload入口点,从而可以释放任何系统资源,诸如驱动程序已分配的系统对象或者内存。 2.2 驱动程序的实现 (1)为设备定义 GUID。驱动程序使用设备名和GUID(globally unique identifiers)来标识不同的物理、逻辑或虚拟设备。PnP驱动程序注册并激活一个与GUID连接的设备接口,应用程序和其他系统组件可以通过接口对设备进行I/O请求和控制。WDM过滤驱动禁止给它们的设备对象命名,所以只要为设备定义 GUID。 (2)为驱动程序函数选择名字。在每个驱动程序中都要包含标准的驱动程序函数,因此使用一套区别于其他驱动程序的函数命名机制,会使程序更容易开发、调试和测试。 (3)编写一个为AddDevice、DispatchPnP、DispatchPower和DispatchCreate函数设置入口点的DriverEntry函数。 (4)编写一个完成下面内容的AddDevice函数: ①调用IoCreateDevice创建一个独立设备对象(如何设置一个设备对象见第3章)。 ②调用IoAttachDeviceToDeviceStack把它自己加入设备栈,填写PDEVICE_EXTENSION。 ③调用IoRegisterDeviceInterface为它的设备暴露一个接口。暴露的接口为访问该设备的应用程序提供了途径。 ④调用IoSetDeviceInterfaceState以激活它先前注册的接口。 这样完成以后,过滤设备就可以在DeviceTree中看到。 (5)为IRP_MJ_PNP请求编写一个基本DispatchPnP函数。该DispatchPnP函数必须准备处理具体的PnP IRP。 (6)为IRP_MJ_POWER编写一个基本DispatchPower函数。 (7)为IRP_MJ_CREATE请求编写一个基本Dispatch Create函数。 (8)拦截相应的IRP请求。 (9)为I/O控制请求编写一个基本DispatchDevCtrl函数,与应用程序进行通讯,处理具体的控制请求。 |
|