jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2804回复: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...
珈旭
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-30 13:06
你打开设备有误。
hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
你这是打开的apptovxd.vxd这个文件,而不是设备。
你可参考如下例子:
hDevice = CreateFile(\"\\\\\\\\.\\\\apptovxd.vxd\", FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING, 0,NULL);
MSDN中如是说:For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read-write access can be specified, and the handle can be opened for overlapped I/O. (CreateFile)
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-30 14:03
我的这个程序,功能就是应用程序传递两个整数给VXD,VXD实现加法运算后,将结果回传给应用程序。
我已经照你的建议修改了CreateFile,但是还不行。这次的error=6。就是说handle不对。但是VXD的加载没有问题。
珈旭
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-01-30 15:01
你在VXD中所对应的IOcode的IOCTL中加打印语句,看是否运行到此?
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-01-30 15:45
你在VXD中所对应的IOcode的IOCTL中加打印语句,看是否运行到此?


我的Debug Monitor用不起来,所以打印看不出来。
我觉得,可能问题还是在CreateFile上,就是解决不了,又是一天了。
珈旭
Buddha
驱动老牛
驱动老牛
  • 注册日期2001-04-29
  • 最后登录2013-05-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-01-30 15:45
你把vxd放在应用程序所在的路经,然后
CreateFile(\"\\\\\\\\.\\\\apptovxd.vxd\",
<table style="filter: glow(color=sky blue, strength=10)"> <font color=white> 猫生病了, 老鼠大声朗诵诗集, 并修剪盆花. 猫生病了, 老鼠慢慢刷牙洗脸, 并打扫房间. 猫生病了, 老鼠倚在窗边欣赏夜色, 并对流星许愿. 猫生病了, 老鼠也病了, 它说:"我还是习惯那种时时紧张, 处处小心, 夜夜逃亡的生活." 午夜, 我听到老鼠在叹息, 且不再读诗了. </font></table>
chenyz
驱动牛犊
驱动牛犊
  • 注册日期2001-10-24
  • 最后登录2002-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-01-30 16:12
你这个是一本书上的例子,应该不会有错呀,我的机器上运行得很正常呀。
你能把VXD文件的代码也贴出来吗。
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-01-31 08:43
你把vxd放在应用程序所在的路经,然后
CreateFile(\"\\\\\\\\.\\\\apptovxd.vxd\",
 


我的应用程序和VXD就在一个目录下。另外\\\\.\\指的路径是应用程序的当前路径吗?
珈旭
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-01-31 08:48
你这个是一本书上的例子,应该不会有错呀,我的机器上运行得很正常呀。
你能把VXD文件的代码也贴出来吗。


是啊,这是书上的例子,可是就是有问题,调试不通过,我的VXD程序和书上的一样,所以,这个问题真是很头疼。
珈旭
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-01-31 11:27
这样吧,你用softice跟踪一下,
多设几个断点,看看问题到底出在那一步?
是driver还是app
我就是我,没什么可说的。
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-02-01 10:55
问题可能出在pxy上
把指针传下去好象就不大好
Go,go ahead
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-02-01 11:20
问题,还没有解决,放了一天。
pxy传指针有问题吗?事实上它和定义一个字符串数组,然后传首地址,性质是一样的。我不觉得这里会有问题。
我现在还没有用任何的调试工具,softice等,因为也没装,过两天装一个。
顺便问一下,不用管vxd那边怎样,只要应用层正确,运行都会正常,只是没有处理消息函数的功能,程序应该能顺利进行结束吧?
珈旭
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-02-01 13:39
为什么你不愿意把指针改掉试试呢?
不费什么劲吧
Go,go ahead
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于: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
珈旭
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-02-01 16:11
1,传指针肯定是不行的,但不会报错
2,我不清楚你现在cretefile到底成功没有,如果没有成功,那就牵扯不到指针的问题
我就是我,没什么可说的。
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-02-01 16:51
1,传指针肯定是不行的,但不会报错
2,我不清楚你现在cretefile到底成功没有,如果没有成功,那就牵扯不到指针的问题


createfile成功了,运行到的deviceiocontrol时,出现了错误,如下:
Failed to ADD. error = 6
珈旭
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于: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分
17楼#
发布于: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分
18楼#
发布于:2002-02-01 17:14
ControlCode没错
//真丢人
:(

//那我不知道了
Go,go ahead
jiaxu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-02-01 17:32
ControlCode没错
//真丢人
:(

//那我不知道了


首先,如果我真的错了,请告诉我因该如何定义,或者告诉我怎样查到相关文档。
其次,我买的一本书中,我不知道,是不是我眼睛的问题,作者告诉我定义ControlCode的方法就是这样。
最后,我在vToolsD中的例子中(路径:VtoolsD\\Examples\\c\\apc)apcx.h也是如此定义的。
你能告诉我,错的原因吗?!
珈旭
上一页
游客

返回顶部