trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3291回复:42

急救

楼主#
更多 发布于:2002-04-17 13:52
主程序中有如下代码
pxy=new xy[1];

pz=new int[1];
pxy[1].x =40;
pxy[1].y=80;
if(DeviceIoControl(hDevice,ADDXY,&pxy[1],0,pz,0,0,NULL))
{
fprintf(stderr,\"Failed to ADD\\n\");
exit(1);
}
printf(\"%d+%d=%d\\n\",pxy[1].x,pxy[1].y,*pz);


VXD中:
DWORD ApptovxdDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
xy * pxy;
switch(pDIOCParams->dioc_IOCtlCode)
{
case DIOC_OPEN:
case DIOC_CLOSEHANDLE:
return DEVIOCTL_NOERROR;
case ADDXY:
pxy=(xy*) pDIOCParams->dioc_InBuf;

*(int*)pDIOCParams->dioc_OutBuf=pxy->x+pxy->y;
return 1;
default:
return -1;
}

为什么在主程序中调用了VXD后*pz没有改变,即VXD根本没给*pz赋值
(时间很急,请高手不吝赐教)

最新喜欢:

dongjundongju...
我不仅要金子,我还要点石成金的手指!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-17 14:04

pxy=new xy[1];
int * pz=new int[1];
pxy[1].x =40;
pxy[1].y=80;

if(DeviceIoControl(hDevice,ADDXY,&pxy[1],0,pz,0,0,NULL))
{
fprintf(stderr,\"Failed to ADD\\n\");
exit(1);
}
printf(\"%d+%d=%d\\n\",pxy[1].x,pxy[1].y,*pz);


if(DeviceIoControl(hDevice,ADDXY,&pxy[1],0,pz,0,0,NULL))一句中,inputbuffer参数pxy本为指针为什么还要加&,去掉试试
如下:

if(DeviceIoControl(hDevice,ADDXY,pxy[1],0,pz,0,0,NULL))
Tom_lyd
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-17 14:21
去掉后编译出错:
如下:
D:\\VTOOLSD\\Bin\\callapptovxd.cpp(32) : error C2664: \'DeviceIoControl\' : cannot convert parameter 3 from \'struct xy\' to \'void *\'
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-17 14:31
deviceiocontrol的第4和第6个参数是输入和输出缓冲区的长度,怎么能为零。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-17 15:20
去掉后编译出错:
如下:
D:\\VTOOLSD\\Bin\\callapptovxd.cpp(32) : error C2664: \'DeviceIoControl\' : cannot convert parameter 3 from \'struct xy\' to \'void *\'
 

zydact说的对:
正确调用应该如下:
DeviceIoControl(hDevice,
                      ADDXY,
                      (LPVOID)pxy,
                      sizeof(xy),
                      (LPVOID)pz,
                      sizeof(int),
                      &dwByteret,
                      NULL);
按你的意思应该有如下定义:
typedef struct
{
... ...
}xy,*pxy;
 
你还要定义一个
DWORD dwByteRet = 0L;以接受DeviceIoControl的返回字节数。

                

Tom_lyd
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-17 15:51
谢谢各位先.我相信调用过程现在应该没问题,但我这结果还是不对
输出40+80=-842150451.
而且我现在所有的通过DeviceIoControl来实现VC与VxD通信的程序都不能得到正确结果(VxD程序通过Debug monitor调试通过).是不是我的设置有问题.另外我发现我的DeviceIoControl的返回值总是0.这正常吗?
我在OnWin32DeviceIoControl中的每个case的返回值都改为1,结果得到的还是0,郁闷,谁帮帮我?
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-17 16:03
返回非0值表示成功,0值失败
调用一下GetLastError()看一下什么错误
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-17 16:04
哦,想起来了,#define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS)
我在VxD的cpp文件中定义了一个,在应用程序中也define了一下,不是这问题吧??
 :P
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-17 16:07
当然两边都要定义了
否则怎么找得到对应的函数
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-17 16:08
哇靠,我看的一本书居然告诉我返回0成功,真是误人子弟!faint!! :mad:
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-17 16:09
还是msdn最可靠
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-17 16:14
if(!DeviceIoControl(hDevice,ADDXY,(LPVOID)pxy,sizeof(xy),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
{
fprintf(stderr,\"Failed to ADD\\n\");
 fprintf(stderr,\"cant load err=%d\\n\",GetLastError());
exit(1);
}
结果得到
err=87;什么毛病?
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-17 16:19
The parameter is incorrect.
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-17 16:27
不会吧,那该怎么写?
if(!DeviceIoControl(hDevice,ADDXY,(LPVOID)pxy,sizeof(xy),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
还不行?



[编辑 -  4/17/02 作者: trent]
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-17 16:33
刚才少说了一句,vxd下的ioctl码和nt下定义方式不一样
你只需要在两边都按顺序定义就行了,如
#define PCI_Configure   2
#define Initial_INT     3   // Initial
#define Clear_INT       4
#define INT_Status      5

注意从2开始
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-04-17 16:36
同意。
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-04-17 16:50
刚才少说了一句,vxd下的ioctl码和nt下定义方式不一样
你只需要在两边都按顺序定义就行了,如
#define PCI_Configure   2
#define Initial_INT     3   // Initial
#define Clear_INT       4
#define INT_Status      5

注意从2开始

我是菜鸟,厚脸皮问一下,ioctl码是什么东东,跟这问题有什么关系?
能不能详细点,我觉得自己都苯死了.
 :P :P
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-04-17 17:19
就是你定义的,这是nt下的定义方式。
#define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS)

ADDXY就是你定义的ioctl码,系统是根据这个冬冬来找到你的应用程序所需要调用的驱动中的例程。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-04-17 17:21
ioctrl码就是IO control code :)
就是你的ADDXY了。在VxD下,不需要象NT下那样,用
CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS), 直接定义数字就可以的。
例如:
#define PCI_Configure 2
#define Initial_INT 3 // Initial
#define Clear_INT 4
#define INT_Status 5

在VxD:
case PCI_Config:
    do...
    break;
case INT_Status:
    break;
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-04-17 17:47
哦 :o
我不仅要金子,我还要点石成金的手指!
上一页
游客

返回顶部