dszsun
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2006-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1249回复:6

菜鸟求助vxd与exe间的参数传递问题(给分38)

楼主#
更多 发布于:2002-08-23 19:03
我是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
另外:这样向各为给分?我有几个贴都还没结贴:)

最新喜欢:

chilichili
guixuehui
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-11-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-23 19:22
你把METHOD_NEITHER改为其他值试一试
桂雪会
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于: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;
dszsun
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2006-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-23 21:48
谢谢楼上:
我试验过了,问题解决了.谢谢你.对了,怎么回这样的?结构体成员的定义顺序对那也有影响?
还有呀,这里是怎样结贴给分的呀?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-08-24 01:27
csdn上回答你的那个人说的就是原因。如果你愿意,可以自己控制对其方式。

#pragma pack( push, pack1, 1 )
typedef....
}
....
#pragma pack( pop, pack1 )
dszsun
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2006-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-24 08:30
谢谢zdhe,你这处理办法的通用性更强呀!谢谢。它那对齐的概念是怎样,是不是说输入缓冲区从exe传到vxd的打包方式?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-08-24 15:38
csdn上回答你的那个人说的就是原因。如果你愿意,可以自己控制对其方式。

#pragma pack( push, pack1, 1 )
typedef....
}
....
#pragma pack( pop, pack1 )
 

被你抢答了 ;)
不需要结贴,给分就可以了。 :D
第一贴有个给分按钮。只能给一次分的哟。
游客

返回顶部