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 の最終パラメータにはあまり大きい値を入れると関数に失敗するわけです。
Comments