阅读:2906回复:30
一个困惑了我一天的bug
我的应用主程序如下:
#include <stdio.h> #include <Windows.h> #include <winioctl.h> #include \"Addxy.h\" void main() { HANDLE hDevice; int z; xy *pxy; DWORD truesize; hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if(hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, \"Cannot load VXD, error = %ld\\n\", GetLastError()); exit(1); } pxy = new xy; pxy->x = 40; pxy->y = 80; if(!DeviceIoControl(hDevice, ADDXY, pxy, sizeof(xy), &z, sizeof(int), &truesize, NULL)) { fprintf(stderr, \"Failed to ADD. error = %d\\n\", GetLastError()); exit(1); } printf(\"%d + %d = %d\\n\", pxy->x, pxy->y, z); CloseHandle(hDevice); } Addxy.h头文件如下: #define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) struct xy { int x; int y; }; 运行时,出现如下错误: Failed to ADD. error = 87 请问这是为什嬷? |
|
最新喜欢:![]()
|
沙发#
发布于:2002-02-04 13:50
谢谢各位。知道正确就行了。
再次说声谢谢。 |
|
|
板凳#
发布于:2002-02-04 12:11
jiaxu,你的程序在我这里完全没有问题,能得到正确的结果,我除了把路径改成\\\\\\\\.\\\\d:\\\\driver~1\\\\apptovxd\\\\apptovxd.vxd外,没对你的程序做任何修改,正如楼上所说的,绝对路径名不能超过8字符,用你原来的路径我这里就不能打开VXD。而且我用\\\\\\\\.\\\\apptovxd.vxd这个路径也是可以的。
实在想不出你那里到底是什么问题。 另外,VTOOLSD自带的debugmonitor,是可以捕捉到dout输出的,例如: dout<<\"In VXD\"<<endl; 执行这句程序后debugmonitor就会显示In VXD。 |
|
地板#
发布于:2002-02-04 11:23
找不出问题
因为你们的程序在我这里都能通过,没有任何问题。 而且jiaxu的要好一些,因为你在 if (!DeviceIoControl(hDevice,ADDXY,pxy,0,&z,sizeof(int),0,NULL)) 里为输出buf指定了长度。(但这对于本程序无影响) 还有在我这里,无论相对路径还是绝对路径都可以。 但是如果是绝对路径的话,单个目录名要不超过8个字符 |
|
|
地下室#
发布于:2002-02-04 10:30
这是书上的例子,在我这没一点问题,把你的邮箱告诉我,我把我的发给你,或者你把你的发到chen_yu_zhong@263.net,对的和错的一比较,很快就能发现错误的所在。 我把我的程序发给你,有时间,麻烦你看一下了。 我想,除了CreateFile()中的VXD加载路径不同外,其他都一样。 谢谢。 |
|
|
5楼#
发布于:2002-02-04 10:24
你的设备驱动程序什么情况下返回失败(返回 1)? VToolsD中本来有一个debugmonitor,可是打开default通道,无法捕捉到dout输出,也就没有用它了。 |
|
|
6楼#
发布于:2002-02-04 10:07
你APP和VXD中inbuf的结构一样么? 以前的结构是一样的,后来在驱动里面,我索性根本不处理InBuf中的数据,直接返回一个OutBuf。 顺便问一下,CreateFile()中为什嬷要用Create_new,这样会导致我的工作目录中不能有VXD,否则就有错。而且,我好像必须指明路径(\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd),不能直接用默认的(\\\\\\\\.\\\\apptovxd.vxd),否则,就会有问题,error = 2。 |
|
|
7楼#
发布于:2002-02-02 10:56
本站帖子可以粘贴附件
那我就直接把我的贴上来了,jiaxu你也把你的贴上来吧。 |
|
8楼#
发布于:2002-02-02 10:24
这是书上的例子,在我这没一点问题,把你的邮箱告诉我,我把我的发给你,或者你把你的发到chen_yu_zhong@263.net,对的和错的一比较,很快就能发现错误的所在。
不过我大约5号就走人了,如果你在这之后看见我的帖子的话,那就等过完年再说吧。 |
|
9楼#
发布于:2002-02-01 20:03
你的设备驱动程序什么情况下返回失败(返回 1)?
如果你做了参数校验,snare 的推断就有道理。vxd 中结构通常是按字节对齐,而要想 32 位应用程序按字节对齐,需要加一句 #pragma pack(2)。 还有,debugview 是个很好的系统调试信息输出窗口,才 200k 左右,很好用,站上好像就有,为什么不下一个? |
|
|
10楼#
发布于:2002-02-01 19:10
你APP和VXD中inbuf的结构一样么?
我认为是这个原因 |
|
|
11楼#
发布于:2002-02-01 17:59
我是说你没有错
我真丢人 :( |
|
|
12楼#
发布于:2002-02-01 17:32
ControlCode没错 首先,如果我真的错了,请告诉我因该如何定义,或者告诉我怎样查到相关文档。 其次,我买的一本书中,我不知道,是不是我眼睛的问题,作者告诉我定义ControlCode的方法就是这样。 最后,我在vToolsD中的例子中(路径:VtoolsD\\Examples\\c\\apc)apcx.h也是如此定义的。 你能告诉我,错的原因吗?! |
|
|
13楼#
发布于:2002-02-01 17:14
ControlCode没错
//真丢人 :( //那我不知道了 |
|
|
14楼#
发布于:2002-02-01 17:08
ControlCode定义有问题吗?之后,我看了两个程序了,都是这样的。
另外,我把你改完的程序copy到我的程序中了,运行还是在DeviceIoControl时出现了错误。错误如下: Failed to ADD. error = 87 查Vc得知,原因是由参数错误。 很奇怪?这是书上的一个例子,而且楼上有朋友说它可能成功的运行了这个例子。我实在很纳闷! |
|
|
15楼#
发布于:2002-02-01 16:54
//我是说这样
#include <stdio.h> #include <Windows.h> #include <winioctl.h> #include \"Addxy.h\" void main() { HANDLE hDevice; int z; //xy pxy; xy myxy; //here DWORD truesize; hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if(hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, \"Cannot load VXD, error = %ld\\n\", GetLastError()); exit(1); } //pxy = new xy; //pxy->x = 40; //pxy->y = 80; myxy.x = 40; //here myxy.y = 80; //here if(!DeviceIoControl(hDevice, ADDXY, &myxy, sizeof(xy), &z, sizeof(int), &truesize, NULL)) { fprintf(stderr, \"Failed to ADD. error = %d\\n\", GetLastError()); exit(1); } //printf(\"%d + %d = %d\\n\", pxy->x, pxy->y, z); printf(\"%d + %d = %d\\n\",myxy.x,myxy.y,z); //here CloseHandle(hDevice); } 另外,你的IoctlCode定义有问题好象: Addxy.h头文件如下: #define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) vxd的ControlCode是这样定义的吗? 去找个vxd的例子来看看 |
|
|
16楼#
发布于:2002-02-01 16:51
1,传指针肯定是不行的,但不会报错 createfile成功了,运行到的deviceiocontrol时,出现了错误,如下: Failed to ADD. error = 6 |
|
|
17楼#
发布于:2002-02-01 16:11
1,传指针肯定是不行的,但不会报错
2,我不清楚你现在cretefile到底成功没有,如果没有成功,那就牵扯不到指针的问题 |
|
|
18楼#
发布于:2002-02-01 14:47
为什么你不愿意把指针改掉试试呢? #include <stdio.h> #include <Windows.h> #include <winioctl.h> #include \"Addxy.h\" void main() { HANDLE hDevice; // int z; char inbuf[256] = \"inbuf\", outbuf[256] = \"outbuf\"; DWORD truesize; OVERLAPPED o; // hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, NULL); if(hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, \"Cannot load VXD, error = %ld\\n\", GetLastError()); exit(1); } // pxy = new xy; // // pxy->x = 40; // pxy->y = 80; if(!DeviceIoControl(hDevice, ADDXY, inbuf, 256, outbuf, 256, &truesize, &o)) { fprintf(stderr, \"Failed to ADD. error = %d\\n\", GetLastError()); exit(1); } // printf(\"%d + %d = %d\\n\", pxy->x, pxy->y, z); CloseHandle(hDevice); } 我改成了字符串数组,依然不行。 错误代码:error = 6 |
|
|
19楼#
发布于:2002-02-01 13:39
为什么你不愿意把指针改掉试试呢?
不费什么劲吧 |
|
|
上一页
下一页