Windows XP で動作していた MultiByteToWideChar が Windows 7 や 10でエラーになる理由が酷い件について

以下のコードは Windows 2000上の netapi32 で実際に使われてるコードです

MultiByteToWideChar(65001, NULL, src, -1, dst, 0x7fffffff);

ところが、このコード Windows 7 や 10で実行するとバッファーサイズが足りないというエラーになってこけます

でも、なぜか 0x7fffffff を 0x7f7fffff 程度に減らすと動きます
75CA84B8 50                   push        eax
75CA84B9 8D 04 09             lea         eax,[ecx+ecx]
75CA84BC F7 D9                neg         ecx
75CA84BE 50                   push        eax
75CA84BF 1B C9                sbb         ecx,ecx
75CA84C1 23 8D 24 FF FF FF    and         ecx,dword ptr [ebp-0DCh]
75CA84C7 51                   push        ecx
75CA84C8 FF 15 A8 72 D6 75    call        RtlUTF8ToUnicodeN

RtlUTF8ToUnicodeN: の第二パラメータ UnicodeStringMaxByteCount に MultiByteToWideChar の最終パラメータの2倍の値が代入されて呼ばれたときに 0xc0000203 が返ってくるわけです


76EDE571 8B 5D 14             mov         ebx,dword ptr [ebp+14h]
76EDE574 D1 E9                shr         ecx,1
76EDE576 56                   push        esi
76EDE577 8B 75 18             mov         esi,dword ptr [ebp+18h]
76EDE57A 57                   push        edi
76EDE57B 8D 0C 4A             lea         ecx,[edx+ecx*2]
76EDE57E 33 D2                xor         edx,edx
76EDE580 89 4D FC             mov         dword ptr [ebp-4],ecx

RtlUTF8ToUnicodeN 内部で、UnicodeStringDestination のアドレスにUnicodeStringMaxByteCountを加算したアドレスが設定されるのですが、ここでバッファーオーバーフローが発生します。

なので、Windows 7/10で MultiByteToWideChar の最終パラメータにはあまり大きい値を入れると関数に失敗するわけです。

おすすめ

コメントを残す

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