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

一个困惑了我一天的bug

楼主#
更多 发布于:2002-01-30 11:45
我的应用主程序如下:
#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


请问这是为什嬷?

最新喜欢:

jmzz003jmzz00...
珈旭
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-02-04 13:50
谢谢各位。知道正确就行了。
再次说声谢谢。
珈旭
chenyz
驱动牛犊
驱动牛犊
  • 注册日期2001-10-24
  • 最后登录2002-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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。
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-02-04 11:23
找不出问题
因为你们的程序在我这里都能通过,没有任何问题。
而且jiaxu的要好一些,因为你在
if (!DeviceIoControl(hDevice,ADDXY,pxy,0,&z,sizeof(int),0,NULL))
里为输出buf指定了长度。(但这对于本程序无影响)

还有在我这里,无论相对路径还是绝对路径都可以。
但是如果是绝对路径的话,单个目录名要不超过8个字符
我就是我,没什么可说的。
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-02-04 10:30
这是书上的例子,在我这没一点问题,把你的邮箱告诉我,我把我的发给你,或者你把你的发到chen_yu_zhong@263.net,对的和错的一比较,很快就能发现错误的所在。
不过我大约5号就走人了,如果你在这之后看见我的帖子的话,那就等过完年再说吧。


我把我的程序发给你,有时间,麻烦你看一下了。
我想,除了CreateFile()中的VXD加载路径不同外,其他都一样。
谢谢。
珈旭
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-02-04 10:24
你的设备驱动程序什么情况下返回失败(返回 1)?
如果你做了参数校验,snare 的推断就有道理。vxd 中结构通常是按字节对齐,而要想 32 位应用程序按字节对齐,需要加一句
 #pragma pack(2)。

还有,debugview 是个很好的系统调试信息输出窗口,才 200k 左右,很好用,站上好像就有,为什么不下一个?



VToolsD中本来有一个debugmonitor,可是打开default通道,无法捕捉到dout输出,也就没有用它了。
珈旭
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-02-04 10:07
你APP和VXD中inbuf的结构一样么?
我认为是这个原因


以前的结构是一样的,后来在驱动里面,我索性根本不处理InBuf中的数据,直接返回一个OutBuf。

顺便问一下,CreateFile()中为什嬷要用Create_new,这样会导致我的工作目录中不能有VXD,否则就有错。而且,我好像必须指明路径(\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd),不能直接用默认的(\\\\\\\\.\\\\apptovxd.vxd),否则,就会有问题,error = 2。
珈旭
chenyz
驱动牛犊
驱动牛犊
  • 注册日期2001-10-24
  • 最后登录2002-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-02-02 10:56
本站帖子可以粘贴附件
那我就直接把我的贴上来了,jiaxu你也把你的贴上来吧。
chenyz
驱动牛犊
驱动牛犊
  • 注册日期2001-10-24
  • 最后登录2002-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-02-02 10:24
这是书上的例子,在我这没一点问题,把你的邮箱告诉我,我把我的发给你,或者你把你的发到chen_yu_zhong@263.net,对的和错的一比较,很快就能发现错误的所在。
不过我大约5号就走人了,如果你在这之后看见我的帖子的话,那就等过完年再说吧。
lvwj
驱动老牛
驱动老牛
  • 注册日期2001-08-21
  • 最后登录2021-01-31
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望181点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-02-01 20:03
你的设备驱动程序什么情况下返回失败(返回 1)?
如果你做了参数校验,snare 的推断就有道理。vxd 中结构通常是按字节对齐,而要想 32 位应用程序按字节对齐,需要加一句
 #pragma pack(2)。

还有,debugview 是个很好的系统调试信息输出窗口,才 200k 左右,很好用,站上好像就有,为什么不下一个?
www.bjjcz.com
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-02-01 19:10
你APP和VXD中inbuf的结构一样么?
我认为是这个原因
我就是我,没什么可说的。
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-02-01 17:59
我是说你没有错
我真丢人
:(
Go,go ahead
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-02-01 17:32
ControlCode没错
//真丢人
:(

//那我不知道了


首先,如果我真的错了,请告诉我因该如何定义,或者告诉我怎样查到相关文档。
其次,我买的一本书中,我不知道,是不是我眼睛的问题,作者告诉我定义ControlCode的方法就是这样。
最后,我在vToolsD中的例子中(路径:VtoolsD\\Examples\\c\\apc)apcx.h也是如此定义的。
你能告诉我,错的原因吗?!
珈旭
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-02-01 17:14
ControlCode没错
//真丢人
:(

//那我不知道了
Go,go ahead
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-02-01 17:08
ControlCode定义有问题吗?之后,我看了两个程序了,都是这样的。
另外,我把你改完的程序copy到我的程序中了,运行还是在DeviceIoControl时出现了错误。错误如下:
Failed to ADD. error = 87
查Vc得知,原因是由参数错误。
很奇怪?这是书上的一个例子,而且楼上有朋友说它可能成功的运行了这个例子。我实在很纳闷!
珈旭
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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的例子来看看
Go,go ahead
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-02-01 16:51
1,传指针肯定是不行的,但不会报错
2,我不清楚你现在cretefile到底成功没有,如果没有成功,那就牵扯不到指针的问题


createfile成功了,运行到的deviceiocontrol时,出现了错误,如下:
Failed to ADD. error = 6
珈旭
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-02-01 16:11
1,传指针肯定是不行的,但不会报错
2,我不清楚你现在cretefile到底成功没有,如果没有成功,那就牵扯不到指针的问题
我就是我,没什么可说的。
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
珈旭
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-02-01 13:39
为什么你不愿意把指针改掉试试呢?
不费什么劲吧
Go,go ahead
上一页
游客

返回顶部