https://bugs.winehq.org/show_bug.cgi?id=45366
Bug ID: 45366 Summary: A.R.E.S. Extinction Agenda 1.x (.NET 2.0, XNA 3.1 game) crashes during intro ('quartz' BasicAudio_put_Volume must return E_NOTIMPL if audio renderer filter not present) Product: Wine Version: 3.11 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: quartz Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
continuation of bug 26369
Workarounds for prerequisite bugs needed:
* bug 34622 ("Multiple games need CLSID_DMOWrapperFilter/DMO Wrapper Filter '{94297043-bd82-4dfd-b0de-8177739c6d20}', 'qasf.dll' (Neocron, Age of empires III Steam, .NET XNA 3.x/4.x games using Media classes)") * bug 45365 ("Multiple .NET XNA 3.x/4.x games using Microsoft.Xna.Framework.Media classes crash due to IWMPCore3::newMedia stub") * bug 26369 ("A.R.E.S. Extinction Agenda 1.x (.NET 2.0, XNA 3.1 game) crashes during intro ('quartz' FilterGraph2_Connect should translate HRESULT of failures more correctly)")
Trace log:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/ARES - Demo
$ file *.{dll,exe} AssetLoader.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows FlatRedBall.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows X10.FRB.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows ARES.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows unins000.exe: PE32 executable (GUI) Intel 80386, for MS Windows
$ WINEDEBUG=+seh,+relay,+quartz,+msacm wine ./ARES.exe >>log.txt 2>&1 ... 0045:Ret window proc 0x1002a270 (hwnd=0x2009a,msg="Microsoft.Xna.Framework.Media.WmpProxyThread",wp=00000000,lp=00000000) retval=00000000 ... 0045:Call msacm32.acmStreamOpen(09cded94,00000000,072f21e8,072f3e78,00000000,00000000,00000000,00000000) ret=7a71a231 0045:trace:msacm:acmStreamOpen (0x9cded94, (nil), 0x72f21e8, 0x72f3e78, (nil), 0, 0, 0) 0045:trace:msacm:acmStreamOpen src [wFormatTag=353, nChannels=2, nSamplesPerSec=44100, nAvgBytesPerSec=24002, nBlockAlign=8917, wBitsPerSample=16, cbSize=10] 0045:trace:msacm:acmStreamOpen dst [wFormatTag=1, nChannels=2, nSamplesPerSec=44100, nAvgBytesPerSec=176400, nBlockAlign=4, wBitsPerSample=16, cbSize=0] ... 0045:trace:msacm:acmStreamOpen => (512) 0045:Ret msacm32.acmStreamOpen() retval=00000200 ret=7a71a231 0045:fixme:quartz:ACMWrapper_SetMediaType acmStreamOpen returned 512 ... 0045:trace:quartz:ACMWrapper_SetMediaType Unable to find a suitable ACM decompressor 0045:trace:quartz:ACMWrapper_SetMediaType Connection refused ... 0045:trace:quartz:FilterGraph2_Connect Cannot connect to filter (80040207), trying next one ... 0045:trace:quartz:FilterGraph2_RemoveFilter (0x70e04f0/0x70e04f4)->(0x72f4408) 0045:trace:quartz:FilterGraph2_RemoveFilter Removing filter L"ACM Wrapper" ... 0045:trace:quartz:ACMWrapper_BreakConnect (0x72f4408)->(0) 0045:trace:quartz:FilterGraph2_RemoveFilter Disconnect 2: 00000001 0045:trace:quartz:FilterGraph2_RemoveFilter Disconnect 2: 00000001 ... 0045:trace:quartz:ACMWrapper_BreakConnect (0x72f4408)->(0) ... 0045:trace:quartz:EnumMonikerImpl_Next (0x72f4088)->(1, 0x9cdf050, 0x9cdf054) 0045:trace:quartz:EnumMonikerImpl_Next -- fetched 0 0045:trace:quartz:EnumMonikerImpl_Release (0x72f4088)->() Release from 1 ... 0045:trace:quartz:FilterGraph2_Connect --> 80040217 ... 0045:Call msvcr90._CIlog10() ret=1002e668 0045:Ret msvcr90._CIlog10() retval=3fd00020 ret=1002e668 0045:trace:quartz:BasicAudio_put_Volume (0x70e04f0/0x70e0500)->(-1204) 0045:trace:quartz:MediaControl_Stop (0x70e04f0/0x70e04f8)->() ... 0037:Call KERNEL32.RaiseException(e0434f4d,00000001,00000001,0033e934) ret=79f97065 0037:trace:seh:raise_exception code=e0434f4d flags=1 addr=0x7b446fe6 ip=7b446fe6 tid=0037 0037:trace:seh:raise_exception info[0]=80131509 0037:trace:seh:raise_exception eax=7b4356b1 ebx=0015c268 ecx=00000000 edx=0033e914 esi=0033e914 edi=0033e8e0 0037:trace:seh:raise_exception ebp=0033e8b8 esp=0033e854 cs=330023 ds=3966002b es=33002b fs=f7c80063 gs=7bd0006b flags=00200212 0037:trace:seh:call_stack_handlers calling handler at 0x79f9a3c8 code=e0434f4d flags=1 0037:Call msvcr80._except_handler4_common(7a381240,79e717fb,0033e860,0033e94c,0033e57c,0033e46c) ret=79f9a3e7 0037:trace:seh:_except_handler4_common exception e0434f4d flags=1 at 0x7b446fe6 handler=0x79f9a3c8 0x33e57c 0x33e46c cookie=31f57880 scope table=0x79f97080 cookies=-2/0,-72/0 0037:trace:seh:_except_handler4_common level 0 prev -2 filter 0x79f9709c 0037:trace:seh:_except_handler4_common filter returned CONTINUE_SEARCH 0037:trace:seh:_except_handler4_common reached -2, returning ExceptionContinueSearch ... --- snip ---
Debugging:
--- snip --- ... 004b:fixme:quartz:ACMWrapper_SetMediaType acmStreamOpen returned 512
Stopped on breakpoint 2 at 0x7a735684 BasicAudio_put_Volume [/home/focht/projects/wine/mainline-src/dlls/quartz/filtergraph.c:3131] in quartz BasicAudio_put_Volume () at /home/focht/projects/wine/mainline-src/dlls/quartz/filtergraph.c:3131 3131 {
Wine-dbg>bt Backtrace: =>0 0x7a735684 BasicAudio_put_Volume(iface=0x70ff8f8, lVolume=0xfffffb4c) [/home/focht/projects/wine/mainline-src/dlls/quartz/filtergraph.c:3131] in quartz (0x0989f5c8) 1 0x1002ed4e in microsoft.xna.framework (+0x2ed4d) (0x0989f5e0) 2 0x1002ee0e in microsoft.xna.framework (+0x2ee0d) (0x0989f600) 3 0x1002da63 in microsoft.xna.framework (+0x2da62) (0x0989f610) 4 0x09af74ca (0x0989f67c) 5 0x09af7313 (0x0989f6dc) 6 0x793d7a7b in mscorlib.ni (+0x317a7a) (0x0105cfb4)
... 3131 { Wine-dbg>n 3132 IFilterGraphImpl *This = impl_from_IBasicAudio(iface); Wine-dbg>n 3136 TRACE("(%p/%p)->(%d)\n", This, iface, lVolume); Wine-dbg>n 3138 EnterCriticalSection(&This->cs); Wine-dbg>n 3140 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio); Wine-dbg>n 3142 if (hr == S_OK) Wine-dbg>n 3145 LeaveCriticalSection(&This->cs); Wine-dbg>n 3147 return hr;
Wine-dbg>p hr 0x80004002 --- snip ---
0x80004002 -> E_NOINTERFACE
This HRESULT is persisted and leads later to unexpected failure.
MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/dd389538(v=vs.85).a...
--- quote --- IBasicAudio::put_Volume method ...
Return value
Returns an HRESULT value. Possible values include the following. Return code Description
E_FAIL The underlying audio device returned an error.
E_INVALIDARG The value of lVolume is invalid.
E_NOTIMPL The filter graph does not contain an audio renderer filter. (Possibly the source does not contain an audio stream.)
S_OK Success. --- quote ---
Source: https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/quartz/filtergraph.c#...
--- snip --- 3128 /*** IBasicAudio methods ***/ 3129 static HRESULT WINAPI BasicAudio_put_Volume(IBasicAudio *iface, LONG lVolume) 3130 { 3131 IFilterGraphImpl *This = impl_from_IBasicAudio(iface); 3132 IBasicAudio* pBasicAudio; 3133 HRESULT hr; 3134 3135 TRACE("(%p/%p)->(%d)\n", This, iface, lVolume); 3136 3137 EnterCriticalSection(&This->cs); 3138 3139 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio); 3140 3141 if (hr == S_OK) 3142 hr = IBasicAudio_put_Volume(pBasicAudio, lVolume); 3143 3144 LeaveCriticalSection(&This->cs); 3145 3146 return hr; 3147 } --- snip ---
Since the filter graph was teared down at this point (see bug 26369), E_NOTIMPL is more appropriate.
If this one and bug 26369 are fixed the intro crash with builtin 'quartz' is gone.
$ sha1sum ARES_Demo_setup.exe 042abbabd5f6b1bbe7418acba7c4cdd9d9df34f6 ARES_Demo_setup.exe
$ du -sh ARES_Demo_setup.exe 118M ARES_Demo_setup.exe
$ wine --version wine-3.11
Regards