[Bug 32613] Tom Clancy's Rainbow Six: Lockdown crashes after the intro videos (needs DxDiag_SoundDevices device child nodes present)
wine-bugs at winehq.org
wine-bugs at winehq.org
Sun May 18 11:29:45 CDT 2014
http://bugs.winehq.org/show_bug.cgi?id=32613
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |focht at 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 at 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/7462da1345e1ad9d4cb06339f1300271e658faa0:/dlls/dxdiagn/provider.c#l1187
--- 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
--
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