[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