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

小弟初学VXD,请教两个问题,每个5-10分

楼主#
更多 发布于:2002-03-29 10:38
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中不能调用窗口对象,不知是不是因为堆栈的原因。
谁能告诉小弟原因?

最新喜欢:

flyajiflyaji
yanghui
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2009-10-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-29 13:00
对于第一个问题,尝试改一下代码
HANDLE hFile = CreateFile( \"\\\\\\\\.\\\\my.vxd\", 0, 0, 0, CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE, 0);
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-29 13:32
多谢yanghui, 原来是小弟一时疏忽,看错了参数位置,第一个问题已经解决。不知谁能解决第二个问题?
流氓兔
驱动老牛
驱动老牛
  • 注册日期2001-06-27
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-29 21:05
你的第二个问题我没看懂,问的是啥?
是你的程序调用MessageBoxA,后转发MyMessageBox,在MyMessageBox中再调用MessageBoxA吗?
如果是的你第二次进如MessageBoxA换原没有?
我是流氓!!!我怕谁!!! 不!!应该是我是老流氓!!!我怕谁!!![img]http://202.98.116.70:888/cgi-bin/newmov/bbs/attachment.cgi?forum=4&topic=25473&postno=1&type=.jpg[/img]
zhange1
驱动牛犊
驱动牛犊
  • 注册日期2001-12-10
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-30 03:48
试试DeleteFile. :P :P
高歌纵情,长笑舒意
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-30 10:28
16位的API会调用,VtoolsD中有详细的说明。
我是这样做的,通过DeciceIOControl将User32.dll的地址传给VXD,然后根据PE格式找倒MessageBoxA,MessageBeep等等这些函数的输出表位置,将它改成MyMessageBox的地址,这样别的程序调用MessageBoxA就变成调用我的MyMessageBox。我发现,如果MyMessageBox只调用VXD里的函数,一切正常,若调用MessageBoxA,MessageBeep这些函数(我先保存了这些函数的地址),别的程序也能弹出消息框,但按确定后就异常,每次都如此。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-03-30 11:46
Ring0怎么可以随意调用Ring3的任务???
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
游客

返回顶部