阅读:1650回复:11
98下加载VXD驱动的问题
我在98下用Vtoolsd的Debug Monitor加载生成的VXD程序,可是每次都是在启动系统后第一次加载时才会把VXD初始化函数中的dprintf内容显示出来,以后卸载后再加载只是会提示加载成功。
还有,OnsysdynamicInit()中的代码为什么没有执行阿?我在其中写了一下并口,发现没反应阿。 用应用程序加载此驱动返回句柄为12,ErrorCode为0。 谢谢大侠阿 |
|
沙发#
发布于:2003-06-27 16:27
用si,下断点,跟看看吧,比较直接。
|
|
板凳#
发布于: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()函数有问题啊,根本就不能接收消息啊? |
|
地板#
发布于: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什么的也可以 |
|
地下室#
发布于: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的??? 大侠,我是走投无路了,您一定得帮帮我阿。。 |
|
5楼#
发布于:2003-06-26 22:56
GET_APP_HANDLE和GET_WND_HANDLE是一样的值吗?笔误?
|
|
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中看不到其中的输出阿?没有执行它阿??? 是不是这整个函数就有问题,根本没有执行到它阿? 问题比较多,不好意思,大侠。 |
|
7楼#
发布于:2003-06-26 13:50
那要看你的vxd干什么了才会false
|
|
8楼#
发布于: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。 能麻烦大侠帮我看看吗? |
|
9楼#
发布于:2003-06-26 00:38
建议用VShareHardwareint
|
|
10楼#
发布于:2003-06-25 19:13
大侠,不知道怎么回事,我重新生成了一个驱程,然后把原来的代码拷进去了,现在可以了,每次加载都显示信息,不知道是不是我原来那个忘了选择动态加载的原因,应该不会的啊。
可是现在用HOOK()挂接不上中断了,每次都提示虚拟化中断出错。我是虚拟的IRQ7,并口中断,不知道系统已经用了的中断能不能虚拟啊?我用的是VHardwareint类而不是VShareHardwareint类,不知道是不是这个原因啊,还请大虾指点啊,谢谢 |
|
11楼#
发布于:2003-06-25 18:05
应该是你卸载的时候没有卸载成功所导致的问题
|
|