When lstrcmpiA was moved from ole2nls.c to locale.c, (around 28th June) the results of comparisons in some cases became reversed. For example, the underscore now returns as greater than alphabetic characters, whereas it used to return as less than alphabetic characters. The older behaviour was consistent with Win2k.
The output below is from the following source: ---begin test program--- #include <windows.h> #include <stdio.h> char *test_strings[] = { "_", "A", "a", "z", "Z", 0 }; void test_string(char *pch) { char **ppch = test_strings; while (*ppch) { printf("%s\t%s\t%d\n", pch, *ppch, lstrcmpiA(pch, *ppch)); ++ppch; } } int main(int argc, char **argv) { char **ppch = test_strings; while (*ppch) test_string(*ppch++); return 0; } ---end test program--- ---Wine output from immediately before the change--- _ _ 0sorts _ A -1 _ a -1 _ z -1 _ Z -1 A _ 1 A A 0 A a 0 A z -1 A Z -1 a _ 1 a A 0 a a 0 a z -1 a Z -1 z _ 1 z A 1 z a 1 z z 0 z Z 0 Z _ 1 Z A 1 Z a 1 Z z 0 Z Z 0 ---End--- ---Wine output from immediately after the change--- _ _ 0 _ A 1 _ a 1 _ z 1 _ Z 1 A _ -1 A A 0 A a 0 A z -1 A Z -1 a _ -1 a A 0 a a 0 a z -1 a Z -1 z _ -1 z A 1 z a 1 z z 0 z Z 0 Z _ -1 Z A 1 Z a 1 Z z 0 Z Z 0 ~---End---