[2/2] quartz: Return proper error codes from GraphBuilder_RenderFile

Mirek thunder.m at czela.net
Mon Feb 19 18:27:23 CST 2007


Hi, this patch caused regression in TES IV: Oblivion, now it can't run, 
here is output:


fixme:devenum:DEVENUM_ICreateDevEnum_CreateClassEnumerator Category 
{cc7bfb41-f175-11d1-a392-00e0291f3959} not found
fixme:devenum:DEVENUM_ICreateDevEnum_CreateClassEnumerator Category 
{cc7bfb46-f175-11d1-a392-00e0291f3959} not found
fixme:devenum:DEVENUM_ICreateDevEnum_CreateClassEnumerator Category 
{cc7bfb41-f175-11d1-a392-00e0291f3959} not found
fixme:devenum:DEVENUM_ICreateDevEnum_CreateClassEnumerator Category 
{cc7bfb46-f175-11d1-a392-00e0291f3959} not found
wine: Unhandled page fault on read access to 0xffffffea at address 
0x7bfd278f (thread 0009), starting debugger...
Unhandled exception: page fault on read access to 0xffffffea in 32-bit 
code (0x7bfd278f).
Register dump:
  CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
  EIP:7bfd278f ESP:0034f098 EBP:0034f1d0 EFLAGS:00010282(   - 00      - 
RIS1)
  EAX:00000001 EBX:7bffec00 ECX:0034f198 EDX:ffffffea
  ESI:80004005 EDI:00000001
Stack dump:
0x0034f098:  115cc680 00000001 0034f198 0034f19c
0x0034f0a8:  00000000 00000001 00000001 0034f150
0x0034f0b8:  00000000 00000000 00000000 00000000
0x0034f0c8:  00000000 00000000 00000000 00000000
0x0034f0d8:  0034f108 7efa09be 7bff527c 0034f19c
0x0034f0e8:  0034f198 0034f1ac 0034f1a8 00000010
Backtrace:
=>1 0x7bfd278f GraphBuilder_RenderFile+0x66f(iface=0x115cb968, 
lpcwstrFile=0x34f3f0, lpcwstrPlayList=0x0) [/usr/src/wine/dlls/q 
uartz/filtergraph.c:1094] in quartz (0x0034f1d0)
   2 0x0069302b in oblivion (+0x29302b) (0x00000008)
   3 0x00000000 (0x00000000)
0x7bfd278f GraphBuilder_RenderFile+0x66f 
[/usr/src/wine/dlls/quartz/filtergraph.c:1094] in quartz: movl 
0x0(%edx),%eax
1094            IBaseFilter_Release(psplitter);
Modules:
Module  Address                 Debug info      Name (109 modules)
PE      400000-b59000   Export          oblivion
PE      b60000-daf000   Deferred        d3dx9_27
PE      18000000-18068000       Deferred        binkw32
PE      70000000-700b2000       Deferred        dinput8
ELF     7b2de000-7b2f2000       Deferred        avicap32<elf>
   \-PE  7b2e0000-7b2f2000       \               avicap32
ELF     7b2f2000-7b38b000       Deferred        oleaut32<elf>
   \-PE  7b300000-7b38b000       \               oleaut32
ELF     7bf00000-7bf03000       Deferred        <wine-loader>
ELF     7bf81000-7bfa8000       Deferred        msvfw32<elf>
   \-PE  7bf90000-7bfa8000       \               msvfw32
ELF     7bfa8000-7c000000       Dwarf           quartz<elf>
   \-PE  7bfb0000-7c000000       \               quartz
ELF     7c4b4000-7c4bf000       Deferred        libgcc_s.so.1
ELF     7c5a4000-7c634000       Deferred        libglu.so.1
ELF     7c634000-7c653000       Deferred        devenum<elf>
   \-PE  7c640000-7c653000       \               devenum
ELF     7c653000-7c70d000       Deferred        wined3d<elf>
   \-PE  7c660000-7c70d000       \               wined3d
ELF     7c70d000-7c737000       Deferred        d3d9<elf>
   \-PE  7c710000-7c737000       \               d3d9
ELF     7c857000-7c86b000       Deferred        winejoystick<elf>
   \-PE  7c860000-7c86b000       \               winejoystick
ELF     7c86b000-7c882000       Deferred        cfgmgr32<elf>
   \-PE  7c870000-7c882000       \               cfgmgr32
ELF     7c882000-7c8de000       Deferred        setupapi<elf>
   \-PE  7c890000-7c8de000       \               setupapi
ELF     7c8de000-7c8f2000       Deferred        hid<elf>
   \-PE  7c8e0000-7c8f2000       \               hid
ELF     7c9ed000-7caae000       Deferred        libasound.so.2
ELF     7caae000-7cad9000       Deferred        winealsa<elf>
   \-PE  7cac0000-7cad9000       \               winealsa
ELF     7cad9000-7cb0b000       Deferred        uxtheme<elf>
   \-PE  7cae0000-7cb0b000       \               uxtheme
ELF     7cd9e000-7cdb3000       Deferred        midimap<elf>
   \-PE  7cda0000-7cdb3000       \               midimap
ELF     7cdb3000-7cdb8000       Deferred        libxfixes.so.3
ELF     7cdbd000-7cdd5000       Deferred        msacm32<elf>
   \-PE  7cdc0000-7cdd5000       \               msacm32
ELF     7cdd7000-7cdda000       Deferred        libxinerama.so.1
ELF     7cddd000-7cdf9000       Deferred        imm32<elf>
   \-PE  7cde0000-7cdf9000       \               imm32
ELF     7d7a3000-7d7a5000       Deferred        libnvidia-tls.so.1
ELF     7d7a5000-7e116000       Deferred        libglcore.so.1
ELF     7e116000-7e1aa000       Deferred        libgl.so.1
ELF     7e1aa000-7e1af000       Deferred        libxdmcp.so.6
ELF     7e1af000-7e1b2000       Deferred        libxau.so.6
ELF     7e1b2000-7e29e000       Deferred        libx11.so.6
ELF     7e29e000-7e2ac000       Deferred        libxext.so.6
ELF     7e2ac000-7e2b1000       Deferred        libxxf86vm.so.1
ELF     7e2b1000-7e2c9000       Deferred        libice.so.6
ELF     7e2c9000-7e2d2000       Deferred        libsm.so.6
ELF     7e2d3000-7e2dc000       Deferred        libxcursor.so.1
ELF     7e2dc000-7e2df000       Deferred        libxrandr.so.2
ELF     7e2df000-7e2e7000       Deferred        libxrender.so.1
ELF     7e2f1000-7e37f000       Deferred        winex11<elf>
   \-PE  7e300000-7e37f000       \               winex11
ELF     7e3fb000-7e41b000       Deferred        libexpat.so.1
ELF     7e41b000-7e446000       Deferred        libfontconfig.so.1
ELF     7e446000-7e45a000       Deferred        libz.so.1
ELF     7e45a000-7e4c4000       Deferred        libfreetype.so.6
ELF     7e4e3000-7e50f000       Deferred        ws2_32<elf>
   \-PE  7e4f0000-7e50f000       \               ws2_32
ELF     7e50f000-7e529000       Deferred        wsock32<elf>
   \-PE  7e520000-7e529000       \               wsock32
ELF     7e529000-7e58d000       Deferred        msvcrt<elf>
   \-PE  7e540000-7e58d000       \               msvcrt
ELF     7e58d000-7e5a1000       Deferred        lz32<elf>
   \-PE  7e590000-7e5a1000       \               lz32
ELF     7e5a1000-7e5f9000       Deferred        shlwapi<elf>
   \-PE  7e5b0000-7e5f9000       \               shlwapi
ELF     7e5f9000-7e6ee000       Deferred        shell32<elf>
   \-PE  7e610000-7e6ee000       \               shell32
ELF     7e6ee000-7e701000       Deferred        libresolv.so.2
ELF     7e707000-7e720000       Deferred        version<elf>
   \-PE  7e710000-7e720000       \               version
ELF     7e720000-7e73e000       Deferred        iphlpapi<elf>
   \-PE  7e730000-7e73e000       \               iphlpapi
ELF     7e73e000-7e793000       Deferred        rpcrt4<elf>
   \-PE  7e750000-7e793000       \               rpcrt4
ELF     7e793000-7e82c000       Deferred        ole32<elf>
   \-PE  7e7a0000-7e82c000       \               ole32
ELF     7e82c000-7e875000       Deferred        dsound<elf>
   \-PE  7e830000-7e875000       \               dsound
ELF     7e875000-7e903000       Deferred        winmm<elf>
   \-PE  7e880000-7e903000       \               winmm
ELF     7e903000-7e949000       Deferred        advapi32<elf>
   \-PE  7e910000-7e949000       \               advapi32
ELF     7e949000-7e9dc000       Deferred        gdi32<elf>
   \-PE  7e960000-7e9dc000       \               gdi32
ELF     7e9dc000-7eb16000       Deferred        user32<elf>
   \-PE  7ea00000-7eb16000       \               user32
ELF     7eb16000-7ebd6000       Deferred        comctl32<elf>
   \-PE  7eb20000-7ebd6000       \               comctl32
ELF     7edd6000-7eefc000       Deferred        kernel32<elf>
   \-PE  7edf0000-7eefc000       \               kernel32
ELF     7eefc000-7ef07000       Deferred        libnss_files.so.2
ELF     7ef07000-7ef11000       Deferred        libnss_nis.so.2
ELF     7ef11000-7ef27000       Deferred        libnsl.so.1
ELF     7ef27000-7ef4c000       Deferred        libm.so.6
ELF     7ef6b000-7f000000       Deferred        ntdll<elf>
   \-PE  7ef80000-7f000000       \               ntdll
ELF     b7cb6000-b7cba000       Deferred        libdl.so.2
ELF     b7cba000-b7dec000       Deferred        libc.so.6
ELF     b7dec000-b7dfe000       Deferred        libpthread.so.0
ELF     b7e11000-b7e15000       Deferred        iso8859-2.so
ELF     b7e15000-b7e1e000       Deferred        libnss_compat.so.2
ELF     b7e1e000-b7f2f000       Deferred        libwine.so.1
ELF     b7f31000-b7f48000       Deferred        ld-linux.so.2
Threads:
process  tid      prio (all id:s are in hex)
0000000a
         0000000c    0
         0000000b    0
00000008 (D) G:\usr\games\oblivion\Oblivion.exe
         00000010    2
         0000000f   -1
         0000000e   -1
         0000000d   15
         00000009    0 <==

Mirek

Chris Robinson napsal(a):
> 
> ------------------------------------------------------------------------
> 
> From 427782e216badd48afc917c85682bc5a1954b24b Mon Sep 17 00:00:00 2001
> From: Chris Robinson <chris.kcat at gmail.com>
> Date: Wed, 14 Feb 2007 11:27:26 -0800
> Subject: [PATCH] quartz: Return proper error codes from GraphBuilder_RenderFile
> 
> ---
>  dlls/quartz/filtergraph.c |   82 +++++++++++++++++++++++----------------------
>  1 files changed, 42 insertions(+), 40 deletions(-)
> 
> diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
> index 8b38a3b..a3db8dd 100644
> --- a/dlls/quartz/filtergraph.c
> +++ b/dlls/quartz/filtergraph.c
> @@ -961,9 +961,9 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
>      IEnumPins* penumpins;
>      ULONG pin;
>      HRESULT hr;
> -    IEnumMoniker* pEnumMoniker;
> +    IEnumMoniker* pEnumMoniker = NULL;
>      GUID tab[2];
> -    IPin** ppins;
> +    IPin** ppins = NULL;
>      ULONG nb;
>      IMoniker* pMoniker;
>      IFileSourceFilter* pfile = NULL;
> @@ -972,6 +972,9 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
>  
>      TRACE("(%p/%p)->(%s, %s)\n", This, iface, debugstr_w(lpcwstrFile), debugstr_w(lpcwstrPlayList));
>  
> +    if (lpcwstrPlayList != NULL)
> +        return E_INVALIDARG;
> +
>      hr = IGraphBuilder_AddSourceFilter(iface, lpcwstrFile, string, &preader);
>  
>      /* Retrieve file media type */
> @@ -982,6 +985,13 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
>          IFileSourceFilter_Release(pfile);
>      }
>  
> +    if (SUCCEEDED(hr))
> +        hr = IBaseFilter_EnumPins(preader, &penumpins);
> +    if (SUCCEEDED(hr)) {
> +        hr = IEnumPins_Next(penumpins, 1, &ppinreader, &pin);
> +        IEnumPins_Release(penumpins);
> +    }
> +
>      if (SUCCEEDED(hr)) {
>          tab[0] = mt.majortype;
>          tab[1] = mt.subtype;
> @@ -990,6 +1000,8 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
>  
>      if (FAILED(hr))
>      {
> +        if (pEnumMoniker)
> +            IEnumMoniker_Release(pEnumMoniker);
>          if (preader) {
>               IGraphBuilder_RemoveFilter(iface, preader);
>               IBaseFilter_Release(preader);
> @@ -1019,65 +1031,49 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
>          hr = IGraphBuilder_AddFilter(iface, psplitter, NULL);
>          if (FAILED(hr)) {
>              ERR("Unable add filter (%x)\n", hr);
> -            return hr;
> +            IBaseFilter_Release(psplitter);
> +            continue;
>          }
>  
>          /* Connect file source and splitter filters together */
>          /* Make the splitter analyze incoming data */
> -        hr = IBaseFilter_EnumPins(preader, &penumpins);
> -        if (FAILED(hr)) {
> -            ERR("Enumpins (%x)\n", hr);
> -            return hr;
> -        }
> -        hr = IEnumPins_Next(penumpins, 1, &ppinreader, &pin);
> -        if (FAILED(hr)) {
> -            ERR("Next (%x)\n", hr);
> -            return hr;
> -        }
> -        if (pin == 0) {
> -            ERR("No Pin\n");
> -            return E_FAIL;
> -        }
> -        IEnumPins_Release(penumpins);
>  
>          hr = IBaseFilter_EnumPins(psplitter, &penumpins);
> -        if (FAILED(hr)) {
> -            ERR("Splitter Enumpins (%x)\n", hr);
> -            return hr;
> -        }
> -        hr = IEnumPins_Next(penumpins, 1, &ppinsplitter, &pin);
> -        if (FAILED(hr)) {
> -            ERR("Next (%x)\n", hr);
> -            return hr;
> -        }
> -        if (pin == 0) {
> -            ERR("No Pin\n");
> -            return E_FAIL;
> +        if (SUCCEEDED(hr)) {
> +            hr = IEnumPins_Next(penumpins, 1, &ppinsplitter, &pin);
> +            IEnumPins_Release(penumpins);
>          }
> -        IEnumPins_Release(penumpins);
>  
> -        hr = IPin_Connect(ppinreader, ppinsplitter, NULL);
> +        if (SUCCEEDED(hr))
> +            hr = IPin_Connect(ppinreader, ppinsplitter, NULL);
>          if (SUCCEEDED(hr)) {
>              /* Make sure there's some output pins in the filter */
>              hr = GetInternalConnections(psplitter, ppinsplitter, &ppins, &nb);
> -            if(SUCCEEDED(hr)) {
> +            if (SUCCEEDED(hr)) {
>                  if(nb > 0) {
>                      TRACE("Successfully connected to filter\n");
>                      break;
>                  }
>                  CoTaskMemFree(ppins);
>                  ppins = NULL;
> -                TRACE("No output pins found in filter\n");
>              }
> -            IBaseFilter_Release(ppinsplitter);
> -            ppinsplitter = NULL;
> +
> +            TRACE("No output pins found in filter\n");
> +            hr = VFW_E_CANNOT_RENDER;
>          }
> +
> +        IPin_Release(ppinsplitter);
> +        ppinsplitter = NULL;
> +        IGraphBuilder_RemoveFilter(iface, psplitter);
> +        IBaseFilter_Release(psplitter);
> +        ppinsplitter = NULL;
> +
>          TRACE("Cannot connect to filter (%x), trying next one\n", hr);
> -        hr = E_FAIL;
>      }
>  
>      /* Render all output pin of the splitter by calling IGraphBuilder_Render on each of them */
>      if (SUCCEEDED(hr)) {
> +        int partial = 0;
>          int i;
>          TRACE("pins to consider: %d\n", nb);
>          for(i = 0; i < nb; i++) {
> @@ -1085,13 +1081,19 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
>              hr = IGraphBuilder_Render(iface, ppins[i]);
>              if (FAILED(hr)) {
>                  ERR("Cannot render pin %p (%x)\n", ppins[i], hr);
> -                /* FIXME: We should clean created things properly */
> -                break;
> +                partial = 1;
>              }
> +            IPin_Release(ppins[i]);
>          }
>          CoTaskMemFree(ppins);
> +
> +        hr = (partial ? VFW_S_PARTIAL_RENDER : S_OK);
>      }
> -    
> +
> +    if (psplitter)
> +        IBaseFilter_Release(psplitter);
> +    IBaseFilter_Release(preader);
> +
>      return hr;
>  }
>  
> 
> 
> ------------------------------------------------------------------------
> 
> 



More information about the wine-devel mailing list