WineやWindows 2000でカスタムメイド3D2の一部機能が動作しない原因が判明

カスタムメイド3D2エディット体験版をWin2000で安定動作させるパッチ
パッチで無理やりクラッシュを回避する処理を作ったものの、動作しない原因を調べてみました。

Windows 7の D3D11.DLL の D3D11CoreCreateDevice 内の処理に

          push    00000003h
          push    L10001370
          call    D3D11CoreRegisterLayers
                :

 L10001370:
          dd    00000000h
         dd    L1000F8AF
         dd    L1000F94F
         dd    L1000F9EC
          dd    00000040h
         dd    L1000F8AF
         dd    L1000F94F
         dd    L1000F9EC
          dd    FFFFFFFFh
         dd    L1000F8AF
         dd    L1000F94F
         dd    L1000F9EC
          dd    FFFFFFFFh

こういうのがあります

 L1000F9EC:

        :

 L1000FAC3:
          cmp    edi,00000040h
          jz     L1000FAFF
          cmp    edi,FFFFFFFFh
          jz     L1000FAD6
          mov    eax,esi
          call    SUB_L10017BB0
          jmp    L1000FAA6
 L1000FAD6:
          push    0000000Ch
          pop    ecx
          push    [ebp+1Ch]
          mov    esi,ebx
          push    [ebp+18h]
          lea    edi,[ebp-4Ch]
          rep movsd
          mov    edi,[ebx]
          push    eax
          mov    ecx,00000640h
          add    [ebp-4Ch],ecx
          sub    [ebp-48h],ecx
          lea    eax,[ebp-4Ch]
          push    eax
          call    SUB_L10013354
          jmp    L1000FAA6
 L1000FAFF:
          push    0000000Ch
          pop    ecx
          push    [ebp+1Ch]
          mov    esi,ebx
          push    [ebp+18h]
          lea    edi,[ebp-54h]
          rep movsd
          push    eax
          push    [ebx]
          mov    ecx,000002C0h
          add    [ebp-54h],ecx
          sub    [ebp-50h],ecx
          lea    edi,[ebp-54h]
          mov    [ebp-24h],eax
          call    SUB_L10013584
          jmp    L1000FAA6
 L1000FB2D:
          mov    eax,L1000FB33
          retn

赤字の関数の処理を追うと、こんな処理が

 SUB_L10013354:
          push    00000014h
          mov    eax,L100738E4
          call    SUB_L10072FBD
          mov    [ebp-10h],edi
          push    [ebp+08h]
          and    dword ptr [ebp-04h],00000000h
          lea    esi,[edi+40h]
          push    esi
          mov    dword ptr [edi],L1000A63C
          call    SUB_L10015F99
          mov    eax,[ebp+0Ch]
          mov    dword ptr [esi],L1000A1B8
          mov    dword ptr [esi+04h],L1000A1A4
          mov    dword ptr [esi+08h],L1000A0D8
          mov    dword ptr [esi+14h],L1000A0C4
          mov    dword ptr [esi+18h],L1000A0A4
          mov    dword ptr [esi+1Ch],L1000A088
          mov    dword ptr [esi+20h],L1000A078
          mov    dword ptr [esi+24h],L1000A064
          mov    dword ptr [esi+28h],L1000A038
          mov    dword ptr [esi+2Ch],L1000A028
          mov    [esi+30h],eax
          and    dword ptr [ebp-14h],00000000h
          mov    [ebp-20h],esi
       &n
bsp;  mov    dword ptr [ebp-18h],L10064CE1
          push    [ebp+14h]
          mov    byte ptr [ebp-04h],02h
          push    [ebp+10h]
          push    edi
          call    SUB_L10013300
          call    SUB_L10017BB0
          call    SUB_L100730A9
          retn    0010h

ここで、DirectX11の動作モードによって、機能関数を登録するようになっています

この機能関数が WineD3Dの D3D11.dllには存在しないので、呼び出されるとNULLが返ってクラッシュする模様

 DLL_Color_CreateByteDataFromTexture:
          push    ebp
          mov    ebp,esp
          mov    ecx,[ebp+08h]
          test    ecx,ecx
          jz     L10004773
          mov    edx,[ebp+0Ch]
          test    edx,edx
          jz     L10004773
          mov    eax,[ebp+10h]
          test    eax,eax
          jz     L10004773
          push    eax
          call    SUB_L100096D0
          add    esp,00000004h
          pop    ebp
          retn

 SUB_L100096D0:
          push    ebp
          mov    ebp,esp
          push    FFFFFFFFh
        :
          mov    dword ptr [ebp-80h],00000000h
          mov    dword ptr [ebp-04h],00000000h
          lea    edx,[ebp-6Ch]
          mov    eax,[esi+08h]
          mov    dword ptr [ebp-6Ch],00000000h
          push    edx
          push    eax
          mov    ecx,[eax]
          call    [ecx+000000A0h]

こんな感じWin7のどこに対応するかと言うと

 L1000A0D8:
         dd    L100157EA
         dd    L1001597F
         dd    L100158E9
         dd    L10018014
         dd    L100181CC
         dd    L1001842C
         dd    L1001868B
         dd    L1001896D
         dd    L10018C8F
         dd    L10018E99
         dd    L100190F3
         dd    L10019BA6
         dd    L10019318
         dd    L10019636
         dd    L1001975F
         dd    L10019937
         dd    L10019432
         dd    L10019534
         dd    L10019A60
         dd    L10019B62
         dd    L10019CF7
         dd    L1001A01B
         dd    L1001A21F
         dd    L1001A4A1
         dd    L1001A6AC
         dd    L1001A84B
         dd    L1001A8CB
         dd    L1001AA35
         dd    L1001C02B
         dd    L1001B6BB
         dd    L1001B6DB
         dd    L1001B7F7
         dd    L1001B818
         dd    L1001B96F
         dd    L1003017F
         dd    L10015A18
         dd    L10015A09
         dd    L100159F0
         dd    L1001BC70
         dd    L1001C06B
         dd    L1001C1CF (+0xa0)
         dd    L1001C08D
         dd    L1001C123
         dd    L1001C1CF
         dd    L100270F4
         dd    L10027119
         dd    L10027333
         dd    L1002756F
         dd    L1001C051
         dd    L1001C05E
         dd    L1001C13D
 L1000A1A4:

 L1001C1CF:
          Align    2
          push    ebp
    &nbs
p;     mov    ebp,esp
          push    esi
          mov    esi,[ebp+08h]
          mov    eax,[esi+000001C8h]
          mov    eax,[eax+0Ch]
          mov    ecx,[eax]
          push    eax
          call    [ecx+04h]
          mov    eax,[esi+000001C8h]
          mov    ecx,[eax+14h]
          mov    eax,[ebp+0Ch]
          mov    [eax],ecx
          pop    esi
          pop    ebp
          retn    0008h

こうですね・ω・



おすすめ

コメントを残す

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