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

通过GUID,访问驱动. 但createfile总是失败. BLUE大侠 请进

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

版主,请帮帮忙。 先谢了


[编辑 -  2/26/03 by  drank]
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-19 11:07
我需要帮助.......................
petz
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2015-12-19
  • 粉丝0
  • 关注0
  • 积分-22276分
  • 威望15点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-19 11:24
用户被禁言,该主题自动屏蔽!
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-19 12:27
感谢zoujie 的帮忙.
我来仔细看看, 不过zoujie, 你能解释一下指定了FILE_DEVICE_SECURE_OPEN 的意义何在吗
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-19 13:53
    Recent security reviews in the Windows file systems team have pointed out that the FILE_SECURE_DEVICE_OPEN characteristic needs to be set for file system device objects that do not support naming. For example, a physical media file system typically creates a named device object.
This named device object is then, in turn, registered with the I/O Manager so that it will receive mount requests on devices of the specified type. Thus, the I/O Manager calls a FILE_DEVICE_CD_ROM_FILE_SYSTEM to mount devices of type
FILE_DEVICE_CD_ROM. Because these device objects do not support naming structure (that is, you do not open \\Cdfs\\Myfile, for example) they need to indicate this when they create their device objects by specifying the
FILE_SECURE_DEVICE_OPEN characteristic.
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-19 16:27
已经可以得到HANDLE了,
我把createfile中的desiredaccess 设定为generic_write之后就好了

但在接下来的调用deviceiocontrol中始终失败. 用的是一些我自己定义的IOCTL code.

请问为什么????
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-19 20:05
把你如何使用GUID能得到DEVICEPATH的代码也贴出来,好让我仔细分析一下,好吗?
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-19 21:34
谢谢blue;
  另,有看到说, 2000中的键盘鼠标驱动是系统独享的,应用程序不能打开. 这可能吗?????

请看代码:
////////////GUID的声明
DEFINE_GUID(Kbfilter_GUID, 0x43819946, 0xb8af, 0x4910,  0x9f, 0xde, 0xd2, 0x96, 0x25, 0x5c, 0x1c, 0x59 );

//////////////////IOCTL的声明
#define IOCTL_MaskSwitch_Require CTL_CODE(FILE_DEVICE_KEYBOARD, 0x1080, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_MaskSwitch_Cancel CTL_CODE(FILE_DEVICE_KEYBOARD, 0x1100, METHOD_NEITHER, FILE_ANY_ACCESS)


///////////通过GUID获得HANDLE的代码
HANDLE CKBMASKDlg::GetDeviceViaInterface( GUID* pGuid, DWORD instance)
{
  
// Get handle to relevant device information set
HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if(info==INVALID_HANDLE_VALUE)
{
printf(\"No HDEVINFO available for this GUID\\n\");
return NULL;
}

// Get interface data for the requested instance
SP_INTERFACE_DEVICE_DATA ifdata;
ifdata.cbSize = sizeof(ifdata);
if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata))
{
printf(\"No SP_INTERFACE_DEVICE_DATA available for this GUID instance\\n\");
SetupDiDestroyDeviceInfoList(info);
return NULL;
}

// Get size of symbolic link name
DWORD ReqLen;
SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
if( ifDetail==NULL)
{
SetupDiDestroyDeviceInfoList(info);
return NULL;
}

// Get symbolic link name
ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL))
{
SetupDiDestroyDeviceInfoList(info);
delete ifDetail;
return NULL;
}

printf(\"Symbolic link is %s\\n\",ifDetail->DevicePath);
// Open file
HANDLE rv = CreateFile( ifDetail->DevicePath,
GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if( rv==INVALID_HANDLE_VALUE)
{
rv = NULL;
ShowLastError(GetLastError());
MessageBox(\"Fail to get handle\",NULL,MB_OK);
}

delete ifDetail;
SetupDiDestroyDeviceInfoList(info);
return rv;
}

//////////////通过HANDLE实现控制的代码
void CKBMASKDlg::OnMr()
{
// TODO: Add your control notification handler code here
  HANDLE hKb = GetDeviceViaInterface((LPGUID)&Kbfilter_GUID,0);
  if (!hKb) return;
  if (!DeviceIoControl(hKb,IOCTL_MaskSwitch_Require,NULL,0,NULL,0,NULL,NULL))
  {
ShowLastError(GetLastError());
MessageBox(\"device io control failed\",NULL,MB_OK);  
  }
  CloseHandle(hKb);
}
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-21 11:32
go up
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-21 18:55
无人指点吗?
blue大侠, 跑哪儿去了
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-21 20:33
只能回答一个问题,鼠标键盘的确是独享的。
另外,最后GETLASTERROR显示的是什么?
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-21 22:31
getlasterror() 显示的是 access is denied
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2003-02-22 01:17
为什么不用si跟进去看看呢?
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-22 12:48
si, 我不会用,
还请arthurtu简要介绍一下. 我如何才能跟进去??
跟进去后看什么??
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2003-02-22 16:42
在你的IOCODE对应的函数或dispatch函数上下个断点,看看为什么会返回错误,是哪条语句。
先用symbol loader加载你的driver的symbol,translate。
softice,ctrl+d,sym看你的driver的sym,bpx在函数上下断点。
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-02-22 21:29
thks,arthurtu
我试一下先
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-02-24 23:06
楼主如果还不死心,看下面的摘录:

This is an example of a class of problems that lots of people have with
HID devices, to wit:

(1) Very hard to install a filter driver for a collection without
filtering everything in the class, because HIDCLASS essentially
instantiates the collection device object on the fly.

(2) Hard to get custom IOCTLs into such a filter because standard class
drivers routinely fail to pass them down. (That\'s the case you\'re
commenting on.)

(3) Very hard to get custom IOCTLs into a HID minidriver because (a)
HIDCLASS fails IRP_MJ_CREATE for a non-collection device object, and (b)
HIDCLASS fails non-standard IOCTLs without passing them to the
minidriver. The \"approved\" way of dealing with this is to define custom
feature \"reports\", which is pretty easy from the driver side. It\'s a
real pain from the application side, though, because it\'s very hard to
determine which collection you need to open in order to communicate with
your own driver.

Couldn\'t somebody at Microsoft try to solve these problems, or at least
come up with workarounds that us mortals can live with?

--
Walter Oney
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-02-25 11:23
to tjm:
  我只是想做一个可以在98和2000中都能使用的控制按键的过滤驱动. 不要把我吓倒了.
  
to all
  与键盘按键数据有关的是哪种 IRP. 我需要从IRP的完成例程还是从中断服务例程去获得按键数据?????

[编辑 -  2/25/03 by  drank]
yuri69
驱动小牛
驱动小牛
  • 注册日期2002-07-12
  • 最后登录2005-12-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-02-25 13:02
你最好别看 ddk 的filter,看看driverstudio的例程 kbfilter 吧。

它在里面做了两个device,一个是 filterControlDevice,用来与应用程序通讯。

另一个是keyBortdFilterDevice.用来hook 键盘的。 并且带有测试的应用程序。

位置在 example\\nt\\下面。


我不会停止对你的思念,就像呼吸一样,我不去特意的想,但是,只能屏息,而不可能停止
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-02-25 13:59
kbfilter不能在98下使用, 且我不知到如何能在应用程序中与kbfilter通信.
上一页
游客

返回顶部