jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2172回复:14

为什么我的IRP_MJ_DEVICE_CONTROL中的IOCTL_xxxx识别不了?

楼主#
更多 发布于:2002-04-09 14:13
#include <wdm.h>

#define IOCTL_MY_CTLCODE CTL_CODE\\
 (FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ALL_ACCESS)

...

///////Dispatch Routine For IRP_MJ_DEVICE_CONTROL

pSL = IoGetCurrentIrpStackLocation(Irp);
switch(pSL->Parameters.DeviceIoControl.IoControlCode)
{
    case IOCTL_MY_CTLCODE:
        {
            .....
        }break;
    default:
        {
            .....
        }break;
}

我在各个switch分支中打印出信息,发现当我在应用程序中利用
DeviceIoControl函数向我的驱动发送IOCTL_MY_CTLCODE时,根本就没有进去那个分支,反而进去了DEFAULT分支。

我的应用程序用的CTLCODE是从驱动的CTLCODE定义直接拷过来的,
可以确保一模一样,而且确认了其他CTLCODE也确认不了,都是直接进入DEFUAL分支。

应用的代码为:
  if (DeviceIoControl(hDev,IOCTL_MY_CTLCODE,NULL,0,NULL,0,
      &dwRet,NULL))
  {
     ......
  }

------------------------------------------------------------
到底这是怎么一回事?
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-09 14:24
这个问题我也遇到过
困扰了我好久,后来发现是系统的一个bug
你试试在winnt.h中查找FILE_ALL_ACCESS的定义,找到后把最后的
1FF改成3FF,或许就好了。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-09 14:29
2 jame.z
你的设备是Unknown类的设备吗?
试试把你的0x800改成0x801

2 zydcat
能随便改系统的头文件???
Go,go ahead
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-09 14:49
我的就是这样改好的,微软也不是不会犯错误,
试试吧,不行再改回来.我们再想办法.
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-09 14:59
谢谢兄弟们给我这些意见。
1)我在IoCreateDevice中把类型也定义成了FILE_DEVICE_UNKNOWN。
2)我把CTL_CODE的0x800,改成了0x900(驱动和应用都改了),编译调试也不行。
3)自定义DeviceIoControl的程序我也写过了很多次,今天我只是按平时的写法,但是今天就出现问题,怎么检查也发现不了错误。
-----------------------------------------------------------
我快晕过去了~~~~:(~~~~~
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-09 15:08
sorry
刚才有点着急,说错了,
应该将vc6目录下的winnt.h文件中的FILE_ALL_ACCESS的定义中的3FF改为1FF,然后重新编译你的用户态程序,IOCTL码就不会传错了。
原因是这样的,在vc6 的 include子目录里的winnt中将FILE_ALL_ACCESS定义为:
#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
而在ddk中的winnt.h却是:
#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
所以由于定义不同,引起了问题。
这好像是vc6的问题,如果不信,你可以使用vc5去编译你的用户态程序,绝对不会出现这样的问题。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-09 15:14
对,他们的定义有出入,我先试试~~~分数等一会给你。
谢谢了,老兄。
不过,我还是有个问题:怎么我以前也是定义成FILE_ALL_ACCESS但是也行呢?
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-09 15:25
那把你现在收到的Io Control Code打印出来看收到了什么玩意儿
Go,go ahead
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-09 15:29
呵呵~~~果然~~~搞定了~~~
成功输出分支,zydcat果然厉害,这样的问题都给发现了:)
谢谢你。
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-09 15:31
建议使用FILE_ANY_ACCESS



#define USBDRIVER_IOCTL_INDEX  0x0000

#define IOCTL_USBDRIVER_GET_DEVICE_DESCRIPTOR     CTL_CODE(FILE_DEVICE_UNKNOWN,  \\
USBDRIVER_IOCTL_INDEX,\\
METHOD_BUFFERED,  \\
FILE_ANY_ACCESS)

以后定义USBDRIVER_IOCTL_INDEX+1,+2,+3

犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-09 15:32
不客气,谈不上厉害,只是碰巧遇到过而已,:)
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-09 15:38
我知道为什么今次写和以前不一样,我现在的VC是专业版的,以前的VC是企业版的。
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-09 15:41
斑竹,我的问题已经解决了~~~
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-09 15:43
发现问题就好,以后我也得注意。微软也会马虎,受罪的是我们。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-09 15:50
真的,如果不说,我真的不会认为开发工具也有这么恐怖的BUG,这个东西可能会把我搞死~~~~以后遇到问题,检查不出错误,就说系统有毛病:)
游客

返回顶部