本帖最后由 不死鸟之翼 于 2013-10-7 11:06 编辑 其实我们忽略了一个问题,DirectX其实是以COM组件的形式提供的,dmusic的加载肯定不在程序内,HOOK这里显然没用{:2_263:}OD抓不到也正常 所以禁止相关组件的初始化理论上可以达到防止卡死的目的 如果你有Dx9的SDK的话可以试试挂接一下CoCreateInstance和/或与之相关的API,判断第一个参数CLSID是不是CLSID_DirectMusic***(具体是哪个我不敢肯定),如果是的话禁止初始化应该就没问题了 我这里只有系统引导后第一次启动游戏会卡,所以其实也没什么影响。 PS:唉我第一天来6R就这么作死233 |
第一个方法没用无论如何都会加载系统的,所以1L里只好直接禁止运行该DLL。 第二个方法早就试过了,在OD都无法断点到加载该DLL,应该说其根本不是用LoadLibraryW和LoadLibraryA也不是用LoadLibraryExW和LoadLibraryExA加載該DLL的。其的加載方式不詳。 並且導致這個無響應問題的原因是因為瑞星殺毒v16,我剛又裝了一遍瑞星殺毒v16後發現又出現MIDI無響應的問題了需等待18秒。而卸載瑞星殺毒後只用4秒。 |
我这里是第一次运行时会卡一阵子,鼠标无响应,整个屏幕停止重绘,之后就好了{:2_270:} 如果楼主是每次都这样的话,可以试试两个方法 1 放一个假的dmusic.dll到游戏目录下,因为Windows的DLL加载顺序问题不知道能不能骗过去 2 如果每次启动都会卡,楼主会编程的话自己写一个Loader,阻止RM程序加载dmusic.dll即可 具体实现的话,方便起见可以用微软的Detours库。 启动游戏进程的时候使用DetourCreateProcessWithDllEx,使用方法和CreateProcess差不多,多出的两个参数,第一个填写你写的DLL名称,第二个给NULL即可 DLL方面,在DllMain里面进行API HOOK即可 过程类似这样,以C++为例 DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(LPVOID&)Old_LoadLibraryW,New_LoadLibraryW); DetourTransactionCommit();//一定要commit才能生效 至于拦截的处理 HMODULE (WINAPI* Old_LoadLibraryW)(LPCWSTR lpLibFileName)=LoadLibraryW; HMODULE WINAPI New_LoadLibraryW(LPCWSTR lpLibFileName) { if(wcscmp(lpLibFileName,L"dmusic.dll")==0)//如果加载的是dmusic.dll { return NULL;//直接让函数失败 } return Old_LoadLibraryW(lpLibFileName);//不是的话正常加载 } 这样就可以屏蔽RM对这个DLL的加载,其他应用不受影响。 好吧我承认我很懒,随手写的没有测试 有兴趣的可以做出来 Detours可以从微软官网下载,需要自己编译一下,挺方便的,或者你自己写API HOOK也行 只是代码比较多 |
千千靜聽就算禁止那個DLL後也可以播放MIDI,這是因為其不是使用DX的MIDI而是自己的 |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-5 21:49
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.