阅读:1446回复:6
小弟初学VXD,请教两个问题,每个5-10分
1,我的动态VXD为何不能卸载
小弟写了一个最简单的VXD,在VC6中如此引用: HANDLE hFile = CreateFile( \"\\\\\\\\.\\\\my.vxd\", 0, 0, 0, CREATE_ALWAYS|FILE_FLAG_DELETE_ON_CLOSE, 0, 0 ); err = DeviceIoControl( hFile, 1, data, 16, 0, 0, &rec, 0 ); err = DeviceIoControl( hFile, 2, 0, 0, 0, 0, &rec, 0 ); CloseHandle( hFile ); 使用倒挺正常的,但用Vxd Viewer观察发现CloseHandle( hFile )不能卸载,my.vxd还在系统中。我试过CreateFile的各种参数都不行。 这时若修改my.vxd再运行上面这段程序,发现系统中的my.vxd还是修改以前的,必须重新启动WIN。 请各位指教到底哪儿不对? 2,我在VXD中将user32.dll中的MessageBoxA替换成我的MyMessageBox,发现若MyMessageBox调用普通函数是正常的,若在MyMessageBox中调用MessageBoxA,别的程序也能弹出MessageBoxA,但确定后却报异常,重新运行别的程序还是能弹出MessageBoxA,但确定后却报异常。我感觉好象是VXD中不能调用窗口对象,不知是不是因为堆栈的原因。 谁能告诉小弟原因? |
|
最新喜欢:![]() |
沙发#
发布于:2002-03-29 13:00
对于第一个问题,尝试改一下代码
HANDLE hFile = CreateFile( \"\\\\\\\\.\\\\my.vxd\", 0, 0, 0, CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE, 0); |
|
板凳#
发布于:2002-03-29 13:32
多谢yanghui, 原来是小弟一时疏忽,看错了参数位置,第一个问题已经解决。不知谁能解决第二个问题?
|
|
地板#
发布于:2002-03-29 21:05
你的第二个问题我没看懂,问的是啥?
是你的程序调用MessageBoxA,后转发MyMessageBox,在MyMessageBox中再调用MessageBoxA吗? 如果是的你第二次进如MessageBoxA换原没有? |
|
|
地下室#
发布于:2002-03-30 03:48
试试DeleteFile. :P :P
|
|
|
5楼#
发布于:2002-03-30 10:28
16位的API会调用,VtoolsD中有详细的说明。
我是这样做的,通过DeciceIOControl将User32.dll的地址传给VXD,然后根据PE格式找倒MessageBoxA,MessageBeep等等这些函数的输出表位置,将它改成MyMessageBox的地址,这样别的程序调用MessageBoxA就变成调用我的MyMessageBox。我发现,如果MyMessageBox只调用VXD里的函数,一切正常,若调用MessageBoxA,MessageBeep这些函数(我先保存了这些函数的地址),别的程序也能弹出消息框,但按确定后就异常,每次都如此。 |
|
6楼#
发布于:2002-03-30 11:46
Ring0怎么可以随意调用Ring3的任务???
|
|
|