阅读:1680回复:6
版主请进. 如何通过GUID访问设备????
我在用DS的kbfilter的例程, 并写了个用户模式的程序想访问kbfilter.
问题在,我用kbfilter的GUID能得到DEVICEPATH, 但无法使用createfile.我的用法如下; HANDLE hd = CreateFile( ifDetail->DevicePath,// 用GUID得到的设备路径 ACPI#.....{43819946-4910...} GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 运行到这儿, 就是ACCESS DINY. 版主,请帮帮忙。 先谢了 |
|
沙发#
发布于:2003-02-19 13:35
filter和app打交道,一般是另外产生一个Control Device Object,专门负责和app沟通。只要注册symbolic link name即可,似乎没有见到对filter用guid的。
|
|
|
板凳#
发布于:2003-02-19 21:13
可是,kbfilter好象本来就有一个GUID.
我就是想用那个GUID来控制驱动的.其实也不知道那个GUID是否真的有效。 不过,在注册表里不一是可以找到的,与kbfilter在同一个键里。 另. 请教如何产生另一个又control device object. 以及如何与app沟通. 能否讲得详细点。 |
|
地板#
发布于:2003-02-19 21:32
好像勇:IoRegisterDeviceInterface()。
|
|
地下室#
发布于:2003-02-22 12:45
rayyang2000
请问怎样生成control device oject |
|
5楼#
发布于:2003-02-22 15:09
没有做过hid,但有一些driver要提供guid给os。不知道kb的是不是也是这个目的。
你应该多看看WDM的架构资料,这样比较容易理解。尤其是device stack的概念。 所谓的control device object,就是用IoCreateDevice产生一个单独的DO,这个do不attach到任何stack里面,它和filter do是独立的。但因为它和filter do是由同一个driver产生的,所以在control do的irp处理过程中,很容易知道filter do的那些参数。 当app需要读取filter do的数据或者控制filter do做什么事情时,通过CreateFile和control do通讯,由control do再去控制filter do。 有一点切记:由于control do不在任何stack里面,因此它的下面没有任何do了。所以,所有的irp都必须被CompleteRequest,而不能再向下传,否则就bsod。 虽然对于2个do来说,所有的IRP handler都是同样的函数,但可以通过判断传进来的DeviceObject来判断到底是control do还是filter do。 有很多filter都用的这种技术,你因该自己找找sample。 之所以这样做,是因为filter是在一个stack里面,而有些类型的设备根本就不支持和app打交道。如果filter上面还有一个filter a,当filter a对IRP_MJ_CREATE返回ERROR的时候,APP根本没有机会和tiler接触。因此,control do的方式是最安全的。 |
|
|
6楼#
发布于:2003-03-03 17:28
非常感谢rayyang2000
我试一下 |
|