drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1574回复:6

版主请进. 如何通过GUID访问设备????

楼主#
更多 发布于:2003-02-19 10:36
我在用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.  

版主,请帮帮忙。 先谢了
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-19 13:35
filter和app打交道,一般是另外产生一个Control Device Object,专门负责和app沟通。只要注册symbolic link name即可,似乎没有见到对filter用guid的。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-19 21:13
可是,kbfilter好象本来就有一个GUID.
我就是想用那个GUID来控制驱动的.其实也不知道那个GUID是否真的有效。 不过,在注册表里不一是可以找到的,与kbfilter在同一个键里。

另. 请教如何产生另一个又control device object. 以及如何与app沟通. 能否讲得详细点。
rimrock
驱动小牛
驱动小牛
  • 注册日期2002-10-15
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-19 21:32
好像勇:IoRegisterDeviceInterface()。
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-22 12:45
rayyang2000
  请问怎样生成control device oject
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
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的方式是最安全的。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-03 17:28
非常感谢rayyang2000

我试一下
游客

返回顶部