Windows 2000のShell_NotifyIcon を解析してみた

前回の記事の続き
魔改造版Win2000でXPのタスクマネージャを動かすには?

          mov    ebx,[ebp+0Ch] // NOTIFYICONDATAW
          mov    ecx,000000EBh
          xor    eax,eax
          lea    edi,[ebp-000003C0h]
          mov    [ebp-000003C4h],esi
          mov    [ebp-04h],esi
          rep stosd
          mov    ecx,[ebx]
          mov    eax,000003A8h // cbSize
          cmp    ecx,eax
          jnz    L73B181B8
          mov    dword ptr [ebp+0Ch],0000001Fh
          jmp    L73B181C4
 L73B181B8:
          mov    ecx,00000098h
          mov    dword ptr [ebp+0Ch],00000007h

これを見ると、 936byte(0x3a8) じゃなかった場合 構造体サイズを 152byte 決め打ちにして転送してることが分かる(0x98)

ANSI 版をみてみよう

          push    esi
          mov    esi,[ebp+0Ch] // NOTIFYICONDATAA
          push    edi
          mov    ecx,000000EAh
          xor    eax,eax
          lea    edi,[ebp-000003A8h]
          rep stosd
          mov    eax,[esi+04h]
          cmp    dword ptr [esi],000001E8h
          mov    [ebp-000003A4h],eax
          mov    eax,[esi+08h]
          mov    [ebp-000003A0h],eax
          mov    eax,[esi+0Ch]
          mov    [ebp-0000039Ch],eax
          mov    eax,[esi+10h]
          mov    [ebp-00000398h],eax
          mov    eax,[esi+14h]
          mov    dword ptr [ebp-000003A8h],000003A8h
          mov    [ebp-00000394h],eax
          jnz    L73B182E7

汚いコードだな(汗)

こっちは488byte (0x1e8)とcbSize を比較して違ってたら、 0x88 決め打ちらしい。

では修正してみよう

          mov    ebx,[ebp+0Ch] // NOTIFYICONDATAW
          mov    ecx,000000EBh
          xor    eax,eax
          lea    edi,[ebp-000003C0h]
          mov    [ebp-000003C4h],esi
          mov    [ebp-04h],esi
          rep stosd
          mov    eax,[ebx]
          mov    ecx,000003A8h // cbSize
          cmp    ecx,eax
          ja    L73B181B8
          mov    dword ptr [ebp+0Ch],0000001Fh
          jmp    L73B181C4
 L73B181B8:
          mov    ecx,00000098h
          mov    dword ptr [ebp+0Ch],00000007h

Unicode 版 サイズが936byte(0x3a8) 以上だったら、そっちを使うように変更

          push    esi
          mov    esi,[ebp+0Ch] // NOTIFYICONDATAA
          push    edi
          mov    ecx,000000EAh
          xor    eax,eax
          lea    edi,[ebp-000003A8h]
          rep stosd
          mov    eax,[esi+04h]
          cmp    dword ptr [esi],000001E8h
          mov    [ebp-000003A4h],eax
          mov    eax,[esi+08h]
          mov    [ebp-000003A0h],eax
          mov    eax,[esi+0Ch]
          mov    [ebp-0000039Ch],eax
          mov    eax,[esi+10h]
          mov    [ebp-00000398h],eax
          mov    eax,[esi+14h]
          mov    dword ptr [ebp-000003A8h],000003A8h
          mov    [ebp-00000394h],eax
          jb    L73B182E7
          mov    eax,[esi+00000098h]
          mov    [ebp-00000290h],eax
          mov    eax,[esi+0000009Ch]
          mov    [ebp-0000028Ch],eax
          mov    eax,[esi+000001A0h]
          mov    [ebp-00000088h],eax
          mov    eax,[esi+000001E4h]
          mov    [ebp-04h],eax
          jmp    L73B182F8
 L73B182E7:
          and    dword ptr [e
bp-0000039Ch],00000007h
          mov    dword ptr [ebp-000003A8h],00000098h

こっちはこれだけ・ω・

おすすめ

コメントを残す

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