阅读:1249回复:6
菜鸟求助vxd与exe间的参数传递问题(给分38)
我是vxd初学者。我发现从应用程序传给vxd的数据莫名其妙的变了。我在csdn里问过了这问题。得到的回复如下:“RPD结构定义的对齐方式不一样,在EXE里是1BYTE对齐,而在VXD里是4BYTE对齐,说到这里你应该明白了吧,我就不多说了”
但我还是不明白呀!我问了那个好心人很多问题,现在那个在高手眼里是很菜的问题都不好意思在问他啦。这里有人能帮我详细的回答吗?他那句话是什么意思?该怎样解决? 我在csdn发的贴: http://www.csdn.net/expert/topic/960/960026.xml?temp=2.056521E-02 下面是我特别为了解决着问题编的演示程序: -------vxd源文件------ // TESTTR.cpp - main module for VxD TESTTR #define DEVICE_MAIN #include \"testtr.h\" Declare_Virtual_Device(TESTTR) #undef DEVICE_MAIN #define DIOC_TRANFER_TEST CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS) typedef struct _RPD{ UCHAR ucDisk; ULONG ulStartAddr[2]; int ulCount; }RPD,*PRPD; BOOL TesttrDevice::OnSysDynamicDeviceInit() { return TRUE; } BOOL TesttrDevice::OnSysDynamicDeviceExit() { return TRUE; } DWORD TesttrDevice::OnW32DeviceIoControl(PIOCTLPARAMS p) { PRPD pRpd; pRpd=(PRPD)p->dioc_InBuf; switch(p->dioc_IOCtlCode ) { case DIOC_OPEN: nprintf(\"DIOC_OPEN\"); return DEVIOCTL_NOERROR; case DIOC_CLOSEHANDLE: nprintf(\"DIOC_CLOSE\"); return DEVIOCTL_NOERROR; case DIOC_TRANFER_TEST: nprintf(\"Address of p->dioc_InBuf:%x\",p->dioc_InBuf); nprintf(\"Address of pRpd:%x\",pRpd); dout<<\"ucDisk:\"<<pRpd->ucDisk<<endl<<\"ulStartAddr:\"<<pRpd->ulStartAddr[0]<<endl<<pRpd->ulStartAddr[1]<<endl; return DEVIOCTL_NOERROR; } return 0; } --------应用程序源文件------------- # include<stdio.h> # include<Windows.h> # include<Winioctl.h> #define DIOC_TRANFER_TEST CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS) typedef struct _RPD{ UCHAR ucDisk; ULONG ulStartAddr[2]; int ulCount; }RPD,*PRPD; void main() { PRPD pRpd; HANDLE hDevice; pRpd=(PRPD)malloc(sizeof(RPD)); unsigned long w; pRpd->ucDisk=0x80; pRpd->ulCount=1; pRpd->ulStartAddr[0]=0x3f; pRpd->ulStartAddr[1]=0x0; hDevice=CreateFile(\"\\\\\\\\.\\\\TESTTR.VXD\",0,0,0,CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE,0); if(hDevice==INVALID_HANDLE_VALUE){ fprintf(stderr,\"Cannot load VXD,error=%08ld\\n\",GetLastError()); getchar(); exit(1); } if(!DeviceIoControl(hDevice,DIOC_TRANFER_TEST,(void *)pRpd,sizeof(RPD),NULL,NULL,&w,NULL)){ fprintf(stderr,\"Failed \"); getchar(); } CloseHandle(hDevice); free(pRpd); getchar(); } -------------------------------------------------- debug monitor里的输出是: Address of p->dioc_InBuf:780eb0 Address of pRpd:780eb0 ucDisk:80 ulStartAddr:3fcdcdcd 00000000 ----------------------------------------- 开发环境是:Win98,vtoolsd3.0,vc++6.0 另外:这样向各为给分?我有几个贴都还没结贴:) |
|
最新喜欢:chili |
沙发#
发布于:2002-08-23 19:22
你把METHOD_NEITHER改为其他值试一试
|
|
|
板凳#
发布于:2002-08-23 19:23
就是RPD的对齐的问题。vc默认dword对齐的。
把次序换换。 typedef struct _RPD{ ULONG ulStartAddr[2]; //2 dword int ulCount; // this and below to be a dword, UCHAR ucDisk; // 不够dword的部分是00,但是就可以不关心了。 }RPD,*PRPD; |
|
地板#
发布于:2002-08-23 21:48
谢谢楼上:
我试验过了,问题解决了.谢谢你.对了,怎么回这样的?结构体成员的定义顺序对那也有影响? 还有呀,这里是怎样结贴给分的呀? |
|
地下室#
发布于:2002-08-24 01:27
csdn上回答你的那个人说的就是原因。如果你愿意,可以自己控制对其方式。
#pragma pack( push, pack1, 1 ) typedef.... } .... #pragma pack( pop, pack1 ) |
|
5楼#
发布于:2002-08-24 08:30
谢谢zdhe,你这处理办法的通用性更强呀!谢谢。它那对齐的概念是怎样,是不是说输入缓冲区从exe传到vxd的打包方式?
|
|
6楼#
发布于:2002-08-24 15:38
csdn上回答你的那个人说的就是原因。如果你愿意,可以自己控制对其方式。 被你抢答了 ;) 不需要结贴,给分就可以了。 :D 第一贴有个给分按钮。只能给一次分的哟。 |
|