https://bugs.winehq.org/show_bug.cgi?id=27364
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Keywords| |dotnet CC| |focht@gmx.net Component|-unknown |ole32 Hardware|x86-64 |x86 Version|unspecified |1.3.21 Summary|osu! crashes upon install. |Osu! fails to install | |(ole32.IIDFromString | |returns unexpected error | |code)
--- Comment #8 from Anastasius Focht focht@gmx.net --- Hello folks,
confirming, the installer still fails. The original issue has most likely evolved/was fixed a long time ago.
Prerequisite: 'winetricks -q dotnet35sp1'
--- snip --- $ WINEDEBUG=+tid,+seh,+relay wine ./osu!install.exe >>log.txt 2>&1 ... 0024:Call ole32.IIDFromString(03357728 L"{C:\users\focht\Temp\{7DCAD80E-DDB2-42DC-92F9-92E9AE2D561C}\osu!.msi}",0033e4a4) ret=004530b2 ... 0024:Call ntdll.NtCreateKey(0033e1c4,02000000,0033e1ac,00000000,00000000,00000000,00000000) ret=7e5ae0a0 0024:Ret ntdll.NtCreateKey() retval=00000000 ret=7e5ae0a0 0024:Call ntdll.RtlInitUnicodeString(0033e230,0014cd98 L"{C:\users\focht\Temp\{7DCAD80E-DDB2-42DC-92F9-92E9AE2D561C}\osu!.msi}\CLSID") ret=7e5ae507 0024:Ret ntdll.RtlInitUnicodeString() retval=0033e230 ret=7e5ae507 0024:Call ntdll.NtOpenKey(0033e288,02000000,0033e238) ret=7e5ae523 0024:Ret ntdll.NtOpenKey() retval=c0000034 ret=7e5ae523 0024:Call ntdll.RtlNtStatusToDosError(c0000034) ret=7e5ae52e 0024:Ret ntdll.RtlNtStatusToDosError() retval=00000002 ret=7e5ae52e 0024:Call ntdll.RtlFreeHeap(00110000,00000000,0014cd98) ret=7e5b2ac2 0024:Ret ntdll.RtlFreeHeap() retval=00000001 ret=7e5b2ac2 0024:Ret ole32.IIDFromString() retval=800401f3 ret=004530b2 ... 0024:Call KERNEL32.FormatMessageW(00001100,00000000,800401f3,00000400,0033e288,00000000,00000000) ret=0041a52d 0024:Ret KERNEL32.FormatMessageW() retval=00000000 ret=0041a52d ... 0024:Call KERNEL32.WideCharToMultiByte(00000000,00000000,03357d68 L"0x800401f3 - Error in ::IIDFromString('C:\users\focht\Temp\{7DCAD80E-DDB2-42DC-92F9-92E9AE2D561C}\osu!.msi'): 0x800401f3",ffffffff,00000000,00000000,00000000,00000000) ret=00416855 0024:Ret KERNEL32.WideCharToMultiByte() retval=00000079 ret=00416855 ... 0024:Call KERNEL32.RaiseException(e06d7363,00000001,00000003,0033e370) ret=0048ff02 0024:trace:seh:raise_exception code=e06d7363 flags=1 addr=0x7b83a97b ip=7b83a97b tid=0024 0024:trace:seh:raise_exception info[0]=19930520 0024:trace:seh:raise_exception info[1]=0033e494 0024:trace:seh:raise_exception info[2]=004f7698 0024:trace:seh:raise_exception eax=7b8269e1 ebx=7b8bb000 ecx=19930520 edx=0033e2b4 esi=0033e35c edi=0033e320 0024:trace:seh:raise_exception ebp=0033e2f8 esp=0033e294 cs=0023 ds=002b es=002b fs=0063 gs=006b flags=00200283 --- snip ---
IIDFromString() failure is expected.
The error code 0x800401f3 -> CO_E_CLASSSTRING returned by Wine is something the installer doesn't expect.
MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687262%28v=vs.85%2...
--- quote --- IIDFromString function
Converts a string generated by the StringFromIID function back into the original interface identifier (IID).
... Return value
This function can return the standard return values E_INVALIDARG, E_OUTOFMEMORY, and S_OK. ... --- quote ---
The installer (caller) code disassembly reveals it only handles E_INVALIDARG and CO_E_IIDSTRING:
--- snip --- ... 004530AA 51 PUSH ECX 004530AB 50 PUSH EAX 004530AC FF15 94264D00 CALL DWORD PTR DS:[<&ole32.IIDFromString> 004530B2 6A 00 PUSH 0 004530B4 6A 01 PUSH 1 004530B6 8D75 B4 LEA ESI,DWORD PTR SS:[EBP-4C] 004530B9 8BF8 MOV EDI,EAX 004530BB E8 F144FBFF CALL osu!inst.004075B1 004530C0 81FF F4010480 CMP EDI,800401F4 ; CO_E_IIDSTRING 004530C6 0F84 CF000000 JE osu!inst.0045319B 004530CC 81FF 57000780 CMP EDI,80070057 ; E_INVALIDARG 004530D2 0F84 C3000000 JE osu!inst.0045319B 004530D8 85FF TEST EDI,EDI 004530DA 0F84 B7000000 JE osu!inst.00453197 004530E0 0F8D B5000000 JGE osu!inst.0045319B ... --- snip ---
The problem can be attributed to Wine's code sharing in this place.
CLSIDFromString() and IIDFromString() share the same implementation (IIDFromString forwards to CLSIDFromString).
CLSIDFromString() can return more/different error codes than IIDFromString() as documented in MSDN.
Source: http://source.winehq.org/git/wine.git/blob/62d9b5a0e079b6db8c16444d92fe85cfa...
$ sha1sum osu!install.exe 876bfc53a7bbd1948c44b0e58ed09e93fd8fcffe osu!install.exe
$ du -sh osu!install.exe 48M osu!install.exe
$ wine --version wine-1.7.12
Regards