[Bug 35009] Hoshizora no Memoria (visual novel) shows "failure to open <invalid path>" dialog after scene change

wine-bugs at winehq.org wine-bugs at winehq.org
Tue Dec 3 16:23:13 CST 2013


http://bugs.winehq.org/show_bug.cgi?id=35009

--- Comment #7 from Anastasius Focht <focht at gmx.net> 2013-12-03 16:23:13 CST ---
Hello folks,

I think this is another case of incompatibility between Wine's use of
unicode.org and Microsoft collation tables.

The culprit is a string array lookup/comparison loop where the app uses
lstrcmpiA() which of doesn't work correctly for Wine if you pass in japanese
character strings.

string2 (argument on stack, passed in):

--- snip ---
Address   Hex dump                                         ASCII
0033FA90  43 48 52 5F|96 B2 5F 97|63 8F AD 00|00 00 00 00| CHR_–²_—c­
--- snip ---

It tries the following string1 values before giving up (I just cut the hexdump
at the NULL terminator):

--- snip ---
Address   Hex dump                                         ASCII
00640341  43 48 52 5F|90 E7 94 67|5F 8A EC 5F|83 70 83 57| CHR_ç”g_Šì_ƒpƒW
00640351  83 83 83 7D|4C 5F 95 5C|8F EE 00                 ƒƒƒ}L_•\î
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
00640C0B  43 48 52 5F|91 8D 88 EA|98 4E 5F 8A|EE 5F 83 47| CHR_‘ˆê˜N_Šî_ƒG
00640C1B  83 76 83 8D|83 93 00                             ƒvƒƒ“
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
00640643  43 48 52 5F|90 E7 94 67|5F 8A EE 5F|89 C4 8E 84| CHR_ç”g_Šî_‰ÄŽ„
00640653  95 9E 5F 90|81 8F 6F 52|5F 95 5C 8F|EE 00        •ž_oR_•\î
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
00640735  43 48 52 5F|90 E7 94 67|5F 94 DF 5F|83 70 83 57| CHR_ç”g_”ß_ƒpƒW
00640745  83 83 83 7D|5F 95 5C 8F|EE 00                    ƒƒƒ}_•\î
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
006407A8  43 48 52 5F|90 E7 94 67|5F 94 DF 5F|89 C4 8E 84| CHR_ç”g_”ß_‰ÄŽ„
006407B8  95 9E 5F 90|81 8F 6F 4C|5F 95 5C 8F|EE 00        •ž_oL_•\î
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
006407FD  43 48 52 5F|90 E7 94 67|5F 94 DF 5F|89 C4 8E 84| CHR_ç”g_”ß_‰ÄŽ„
0064080D  95 9E 5F 95|5C 8F EE 00|                         •ž_•\î
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
00640762  43 48 52 5F|90 E7 94 67|5F 94 DF 5F|89 C4 8E 84| CHR_ç”g_”ß_‰ÄŽ„
00640772  95 9E 4C 00|                                     •žL
--- snip ---

--- snip ---
Address   Hex dump                                         ASCII
00640776  43 48 52 5F|90 E7 94 67|5F 94 DF 5F|89 C4 8E 84| CHR_ç”g_”ß_‰ÄŽ„
00640786  95 9E 4C 5F|95 5C 8F EE|00                       •žL_•\î
--- snip ---

If the comparison results in equality (=0) it bails out to a code path which
indicates "found" to caller.
If the comparison returns >= it tweaks the lookup to search another array
range.

(0x90,0x96) = -1
(0x91,0x96) = 1
(0x90,0x96) = -1
...

Not sure why the authors chose to use lstrcmpiA() when even MSDN states:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms647489%28v=vs.85%29.aspx

--- quote ---
For some locales, the lstrcmpi function may be insufficient. If this occurs,
use CompareString to ensure proper comparison. For example, in Japan call with
the NORM_IGNORECASE, NORM_IGNOREKANATYPE, and NORM_IGNOREWIDTH values to
achieve the most appropriate non-exact string comparison. The
NORM_IGNOREKANATYPE and NORM_IGNOREWIDTH values are ignored in non-Asian
locales, so you can set these values for all locales and be guaranteed to have
a culturally correct "insensitive" sorting regardless of the locale. Note that
specifying these values slows performance, so use them only when necessary.
--- quote ---

If you want to debug it: the loop starts at 0x0043CD55, lstrcmpiA() at
0x0043CD7E.

So you might hook to one of the already existing lstrcmpi/CompareStringA/W
bugs.

Regards

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.


More information about the wine-bugs mailing list