my12121
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2003-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1646回复:11

98下加载VXD驱动的问题

楼主#
更多 发布于:2003-06-25 14:59
我在98下用Vtoolsd的Debug Monitor加载生成的VXD程序,可是每次都是在启动系统后第一次加载时才会把VXD初始化函数中的dprintf内容显示出来,以后卸载后再加载只是会提示加载成功。
   还有,OnsysdynamicInit()中的代码为什么没有执行阿?我在其中写了一下并口,发现没反应阿。
   用应用程序加载此驱动返回句柄为12,ErrorCode为0。
  谢谢大侠阿
else
驱动小牛
驱动小牛
  • 注册日期2002-10-21
  • 最后登录2004-06-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-25 18:05
应该是你卸载的时候没有卸载成功所导致的问题
my12121
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2003-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-25 19:13
大侠,不知道怎么回事,我重新生成了一个驱程,然后把原来的代码拷进去了,现在可以了,每次加载都显示信息,不知道是不是我原来那个忘了选择动态加载的原因,应该不会的啊。
   可是现在用HOOK()挂接不上中断了,每次都提示虚拟化中断出错。我是虚拟的IRQ7,并口中断,不知道系统已经用了的中断能不能虚拟啊?我用的是VHardwareint类而不是VShareHardwareint类,不知道是不是这个原因啊,还请大虾指点啊,谢谢
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-06-26 00:38
建议用VShareHardwareint
my12121
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2003-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-26 12:34
谢谢大侠。果然换了VShareHardwareInt就好了。
大侠,我用DeviceIocontrol传送句柄时总是出错,我看了错误代码是87,参数不正确。我的语句是这样的:
窗体句柄hwnd,VXD句柄hvxd。
Result=Deviceiocontrol(hvxd,GET_WND_HANDLE,&hwnd,sizeof(HANDLE),NULL,0,NULL,NULL);
result总是FALSE。
能麻烦大侠帮我看看吗?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-06-26 13:50
那要看你的vxd干什么了才会false
my12121
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2003-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-26 16:41
DWORD VideoinDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
  switch(pDIOCParams->dioc_IOCtlCode)
 {
  case DIOC_OPEN:
   dprintf(\"Videoin: dioc_openhandle\");
   pdata=(PVOID) _HeapAllocate(bsize,HEAPZEROINIT);
   return DEVIOCTL_NOERROR;
 case DIOC_CLOSEHANDLE:
   dprintf(\"Videoin: dioc_closehandle\");
   pMyIRQ->physicalMask();
   HeapFree(pdata,0);
   return DEVIOCTL_NOERROR;
 case GET_APP_HANDLE://读取窗口句柄
   memcpy(&Appwnd,pDIOCParams->dioc_InBuf,sizeof(HANDLE));
   dout<<\"get the buffer address\"<<endl;
   return 0;
 default: return ERROR_INVALID_PARAMETER;
}
}
这是VXD里的OnW32DeviceIoControl函数。您看有什么问题阿?
另外DIOC_OPEN应该自动执行的把?可是加载的时候为什么在DebugMonitor中看不到其中的输出阿?没有执行它阿???
是不是这整个函数就有问题,根本没有执行到它阿?
问题比较多,不好意思,大侠。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-06-26 22:56
GET_APP_HANDLE和GET_WND_HANDLE是一样的值吗?笔误?
my12121
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2003-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-27 10:02
大侠,是笔误阿,源程序里没写错。
控制码GET_APP_HANDLE的定义是这样的:
#include \"winioctl.h\"
#define VXD_BASE_ADDRESS 0xf00
#define GET_APP_HANDLE CTL_CODE(FILE_DEVICE_UNKNOWN,VXD_BASE_ADDRESS,METHOD_BUFFERED,FILE_ANY_ACCESS)
这个定义是什么意思我也不知道,是抄的。
很奇怪的是,我用系统的控制码用这样的语句试过还是不对:
bresult=DeviceIoControl(Hvxd,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&lpsize,NULL);
MSDN上说deviceiocontrol的最后两个参数不能同时为NULL,可是我见了很多例子上他们都是同时为NULL的???
大侠,我是走投无路了,您一定得帮帮我阿。。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-06-27 14:07
没有注意到你后两个都是null,给个参数给倒数第二个
if(!Deviceiocontrol(hvxd,GET_WND_HANDLE,&hwnd,sizeof(HANDLE),NULL,0,&dwReturn,NULL)
{
//error...
}
dwReturn不理会。
vxd的io code可以不这样,直接为1,2或3什么的也可以
my12121
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2003-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-27 14:26
大侠我给过了啊,就是不理我啊,那个io code一开始我就是给的1,就是直接这样:#define GET_APP_HANDLE 1,可是不行啊。
我还用系统的控制码试过,什么参数都不带的都不行啊。
  另外有个问题请教大侠,就是VXD加载时,DIOC_OPEN和DIOC_CLOSEHANDLE消息不是系统自动发给VXD的吗,那像我的OnW32DeviceIoControl()中
case DIOC_OPEN:
dprintf(\"Videoin: dioc_openhandle\");
pdata=(PVOID) _HeapAllocate(bsize,HEAPZEROINIT);
return DEVIOCTL_NOERROR;
显示的信息为什么在DebugMonitor中都看不到啊?是不是这个OnW32DeviceIoControl()函数有问题啊,根本就不能接收消息啊?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2003-06-27 16:27
用si,下断点,跟看看吧,比较直接。
游客

返回顶部