20楼#
发布于:2002-04-17 18:05
但是err=87怎么解决?
---------------------------- 大家辛苦了,对吧. 问题没解决,对吧. 我也很痛苦,对吧. 你们有办法,对吧. 再帮我一把,对吧. :D |
|
|
21楼#
发布于:2002-04-17 18:27
一个个的检查参数,不过我认为是你的第2的参数有问题。重新定义ioctl码吧。
|
|
|
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!! :( :( |
|
|
23楼#
发布于:2002-04-17 18:44
把你的vxd的OnW32Deviceiocontrol函数的代码贴出来看看。
|
|
|
24楼#
发布于:2002-04-17 18:47
看你这么辛苦,我给分先吧
|
|
|
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的执行情况以及参数传递情况 |
|
|
26楼#
发布于:2002-04-17 19:20
你写的我看不懂,softice也不会用,要不我把那几个文件附到附件上,你载下来在你机器上运行试试
--------------------------------- 别吵了,分都给了还再要,下次再做你的生意 :P [编辑 - 4/17/02 作者: trent] |
|
|
27楼#
发布于:2002-04-17 19:23
好吧,不过可能明天才能答复你,我的98编译平台还没有搭好。你的代码是用什么做的。
|
|
|
28楼#
发布于:2002-04-17 19:27
太谢谢了,我是在VC下建个Win32 Console Application项目后加入
callapptovxd.cpp文件 而VxD是用支持C++; ---------------------------- 在北京吗?真想请你吃饭, :D |
|
|
29楼#
发布于:2002-04-17 19:39
别客气了,我在西安,有机会到北京再吃你吧
yongdong.zhang@xa-kexing.com.cn 发过来吧。 |
|
|
30楼#
发布于:2002-04-17 19:51
好,就来
另外关于VxD编程我手头上只有 1、《虚拟设备驱动程序开发起步与进阶》,彭礼孝编著,人民邮电出版社。 2、《Windows VxD与设备驱动程序权威指南(第二版)[美]》,KAREN HAZZAH著,孙喜明译,中国电力出版社。 3、《Windows设备驱动程序(VxD与WDM)开发实务》,武安河 周莉莉 编著,电子工业出版社。 3本书,而且第三本错误太多,简直误人子弟,能不能再给我建议两本? [编辑 - 4/17/02 作者: trent] |
|
|
31楼#
发布于:2002-04-17 21:20
我看了你的源码。
在VxD里面,如果成功了,return 0!!!!! 而你return 1! |
|
32楼#
发布于:2002-04-17 21:41
我一直用第二本
另外,驱动网站上有很多资料,可以看 |
|
|
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! |
|
|
34楼#
发布于:2002-04-18 08:45
new出来的东西你们都不delete的吗?!
|
|
35楼#
发布于:2002-04-18 08:48
也不行,唉,没救了! :(
|
|
|
36楼#
发布于:2002-04-18 08:55
delete加了,不管用,sigh!
|
|
|
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 |
|
|
38楼#
发布于:2002-04-18 09:07
重新发了一份。
要改的地方: 在应用层: pxy[0].x =40; //不是pxy[1].x=40,越界了 pxy[0].y =80; 在VxD: case ADDXY: .... return 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错误 |
|
|