GameMaker C++のエンジンがDWMAPI.DLLの存在の有無でVistaか判定してる件
SUB_L0048DE80: mov eax,[esp+04h] sub esp,00000018h push esi push edi push SWC00644FFC_dwmapi_dll mov [L008FBF80],eax call [KERNEL32.dll!LoadLibraryW] mov esi,eax xor edi,edi cmp esi,edi jz L0048DECD mov eax,[L006A1038] mov ecx,[eax] mov edx,[ecx+08h] push SSZ00644FE4_Enable_DwmEnableMMCSS_ push eax call edx add esp,00000008h push SSZ00644FD4_DwmEnableMMCSS push esi call [KERNEL32.dll!GetProcAddress] push 00000001h call eax mov byte ptr [L006A5BA4],00h L0048DECD: mov cl,[esp+30h] mov byte ptr [L008FBF90],00h mov dword ptr [esp+0Ch],80000000h test cl,02h jz L0048DEF0 mov byte ptr [L008FBF90],01h mov [esp+0Ch],edi L0048DEF0: xor al,al mov [L006A1408],al test cl,08h jz L0048DF03 mov al,01h mov [L006A1408],al L0048DF03: movzx eax,al imul eax,01010101h mov [L006A131C],eax mov [L006A1320],eax mov dword ptr [esp+24h],00000042h test cl,04h jnz L0048DF2C cmp byte ptr [L0090E0ED],00h jz L0048DF34 L0048DF2C: mov dword ptr [esp+24h],00000022h L0048DF34: mov byte ptr [L006D9C44],00h test cl,10h jz L0048DF47 mov byte ptr [L006D9C44],01h L0048DF47: cmp byte ptr [L006A5BA4],00h mov eax,[L006A1038] mov ecx,[eax] mov edx,[ecx+08h] jz L0048DF9C push SSZ00644FBC_Create_D3D9_interface_ push eax call edx add esp,00000008h push 00000020h call jmp_d3d9_dll_DelayImport_Direct3DCreate9 mov [L008FC110],eax cmp eax,edi jnz L0048DF8A push SSZ00644F98_Failed_to_create_Direct3D_9_devi call SUB_L0048C7B0 add esp,00000004h pop edi xor al,al pop esi add esp,00000018h retn L0048DF9C: |
DMMのあるゲームが動かないというので調査してたのですが、衝撃的なことが分かりました。
DWMAPI.DLL のDwmEnableMMCSS の関数の存在の有無だけで Vistaかどうか判定して
Direct3DCreate9Ex を呼び出して勝手にクラッシュしていると判明
いや。さすがに、Multimedia Class Schedule Service をDirectX9関連として紐づけるのは無理あると思うんだけど…。
なんだかなぁ…。
こういう行儀の悪いプログラムが結構あるなら 魔改造版 Windows 2000の dwmapi.dllをsystemxpに退避したほうがいいのかもしれない。
プログラムみたら、 GameMaker:Studio Windows C++ Runnerって書いてあった
Comments