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:
          push    SSZ00644F7C_Create_D3D9Ex_interface_
          push    eax
          call    edx
          add    esp,00000008h
          push    L008FC114
          push    00000020h
          call    jmp_d3d9_dll_DelayImport_Direct3DCreate9Ex
          mov    eax,[L008FC114]
          cmp    eax,edi
          jnz    L0048DFD1
          push    SSZ00644F54_Failed_to_create_Direct3D_9ex_de
          call    SUB_L0048C7B0
          add    esp,00000004h
          pop    edi
          xor    al,al
          pop    esi
          add    esp,00000018h
          retn

DMMのあるゲームが動かないというので調査してたのですが、衝撃的なことが分かりました。

DWMAPI.DLL のDwmEnableMMCSS の関数の存在の有無だけで Vistaかどうか判定して
Direct3DCreate9Ex を呼び出して勝手にクラッシュしていると判明

いや。さすがに、Multimedia Class Schedule Service  をDirectX9関連として紐づけるのは無理あると思うんだけど…。

なんだかなぁ…。
こういう行儀の悪いプログラムが結構あるなら 魔改造版 Windows 2000の dwmapi.dllをsystemxpに退避したほうがいいのかもしれない。

プログラムみたら、 GameMaker:Studio Windows C++ Runnerって書いてあった

GameMaker: Studio | YoYo Games

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です