http://bugs.winehq.org/show_bug.cgi?id=32613
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |focht@gmx.net Summary|Tom Clancy's Rainbow Six: |Tom Clancy's Rainbow Six: |Lockdown crashes after the |Lockdown crashes after the |intro videos (without |intro videos (needs |native dxdiagn.dll) |DxDiag_SoundDevices device | |child nodes present)
--- Comment #4 from Anastasius Focht focht@gmx.net --- Hello folks,
confirming.
Relevant part of trace log:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/Ubisoft/Red Storm Entertainment/Rainbow Six Lockdown Demo
$ WINEDEBUG=+tid,+seh,+relay,+dxdiag,+ole,+variant wine ./Lockdown.exe
log.txt 2>&1
... 0029:Call ole32.CoCreateInstance(009493a0,00000000,00000001,00949390,0bbd2628) ret=004878bd 0029:trace:ole:CoCreateInstance (rclsid={a65b8071-3bfe-4213-9a5b-491da4461ca7}, pUnkOuter=(nil), dwClsContext=00000001, riid={9c6b4cb0-23f8-49cc-a3ed-45a55000a6d2}, ppv=0xbbd2628) 0029:trace:ole:CoGetClassObject CLSID: {a65b8071-3bfe-4213-9a5b-491da4461ca7},IID: {00000001-0000-0000-c000-000000000046} ... 0029:trace:ole:apartment_getclassobject found L"C:\windows\system32\dxdiagn.dll" already loaded 0029:trace:ole:apartment_getclassobject calling DllGetClassObject 0x7c76e95c ... 0029:Ret ole32.CoCreateInstance() retval=00000000 ret=004878bd 0029:trace:dxdiag:IDxDiagProviderImpl_Initialize (0x1fcead0,0x33f5a4) ... 0029:trace:dxdiag:IDxDiagProviderImpl_GetRootContainer (0x1fcead0,0xbbd262c) 0029:trace:dxdiag:DXDiag_CreateDXDiagContainer ({7d0f462f-4064-4862-bc7f-933e5058c10f}, 0xbbd262c) ... 0029:trace:dxdiag:IDxDiagProviderImpl_AddRef (0x1fcead0)->(ref before=1) 0029:trace:dxdiag:IDxDiagContainerImpl_AddRef (0x2379a98)->(ref before=0) 0029:trace:dxdiag:IDxDiagContainerImpl_GetChildContainer (0x2379a98, L"DxDiag_DirectSound.DxDiag_SoundDevices", 0x33f5ac) ... 0029:trace:dxdiag:IDxDiagContainerImpl_GetChildContainer Trying to get parent container L"DxDiag_DirectSound" ... 0029:trace:dxdiag:IDxDiagContainerImpl_GetChildContainer Trying to get container L"DxDiag_SoundDevices" ... 0029:trace:dxdiag:DXDiag_CreateDXDiagContainer ({7d0f462f-4064-4862-bc7f-933e5058c10f}, 0x33f5ac) ... 0029:trace:dxdiag:IDxDiagProviderImpl_AddRef (0x1fcead0)->(ref before=2) 0029:trace:dxdiag:IDxDiagContainerImpl_AddRef (0x237da28)->(ref before=0) 0029:trace:dxdiag:IDxDiagContainerImpl_GetChildContainer Succeeded in getting the container instance ... 0029:trace:dxdiag:IDxDiagContainerImpl_GetChildContainer (0x237da28, L"0", 0x33f5a4) ... 0029:trace:dxdiag:IDxDiagContainerImpl_GetChildContainer Trying to get container L"0" ... 0029:trace:dxdiag:IDxDiagContainerImpl_Release (0x237da28)->(ref before=1) 0029:trace:dxdiag:IDxDiagProviderImpl_Release (0x1fcead0)->(ref before=3) ... 0029:Call oleaut32.VariantInit(0033f37c) ret=0048777e 0029:trace:variant:VariantInit (0x33f37c) 0029:Ret oleaut32.VariantInit() retval=0033f37c ret=0048777e 0029:trace:seh:raise_exception code=c0000005 flags=0 addr=0x487785 ip=00487785 tid=0029 0029:trace:seh:raise_exception info[0]=00000000 0029:trace:seh:raise_exception info[1]=00000000 0029:trace:seh:raise_exception eax=00000000 ebx=ffffffff ecx=0bbd2628 edx=7bcecbc8 esi=0bbd2628 edi=0bb25338 0029:trace:seh:raise_exception ebp=00000000 esp=0033f378 cs=0023 ds=002b es=002b fs=0063 gs=006b flags=00010206 0029:trace:seh:call_stack_handlers calling handler at 0x8f1e7e code=c0000005 flags=0 0029:trace:seh:call_stack_handlers handler at 0x8f1e7e returned 1 ... Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x00487785). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b EIP:00487785 ESP:0033f378 EBP:00000000 EFLAGS:00010206( R- -- I - -P- ) EAX:00000000 EBX:ffffffff ECX:0bbd2628 EDX:7bcecbc8 ESI:0bbd2628 EDI:0bb25338 ... Backtrace: =>0 0x00487785 in lockdown (+0x87785) (0x00000000) 0x00487785: movl 0x0(%eax),%ecx Modules: Module Address Debug info Name (194 modules) PE 360000- 3f6000 Deferred fmod PE 400000- dff000 Export lockdown PE 10000000-1002b000 Deferred ubistats PE 18000000-18038000 Deferred binkw32 ... Threads: process tid prio (all id:s are in hex) ... 00000028 (D) C:\Program Files\Ubisoft\Red Storm Entertainment\Rainbow Six Lockdown Demo\Lockdown.exe 00000032 0 00000031 0 00000030 2 0000002f 15 0000002e 15 0000002c 0 0000002b 0 0000002a 0 00000029 0 <== --- snip ---
Wine currently doesn't build a full DxDiag_SoundDevices tree, only the parent node is present.
Source: http://source.winehq.org/git/wine.git/blob/7462da1345e1ad9d4cb06339f1300271e...
--- snip --- 1187 static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node) 1188 { 1189 static const WCHAR DxDiag_SoundDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','D','e','v','i','c','e','s',0}; 1190 static const WCHAR DxDiag_SoundCaptureDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','C','a','p','t','u','r','e','D','e','v','i','c','e','s',0}; 1191 1192 IDxDiagContainerImpl_Container *cont; 1193 1194 cont = allocate_information_node(DxDiag_SoundDevices); 1195 if (!cont) 1196 return E_OUTOFMEMORY; 1197 1198 add_subcontainer(node, cont); 1199 1200 cont = allocate_information_node(DxDiag_SoundCaptureDevices); 1201 if (!cont) 1202 return E_OUTOFMEMORY; 1203 1204 add_subcontainer(node, cont); 1205 1206 return S_OK; 1207 } --- snip ---
The game code is pretty sub-standard, it directly accesses child nodes using hard-coded "0" instance name without checking for presence of child nodes prior nor retrieving node names using standard interface.
A better approach would be (extracted from MSDN example):
--- snip ---
if( FAILED( hr = pDxDiagRoot->GetChildContainer( L"DxDiag_DirectSound.DxDiag_SoundDevices", &pContainer ))) goto cleanup;
if( FAILED( hr = pContainer->GetNumberOfChildContainers( &nInstanceCount))) goto cleanup;
for( nItem = 0; nItem < nInstanceCount; nItem++ ) { ... if( FAILED( hr = pContainer->EnumChildContainerNames( nItem, wszContainer, 256 ))) goto cleanup;
hr = pContainer->GetChildContainer( wszContainer, &pObject ); if( FAILED( hr ) || pObject == NULL ) { ... } /* access the instance */ --- snip ---
Some guys didn't want to bother with reading MSDN/dxdiag code at all ...
$ sha1sum LockdownDemoSetup.exe f79d480bdacd886a8baaf0055106448c38aede94 LockdownDemoSetup.exe
$ du -sh LockdownDemoSetup.exe 520M LockdownDemoSetup.exe
$ wine --version wine-1.7.19
Regards