阅读:3371回复:42
急救
主程序中有如下代码
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赋值 (时间很急,请高手不吝赐教) |
|
最新喜欢:![]()
|
沙发#
发布于:2002-04-18 10:26
那是因为启动方式不同
如果指定softice开机启动,就没有这一项 如果指定手动启动,就会有 |
|
|
板凳#
发布于:2002-04-18 10:16
我的softice为什么在98下比在2000下少了一个begin softice菜单项?
|
|
|
地板#
发布于:2002-04-18 09:36
刚才没附上,补上
|
|
|
地下室#
发布于: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错误 |
|
|
5楼#
发布于:2002-04-18 09:07
重新发了一份。
要改的地方: 在应用层: pxy[0].x =40; //不是pxy[1].x=40,越界了 pxy[0].y =80; 在VxD: case ADDXY: .... return 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 |
|
|
7楼#
发布于:2002-04-18 08:55
delete加了,不管用,sigh!
|
|
|
8楼#
发布于:2002-04-18 08:48
也不行,唉,没救了! :(
|
|
|
9楼#
发布于:2002-04-18 08:45
new出来的东西你们都不delete的吗?!
|
|
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! |
|
|
11楼#
发布于:2002-04-17 21:41
我一直用第二本
另外,驱动网站上有很多资料,可以看 |
|
|
12楼#
发布于:2002-04-17 21:20
我看了你的源码。
在VxD里面,如果成功了,return 0!!!!! 而你return 1! |
|
13楼#
发布于:2002-04-17 19:51
好,就来
另外关于VxD编程我手头上只有 1、《虚拟设备驱动程序开发起步与进阶》,彭礼孝编著,人民邮电出版社。 2、《Windows VxD与设备驱动程序权威指南(第二版)[美]》,KAREN HAZZAH著,孙喜明译,中国电力出版社。 3、《Windows设备驱动程序(VxD与WDM)开发实务》,武安河 周莉莉 编著,电子工业出版社。 3本书,而且第三本错误太多,简直误人子弟,能不能再给我建议两本? [编辑 - 4/17/02 作者: trent] |
|
|
14楼#
发布于:2002-04-17 19:39
别客气了,我在西安,有机会到北京再吃你吧
yongdong.zhang@xa-kexing.com.cn 发过来吧。 |
|
|
15楼#
发布于:2002-04-17 19:27
太谢谢了,我是在VC下建个Win32 Console Application项目后加入
callapptovxd.cpp文件 而VxD是用支持C++; ---------------------------- 在北京吗?真想请你吃饭, :D |
|
|
16楼#
发布于:2002-04-17 19:23
好吧,不过可能明天才能答复你,我的98编译平台还没有搭好。你的代码是用什么做的。
|
|
|
17楼#
发布于:2002-04-17 19:20
你写的我看不懂,softice也不会用,要不我把那几个文件附到附件上,你载下来在你机器上运行试试
--------------------------------- 别吵了,分都给了还再要,下次再做你的生意 :P [编辑 - 4/17/02 作者: trent] |
|
|
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的执行情况以及参数传递情况 |
|
|
19楼#
发布于:2002-04-17 18:47
看你这么辛苦,我给分先吧
|
|
|
上一页
下一页