PHP 5.6 Alpha 3 を Windows 2000で動かす実験 その1

PHP For Windows: Binaries and sources QA Releases
Windows 版の PHP 5.6 Alpha 3 のバイナリが公開されたので、魔改造版のWindows 2000で動作するかテストしてみました。

<?php
echo 'Current PHP version: ' . phpversion();
?>

ソースは前回と同じ

C:\php-5.6.0alpha3-Win32-VC11-x86>php phptest.php
Current PHP version: 5.6.0alpha3
C:\php-5.6.0alpha3-Win32-VC11-x86>

問題なしです。

ただし、1つ動かないモジュールがありました。

php_sockets.dll
iphlpapi.dll の if_nametoindex
ws2_32.dll の WSASendMsg
を参照していました。

んん、両方 Vista 以降に実装された関数ですね。
ちょっとどうするか考えてみることにします

続き

 if_nametoindex:
          push    ebp
          mov    ebp,esp
          sub    esp,0000000Ch
          and    dword ptr [ebp-04h],00000000h
          lea    eax,[ebp-0Ch]
          push    eax
          push    [ebp+08h]
          call    ConvertInterfaceNameToLuidA
          test    eax,eax
          jz     L4AD118C5
          xor    eax,eax
          jmp    L4AD118DB
 L4AD118C5:
          lea    eax,[ebp-04h]
          push    eax
          lea    eax,[ebp-0Ch]
          push    eax
          call    ConvertInterfaceLuidToIndex
          neg    eax
          sbb    eax,eax
          not    eax
          and    eax,[ebp-04h]
 L4AD118DB:
          leave
          retn    0004h

 ConvertInterfaceNameToLuidA も ConvertInterfaceLuidToIndex も無いのだよ

 WSASendMsg:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          sub    esp,00000020h
          push    esi
          xor    esi,esi
          cmp    dword ptr [L4B0F504C],L4B0D3084
          mov    [ebp-08h],esi
          jnz    L4B0EA55A
          cmp    [L4B0F5070],esi
          jz     L4B0EA55A
          mov    [ebp-04h],esi
          jmp    L4B0EA566
 L4B0EA55A:
          call    SUB_L4B0D60C7
          cmp    eax,esi
          mov    [ebp-04h],eax
          jnz    L4B0EA572
 L4B0EA566:
          cmp    [ebp+08h],esi
          jnz    L4B0EA583
          mov    dword ptr [ebp-04h],00002726h
 L4B0EA572:
          push    [ebp-04h]
          call    [KERNEL32.dll!SetLastError]
          or    eax,FFFFFFFFh
 L4B0EA57E:
          pop    esi
          leave
          retn    0018h
;------------------------------------------------------------------------------
 L4B0EA583:
          push    esi
          push    esi
          lea    eax,[ebp-08h]
          push    eax
          push    00000004h
          lea    eax,[ebp-0Ch]
          push    eax
          push    esi
          push    esi
          push    4800001Bh
          push    [ebp+08h]
          call    WSAIoctl
          cmp    eax,FFFFFFFFh
          jnz    L4B0EA5AE
          call    [KERNEL32.dll!GetLastError]
          mov    [ebp-04h],eax
          jmp    L4B0EA572
 L4B0EA5AE:
          mov    eax,[ebp+0Ch]
          mov    [ebp-20h],eax
          mov    eax,[ebp+10h]
          mov    [ebp-1Ch],eax
          mov    eax,[ebp+14h]
          mov    [ebp-18h],eax
          mov    eax,[ebp+18h]
          push    esi
          mov    [ebp-14h],eax
          mov    eax,[ebp+1Ch]
          push    esi
          mov    [ebp-10h],eax
          lea    eax,[ebp-08h]
          push    eax
          push    00000004h
          lea    eax,[ebp-04h]
          push    eax
          push    00000014h
          lea    eax,[ebp-20h]
          push    eax
          push    C8000020h
          push    [ebp-0Ch]
          call    WSAIoctl
          cmp    [ebp-04h],esi
          jnz    L4B0EA572
          xor    eax,eax
          jmp&
nbsp;   L4B0EA57E

 SUB_L4B0D60C7:
          push    ebp
          mov    ebp,esp
          push    ecx
          push    ecx
          lea    eax,[ebp-04h]
          push    eax
          lea    eax,[ebp-08h]
          push    eax
          call    [L4B0F504C]
          leave
          retn

こちらの実装は比較的楽そう

おすすめ

1件の返信

  1. 神楽 より:

    よろしければXP用も作っていただきたいです。
    わくわく。

コメントを残す

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