trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-04-17 18:05
但是err=87怎么解决?
----------------------------
大家辛苦了,对吧.
问题没解决,对吧.
我也很痛苦,对吧.
你们有办法,对吧.
再帮我一把,对吧.
 :D
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-04-17 18:27
一个个的检查参数,不过我认为是你的第2的参数有问题。重新定义ioctl码吧。
[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分
22楼#
发布于:2002-04-17 18:44
应用程序:
struct xy
{
int x;
int y;
};
#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[1].x =40;
int x=10;
pxy[1].y=80;
DWORD dwByteRet = 0L;
if(!DeviceIoControl(hDevice,ADDXY,(LPVOID)pxy,sizeof(xy),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
//if(!DeviceIoControl(hDevice,ADDXY,&x,sizeof(int),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
{
fprintf(stderr,\"Failed to ADD\\n\");
 fprintf(stderr,\"cant load err=%d\\n\",GetLastError());
exit(1);
}
printf(\"%d+%d=%d\\n\",pxy[1].x,pxy[1].y,*pz);
CloseHandle(hDevice);
}



VxD中CPP程序:

#define DEVICE_MAIN
#include \"apptovxd.h\"
Declare_Virtual_Device(APPTOVXD)
#undef DEVICE_MAIN

struct xy
{
int x;
int y;
};

#define ADDXY 2

ApptovxdVM::ApptovxdVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

ApptovxdThread::ApptovxdThread(THREADHANDLE hThread) : VThread(hThread) {}

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;
}
return 0;
}

该改的都改了,只好吐血了,仍然是err=87!! :( :(
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2002-04-17 18:44
把你的vxd的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分
24楼#
发布于:2002-04-17 18:47
看你这么辛苦,我给分先吧
我不仅要金子,我还要点石成金的手指!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
25楼#
发布于: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分
26楼#
发布于: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分
27楼#
发布于: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分
28楼#
发布于: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分
29楼#
发布于: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分
30楼#
发布于:2002-04-17 19:51
好,就来
另外关于VxD编程我手头上只有
1、《虚拟设备驱动程序开发起步与进阶》,彭礼孝编著,人民邮电出版社。
2、《Windows VxD与设备驱动程序权威指南(第二版)[美]》,KAREN HAZZAH著,孙喜明译,中国电力出版社。
3、《Windows设备驱动程序(VxD与WDM)开发实务》,武安河  周莉莉 编著,电子工业出版社。
3本书,而且第三本错误太多,简直误人子弟,能不能再给我建议两本?



[编辑 -  4/17/02 作者: trent]
我不仅要金子,我还要点石成金的手指!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
31楼#
发布于:2002-04-17 21:20
我看了你的源码。
在VxD里面,如果成功了,return 0!!!!!
而你return 1!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2002-04-17 21:41
我一直用第二本
另外,驱动网站上有很多资料,可以看
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
33楼#
发布于: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
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
34楼#
发布于:2002-04-18 08:45
new出来的东西你们都不delete的吗?!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
35楼#
发布于:2002-04-18 08:48
也不行,唉,没救了! :(
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
36楼#
发布于:2002-04-18 08:55
delete加了,不管用,sigh!
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
37楼#
发布于: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
我不仅要金子,我还要点石成金的手指!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
38楼#
发布于: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分
39楼#
发布于: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错误
我不仅要金子,我还要点石成金的手指!
游客

返回顶部