阅读:2172回复:14
为什么我的IRP_MJ_DEVICE_CONTROL中的IOCTL_xxxx识别不了?
#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)) { ...... } ------------------------------------------------------------ 到底这是怎么一回事? |
|
沙发#
发布于:2002-04-09 14:24
这个问题我也遇到过
困扰了我好久,后来发现是系统的一个bug 你试试在winnt.h中查找FILE_ALL_ACCESS的定义,找到后把最后的 1FF改成3FF,或许就好了。 |
|
|
板凳#
发布于:2002-04-09 14:29
2 jame.z
你的设备是Unknown类的设备吗? 试试把你的0x800改成0x801 2 zydcat 能随便改系统的头文件??? |
|
|
地板#
发布于:2002-04-09 14:49
我的就是这样改好的,微软也不是不会犯错误,
试试吧,不行再改回来.我们再想办法. |
|
|
地下室#
发布于:2002-04-09 14:59
谢谢兄弟们给我这些意见。
1)我在IoCreateDevice中把类型也定义成了FILE_DEVICE_UNKNOWN。 2)我把CTL_CODE的0x800,改成了0x900(驱动和应用都改了),编译调试也不行。 3)自定义DeviceIoControl的程序我也写过了很多次,今天我只是按平时的写法,但是今天就出现问题,怎么检查也发现不了错误。 ----------------------------------------------------------- 我快晕过去了~~~~:(~~~~~ |
|
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去编译你的用户态程序,绝对不会出现这样的问题。 |
|
|
6楼#
发布于:2002-04-09 15:14
对,他们的定义有出入,我先试试~~~分数等一会给你。
谢谢了,老兄。 不过,我还是有个问题:怎么我以前也是定义成FILE_ALL_ACCESS但是也行呢? |
|
7楼#
发布于:2002-04-09 15:25
那把你现在收到的Io Control Code打印出来看收到了什么玩意儿
|
|
|
8楼#
发布于:2002-04-09 15:29
呵呵~~~果然~~~搞定了~~~
成功输出分支,zydcat果然厉害,这样的问题都给发现了:) 谢谢你。 |
|
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 |
|
|
10楼#
发布于:2002-04-09 15:32
不客气,谈不上厉害,只是碰巧遇到过而已,:)
|
|
|
11楼#
发布于:2002-04-09 15:38
我知道为什么今次写和以前不一样,我现在的VC是专业版的,以前的VC是企业版的。
|
|
12楼#
发布于:2002-04-09 15:41
斑竹,我的问题已经解决了~~~
|
|
13楼#
发布于:2002-04-09 15:43
发现问题就好,以后我也得注意。微软也会马虎,受罪的是我们。
|
|
|
14楼#
发布于:2002-04-09 15:50
真的,如果不说,我真的不会认为开发工具也有这么恐怖的BUG,这个东西可能会把我搞死~~~~以后遇到问题,检查不出错误,就说系统有毛病:)
|
|