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 には同様の処理が無いようです

おすすめ

コメントを残す

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