trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3371回复: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...
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-18 10:26
那是因为启动方式不同
如果指定softice开机启动,就没有这一项
如果指定手动启动,就会有
[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分
板凳#
发布于:2002-04-18 10:16
我的softice为什么在98下比在2000下少了一个begin softice菜单项?
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-18 09:36
刚才没附上,补上
附件名称/大小 下载次数 最后更新
2002-04-18_thanks.zip (2KB)  1
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-18 09:34
大概不是这原因,因为我曾这么改
if(!DeviceIoControl(hDevice,ADDXY,0,0,(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
{
   nErrNum=GetLastError();
fprintf(stderr,\"Failed to ADD\\n\");
 fprintf(stderr,\"cant load err=%d\\n\",nErrNum);
  delete pxy;
  delete pz;
  CloseHandle(hDevice);
  getch();
exit(1);
}
而在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=10;
return 0;
default:
return 0;
}
return 0;
}
即VxD简单的给应用程序的pz赋值,结果还是err=87
我附上zydcat老兄给我发的代码,他在他机器上通过了,而我直接用他的代码生成vxd,后调用,还是出现err=87错误
我不仅要金子,我还要点石成金的手指!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-04-18 09:07
重新发了一份。
要改的地方:
在应用层:
pxy[0].x =40;      //不是pxy[1].x=40,越界了
pxy[0].y =80;
在VxD:
case ADDXY:
....
return 0;

你还是不要用数组了:)
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-18 08:58
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);
}

老是得到
Failed to ADD
cant load err=87
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-18 08:55
delete加了,不管用,sigh!
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-18 08:48
也不行,唉,没救了! :(
我不仅要金子,我还要点石成金的手指!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-04-18 08:45
new出来的东西你们都不delete的吗?!
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-18 08:39
typedef struct _xy
{
int x;
int y;
}xy;
#define ADDXY 2
#include \"stdio.h\"
#include \"windows.h\"
#include\"winioctl.h\"
void main()
{
HANDLE hDevice;
int * pz;
xy * pxy;
hDevice=CreateFile(\"D:\\\\VTOOLSD\\\\Bin\\\\apptovxd.vxd\",0,0,0,OPEN_EXISTING ,
FILE_FLAG_DELETE_ON_CLOSE,0);
if(hDevice==INVALID_HANDLE_VALUE)
{
fprintf(stderr,\"cant load err=08ld\\n\",GetLastError());
exit(1);
}
pxy=new xy[1];
pp=new int[2];
*pp=40;
*(pp+1)=80;

pz=new int[1];
printf(\"%d\\n\",*pz);

pxy[0].x =40;
int x=10;
pxy[0].y=80;
DWORD dwByteRet = 0L;
if(!DeviceIoControl(hDevice,ADDXY,(xy)pxy,sizeof(pxy),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
//if(!DeviceIoControl(hDevice,ADDXY,&x,sizeof(int),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))

try it!
rich
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-17 21:41
我一直用第二本
另外,驱动网站上有很多资料,可以看
[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分
  • 社区居民
12楼#
发布于:2002-04-17 21:20
我看了你的源码。
在VxD里面,如果成功了,return 0!!!!!
而你return 1!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-17 19:51
好,就来
另外关于VxD编程我手头上只有
1、《虚拟设备驱动程序开发起步与进阶》,彭礼孝编著,人民邮电出版社。
2、《Windows VxD与设备驱动程序权威指南(第二版)[美]》,KAREN HAZZAH著,孙喜明译,中国电力出版社。
3、《Windows设备驱动程序(VxD与WDM)开发实务》,武安河  周莉莉 编著,电子工业出版社。
3本书,而且第三本错误太多,简直误人子弟,能不能再给我建议两本?



[编辑 -  4/17/02 作者: trent]
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-17 19:39
别客气了,我在西安,有机会到北京再吃你吧
yongdong.zhang@xa-kexing.com.cn
发过来吧。
[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分
15楼#
发布于:2002-04-17 19:27
太谢谢了,我是在VC下建个Win32 Console Application项目后加入
callapptovxd.cpp文件
而VxD是用支持C++;
----------------------------
在北京吗?真想请你吃饭, :D
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-04-17 19:23
好吧,不过可能明天才能答复你,我的98编译平台还没有搭好。你的代码是用什么做的。
[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分
17楼#
发布于:2002-04-17 19:20
你写的我看不懂,softice也不会用,要不我把那几个文件附到附件上,你载下来在你机器上运行试试
---------------------------------
别吵了,分都给了还再要,下次再做你的生意 :P

[编辑 -  4/17/02 作者: trent]
附件名称/大小 下载次数 最后更新
2002-04-17_Thanks.ace (2KB)  1
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-04-17 19:06
这是我写的:
DWORD (*VxD_W32_Proc[])(PIOCTLPARAMS p) =
{  // to handle W32 msg
   W32_GetTotalCard,    // return the _TotalCard, code=1
   W32_PCIConfigure,    // get configuration from array _dev
   W32_EnableEvent,     // 3
   W32_ClearEvent,
   W32_EventStatus_Transfer,  // code=5
};

DWORD OnW32Deviceiocontrol(PIOCTLPARAMS p)
{
   switch(p->dioc_IOCtlCode)
   {
   case DIOC_OPEN:
   case DIOC_CLOSEHANDLE:
      return 0;
   default:
      {
         _ASSERT(p != NULL);
         return ((p->dioc_IOCtlCode > MAX_VXD_W32_API)?-1:
                  (VxD_W32_Proc[p->dioc_IOCtlCode-1])(p));
      }
   }
return 0;
}
先定义一个函数指针数组,将你要调用的函数按顺序放在里面,根据ioctl码调用。
你最好用softice跟一下代码,看看OnW32Deviceiocontrol的执行情况以及参数传递情况
[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分
19楼#
发布于:2002-04-17 18:47
看你这么辛苦,我给分先吧
我不仅要金子,我还要点石成金的手指!
上一页
游客

返回顶部