Windows 2000 と PIP_ADAPTER_ADDRESSES
副題 UTAU Plugin autoCVVC Win2000 で エラーになる件について その3 なのです
UTAU Plugin autoCVVC Win2000 で エラーになる件について その1
Windows 2000 と PIP_ADAPTER_UNICAST_ADDRESS
UTAU Plugin autoCVVC Win2000 で エラーになる件について その2
例の Python ライブラリ調べてみたら、PIP_ADAPTER_ADDRESSES 構造体を取り出して、そこに含まれる、PIP_ADAPTER_UNICAST_ADDRESS を代入してるようでした。
つまり、PIP_ADAPTER_ADDRESSES を取り出す関数をトレースすれば何かわかるのでは?
という訳で解析してみました。
dwRetVal = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen); |
ターゲットの関数は GetAdaptersAddresses で PIP_ADAPTER_ADDRESSES 構造体のオフセット0x10 が代入先なのが分かりました
という訳で、 iphlpapi.dll の解析をしたところ
L773042E7: push ebp mov ebp,esp push ecx push ecx mov eax,[ebp+0Ch] mov eax,[eax] push edi xor edi,edi cmp eax,edi mov [ebp-04h],edi mov [ebp-08h],eax jz L7730440F test al,al jz L77304418 test byte ptr [ebp+20h],01h push ebx push esi jnz L773043FF push 00000030h // 構造体のサイズ 0x30 を確保 push edi mov edi,[KERNEL32.dll!GetProcessHeap] call edi mov ebx,[KERNEL32.dll!HeapAlloc] push eax call ebx mov esi,eax test esi,esi jz L77304413 push 00000010h push 00000000h call edi push eax call ebx mov ebx,eax test ebx,ebx jz L77304420 xor eax,eax mov edi,ebx stosd stosd stosd stosd mov eax,[ebp-08h] mov [ebx+04h],eax mov eax,[ebp+10h] mov word ptr [ebx],0002h mov ecx,[eax] mov [ecx],esi lea edi,[esi+08h] mov [eax],edi lea eax,[ebp+1Ch] push eax call [MSVCRT.dll!time] mov edx,[ebp+08h] pop ecx xor ecx,ecx mov [edi],ecx mov dword ptr [esi],00000030h // 構造体の代入 mov eax,[edx+0000027Ch] sub eax,[ebp+1Ch] mov [esi+0Ch],ebx // Address mov [esi+28h],eax // LeaseLifetime mov [esi+24h],eax // PreferredLifetime mov [esi+20h],eax // ValidLifetime xor eax,eax inc eax mov [esi+04h],ecx // Flags mov dword ptr [esi+10h],00000010h // Address mov [esi+14h],eax // PrefixOrigin mov [esi+18h],eax // SuffixOrigin cmp [edx+000001A4h],ecx mov ebx,0000FFFFh mov edi,0000FEA9h jz L773043CA mov ecx,[ebp-08h] and ecx,ebx cmp ecx,edi jz L7730442D push 00000003h pop ecx mov [esi+14h],eax // PrefixOrigin mov [esi+18h],eax // SuffixOrigin |
ここで、offset 0x2c の OnLinkPrefixLength は BAADF00D がはいったまま残ることが分かりました
残念ながら Vista には同様の処理が無いようです
Comments