阅读:3041回复:16
过滤驱动程序引发的问题
最近工作很忙,抽空来看看。
我发现一些过滤驱动程序存在下面的问题: 无论给它登记一个接口还是建立一个符号连接都无法打开它的句柄, 错误是“连接到系统的设备没有发挥作用” 自然无法用应用程序来改变它的参数了, 接口无法工作还可以理解,老式的符号连接应该是可以的呀, 它应该直接针对连接的设备对象去的。最后,只好另外建立一个命名的设备对象来负责与应用程序的接口了。 另外,一个驱动程序对象可以建立多个设备对象,这是毫无疑问的。 那么,如何在驱动程序内部与应用程序之间唯一的标示一个设备对象呢。我现在是一个命名设备对象控制与应用程序的接口。如果应用程序想更改一个设备对象(不是这个与应用程序接口的设备对象)的参数,该如何做呢,我想到了采用唯一的标示符,采用什么来标示呢。 想听听你们的意见,看看我的办法是不是很笨。 |
|
沙发#
发布于:2001-08-01 14:48
:o
我有点糊涂,你要过滤驱动的句柄干嘛呀? |
|
|
板凳#
发布于:2001-08-01 17:08
驱动程序得分层结构。
过滤驱动加载上了某个设备的设备栈后,对此设备操作的irp是一层一层往下传的,你的过滤驱动也能得到这些irp的(此时,过滤驱动是不需要符号连接)。 如果想给过滤驱动定义一个符号连接,让应用程序打开它,你可以这么干(这么干不好)(比如是键盘): UNICODE_STRING ntTargetDeviceName,ntDeviceName; PDEVICE_OBJECT pTargetDevObj,pDevObj ; PFILE_OBJECT pTargetFileObj; PDEVICE_OBJECT pNextDev; NTSTATUS status; RtlInitUnicodeString(&ntDeviceName,"L"\\Device\\KeyboardClass0""); status = IoGetDeviceObjectPointer( &ntTargetDeviceName, FILE_ALL_ACCESS, &pTargetFileObj, &pTargetDevObj ); RtlInitUnicodeString( &ntDeviceName, FILTER_NAME ); status = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), &ntDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj ); pNextDev = IoAttachDeviceToDeviceStack( pDevObj, pTargetDevObj ); 这样就可以了。 至于创建的设备唯一,也可以做到: IoCreateDevice()返回的status如果为STATUS_OBJECT_NAME_COLLISION则表示此设备名已经被使用。 |
|
地板#
发布于:2001-08-01 18:21
我认为你们误解了我的意思了。
实际上,这个过滤驱动程序位于HIDUSB与USB类驱动程序之间,是个 HID设备的Lower Filter。我需要根据用户的设定去决定驱动程序如何处理HIDUSB与USB类驱动程序之间的数据。因此,过滤驱动程序能与应用程序对话是必须的功能。 使用IoRegisterDeviceInterface建立一个接口后,“创建”IRP 会沿设备栈向下传,但在我上面的一些功能设备对象不见得会合作。 故过滤驱动程序会收不到IRP。对于过滤驱动程序的原则是自己不处理的IRP可以向下传,以表示自己的“透明”。对于功能设备对象则未必。 由于这个原因,我采用一个命名设备对象来专门处理用户的请求, 即通过它来完成在应用程序与过滤驱动设备对象之间传递参数。 如果系统中有多个这样的设备,那么,会有多个过滤设备对象在不同的设备堆栈中,当应用程序想更改某一个设备的参数时,它需要告诉 命名设备对象它想更改的过滤设备对象。那么,需要一个唯一的ID号,当应用程序使用时根据ID知道它在更改/获取哪个设备的参数, 当命名设备对象收到应用程序的请求后根据ID也可以知道应用程序 准备更改/获取哪个设备的参数。 IoCreateDevice成功返回就意味创建了一个唯一的设备对象。 |
|
地下室#
发布于:2001-08-02 05:28
我也正在做和你一样的fitler!
还没全做好, 我想 walter 的书里的方法应该可以用的。 我做的也要应用程序和他直接“对话”, 主要是 control panel. |
|
5楼#
发布于:2001-08-02 05:28
我也正在做和你一样的fitler!
还没全做好, 我想 walter 的书里的方法应该可以用的。 我做的也要应用程序和他直接“对话”, 主要是 control panel. 能否把你做的工程打包发给我参考一下? |
|
6楼#
发布于:2001-08-02 09:24
有事你说话,不过代码不会寄给你。
|
|
7楼#
发布于:2001-08-02 14:16
哦, 我已经差不多做好了。
有一个问题, 怎么方便的新建带URB 的 IRP? 那么多复杂的结构一个一个填太麻烦了, 还容易出错。 |
|
8楼#
发布于:2001-08-02 17:35
有构造URB的函数调用呀,构造好URB后,有多种构造IRP的方法的。
|
|
9楼#
发布于:2001-08-06 02:49
好, 我也碰到了你一样的问题, 接口和Symblelink 方式都不能通信。 CreateFile 出错(错误06:Path Not found)
不知道你有没有解决这个问题了? |
|
10楼#
发布于:2001-08-06 11:33
问题早已解决,上面我的办法说得很明白呀。
|
|
11楼#
发布于:2001-08-06 13:34
大家可不可以讨论一下,写一个stream.sys的uper filter有哪些关键问题需要注意?
|
|
|
12楼#
发布于:2001-08-06 13:43
我想了解ddk中的kbfltr与stream.sys的uper filter是否有较大的差别?
|
|
|
13楼#
发布于:2001-08-10 11:29
我又遇见了一件怪事。
在建立了命名设备对象后,我准备打开2000和NT中都有的BEEP服务以便在合适的时候使系统扬声器发声以告诉用户发生了一个事件。 我用的函数是IoGetDeviceObjectPointer,它是多么普通的函数呀。 现在出现了两种情况: 1。)如果在系统启动时,这个USB设备已经插好,那么函数调用返回 0xC0000034(Object Name not found),意思是对象名没有找到。 2。)如果在系统启动后,动态插入这个USB设备,那么函数调用返回 成功,一切工作正常。 |
|
14楼#
发布于:2001-08-11 18:54
不是明摆着, 你要用的另一个对象还没有加载吗?
|
|
15楼#
发布于:2001-08-12 09:51
那未必,
你看看Beep服务的StartType = 1,我的驱动程序的StartType = 3, 明显Beep的加载比较我的驱动程序早。另外,我以前的驱动程序有 StartType = 2 和StartType = 3的,都不会有这个问题。 你不信写个虚拟驱动试一试。 |
|
16楼#
发布于:2001-08-16 14:44
我发现Hidusb总是维持两个等待的读请求,有些奇怪。
在Chris Cant的《Writing Windows WDM Device Drivers》366页提到“我理解KbdHid.sys驱动程序总是试图为键盘保持两个等待的读请求:一个用于检测松开的键,另一个用于检测按下的键。”。由于HidUsb作为HID minidriver,从Win2000的输入结构上看,它为HID类 的键盘和鼠标都提供服务,是否因为KbdHid的原因导致HidUsb这样做呢?还是有其他的原因? |
|