This patch allows to start Morrowind with one native DLL fewer. But Morrowind is still not playable. It runs into a critical section deadlock when trying to play. :-( Changelog: - Implemented Mo* methods in msdmo.dll - Added stubs for DMORegister, DMOUnregister, DMOEnum, DMOGetTypes, DMOGetName. - Added version resources. License: X11 Michael Günnewig
Index: dlls/msdmo/Makefile.in =================================================================== RCS file: /home/wine/wine/dlls/msdmo/Makefile.in,v retrieving revision 1.6 diff -d -u -r1.6 Makefile.in --- dlls/msdmo/Makefile.in 17 May 2002 03:37:13 -0000 1.6 +++ dlls/msdmo/Makefile.in 19 Jul 2003 17:07:26 -0000 @@ -3,6 +3,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = msdmo.dll +IMPORTS = ole32 kernel32 LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o @@ -11,6 +12,9 @@ dmoreg.c \ dmort.c \ msdmo_main.c + +RC_SRCS = \ + rsrc.rc @MAKE_DLL_RULES@ Index: dlls/msdmo/dmoreg.c =================================================================== RCS file: /home/wine/wine/dlls/msdmo/dmoreg.c,v retrieving revision 1.2 diff -d -u -r1.2 dmoreg.c --- dlls/msdmo/dmoreg.c 22 Mar 2002 19:19:23 -0000 1.2 +++ dlls/msdmo/dmoreg.c 19 Jul 2003 17:07:27 -0000 @@ -1 +1,83 @@ -/* Code removed because of Microsoft EULA concerns. */ +/* + * Copyright (C) 2003 Michael Günnewig + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define COM_NO_WINDOWS_H +#include "winbase.h" +#include "objbase.h" +#include "mediaobj.h" +#include "dmoreg.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msdmo); + +/***********************************************************************/ + +HRESULT WINAPI DMORegister(LPCWSTR a, REFCLSID b, REFGUID c, DWORD d, DWORD e, + const DMO_PARTIAL_MEDIATYPE* f, + DWORD g, const DMO_PARTIAL_MEDIATYPE* h) +{ + FIXME("(%p,%p,%p,%lu,%lu,%p,%lu,%p),stub!\n",a,b,c,d,e,f,g,h); + + return E_NOTIMPL; +} + +HRESULT WINAPI DMOUnregister(REFCLSID a,REFGUID b) +{ + FIXME("(%p,%p),stub!\n",a,b); + + return E_NOTIMPL; +} + +HRESULT WINAPI DMOEnum(REFGUID guidCategory, DWORD dwFlags, DWORD cInTypes, + const DMO_PARTIAL_MEDIATYPE*pInTypes, DWORD cOutTypes, + const DMO_PARTIAL_MEDIATYPE*pOutTypes,IEnumDMO**ppEnum) +{ + FIXME("(%s,0x%lX,%lu,%p,%lu,%p,%p),stub!\n",debugstr_guid(guidCategory), + dwFlags,cInTypes,pInTypes,cOutTypes,pOutTypes,ppEnum); + + if (guidCategory == NULL || ppEnum == NULL) + return E_FAIL; + if (dwFlags != 0 && dwFlags != DMO_ENUMF_INCLUDE_KEYED) + return E_FAIL; + + *ppEnum = NULL; + + return E_NOTIMPL; +} + +HRESULT WINAPI DMOGetTypes(REFCLSID a, unsigned long b, unsigned long* c, + DMO_PARTIAL_MEDIATYPE* d, unsigned long e, + unsigned long* f, DMO_PARTIAL_MEDIATYPE* g) +{ + FIXME("(%p,%lu,%p,%p,%lu,%p,%p),stub!\n",a,b,c,d,e,f,g); + + return E_NOTIMPL; +} + +HRESULT WINAPI DMOGetName(REFCLSID pclsid, WCHAR* pstr) +{ + FIXME("(%s,%p),stub!\n", debugstr_guid(pclsid), pstr); + + if (pclsid == NULL || pstr == NULL) + return E_FAIL; + + pstr[0] = '\0'; + + return E_NOTIMPL; +} Index: dlls/msdmo/dmort.c =================================================================== RCS file: /home/wine/wine/dlls/msdmo/dmort.c,v retrieving revision 1.2 diff -d -u -r1.2 dmort.c --- dlls/msdmo/dmort.c 22 Mar 2002 19:19:23 -0000 1.2 +++ dlls/msdmo/dmort.c 19 Jul 2003 17:07:27 -0000 @@ -1 +1,178 @@ -/* Code removed because of Microsoft EULA concerns. */ +/* + * Copyright (C) 2003 Michael Günnewig + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define COM_NO_WINDOWS_H +#include "winbase.h" +#include "objbase.h" +#include "mediaobj.h" +#include "dmort.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msdmo); + +/*********************************************************************** + * MoCreateMediaType (MSDMO.@) + */ +HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE** ppmedia, DWORD cbFormat) +{ + HRESULT hr; + + TRACE("(%p,%lu)\n", ppmedia, cbFormat); + + if (ppmedia == NULL) + return E_POINTER; + + *ppmedia = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE)); + if (*ppmedia == NULL) + return E_OUTOFMEMORY; + + hr = MoInitMediaType(*ppmedia, cbFormat); + if (FAILED(hr)) { + CoTaskMemFree(*ppmedia); + *ppmedia = NULL; + } + + return hr; +} + +/*********************************************************************** + * MoInitMediaType (MSDMO.@) + */ +HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE* pmedia, DWORD cbFormat) +{ + TRACE("(%p,%lu)\n", pmedia,cbFormat); + + if (pmedia == NULL) + return E_POINTER; + + memset(pmedia, 0, sizeof(DMO_MEDIA_TYPE)); + + if (cbFormat > 0) { + pmedia->pbFormat = CoTaskMemAlloc(cbFormat); + if (pmedia->pbFormat == NULL) + return E_OUTOFMEMORY; + + pmedia->cbFormat = cbFormat; + } + + return S_OK; +} + +/*********************************************************************** + * MoDeleteMediaType (MSDMO.@) + */ +HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE* pmedia) +{ + TRACE("(%p)\n", pmedia); + + if (pmedia == NULL) + return E_POINTER; + + MoFreeMediaType(pmedia); + CoTaskMemFree(pmedia); + + return S_OK; +} + +/*********************************************************************** + * MoFreeMediaType (MSDMO.@) + */ +HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE* pmedia) +{ + TRACE("(%p)\n", pmedia); + + if (pmedia == NULL) + return E_POINTER; + + if (pmedia->pUnk != NULL) { + IUnknown_Release(pmedia->pUnk); + pmedia->pUnk = NULL; + } + + if (pmedia->pbFormat != NULL) { + CoTaskMemFree(pmedia->pbFormat); + pmedia->pbFormat = NULL; + } + + return S_OK; +} + +/*********************************************************************** + * MoDuplicateMediaType (MSDMO.@) + */ +HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE** ppdst, + const DMO_MEDIA_TYPE* psrc) +{ + HRESULT hr; + + TRACE("(%p,%p)\n", ppdst, psrc); + + if (ppdst == NULL || psrc == NULL) + return E_POINTER; + + *ppdst = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE)); + if (*ppdst == NULL) + return E_OUTOFMEMORY; + + hr = MoCopyMediaType(*ppdst, psrc); + if (FAILED(hr)) { + MoFreeMediaType(*ppdst); + *ppdst = NULL; + } + + return hr; +} + +/*********************************************************************** + * MoCopyMediaType (MSDMO.@) + */ +HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE* pdst, + const DMO_MEDIA_TYPE* psrc) +{ + TRACE("(%p,%p)\n", pdst, psrc); + + if (pdst == NULL || psrc == NULL) + return E_POINTER; + + memcpy(&pdst->majortype, &psrc->majortype, sizeof(psrc->majortype)); + memcpy(&pdst->subtype, &psrc->subtype, sizeof(psrc->subtype)); + memcpy(&pdst->formattype, &psrc->formattype, sizeof(psrc->formattype)); + + pdst->bFixedSizeSamples = psrc->bFixedSizeSamples; + pdst->bTemporalCompression = psrc->bTemporalCompression; + pdst->lSampleSize = psrc->lSampleSize; + pdst->cbFormat = psrc->cbFormat; + + if (psrc->pbFormat != NULL && psrc->cbFormat > 0) { + pdst->pbFormat = CoTaskMemAlloc(psrc->cbFormat); + if (pdst->pbFormat == NULL) + return E_OUTOFMEMORY; + + memcpy(pdst->pbFormat, psrc->pbFormat, psrc->cbFormat); + } else + pdst->pbFormat = NULL; + + if (psrc->pUnk != NULL) { + pdst->pUnk = psrc->pUnk; + IUnknown_AddRef(pdst->pUnk); + } else + pdst->pUnk = NULL; + + return S_OK; +} Index: dlls/msdmo/msdmo.spec =================================================================== RCS file: /home/wine/wine/dlls/msdmo/msdmo.spec,v retrieving revision 1.6 diff -d -u -r1.6 msdmo.spec --- dlls/msdmo/msdmo.spec 21 Jun 2002 19:15:47 -0000 1.6 +++ dlls/msdmo/msdmo.spec 19 Jul 2003 17:07:27 -0000 @@ -1,15 +1,15 @@ -@ stub DMOEnum -@ stub DMOGetName -@ stub DMOGetTypes -@ stub DMOGuidToStrA -@ stub DMOGuidToStrW -@ stub DMORegister -@ stub DMOStrToGuidA -@ stub DMOStrToGuidW -@ stub DMOUnregister -@ stub MoCopyMediaType -@ stub MoCreateMediaType -@ stub MoDeleteMediaType -@ stub MoDuplicateMediaType -@ stub MoFreeMediaType -@ stub MoInitMediaType +@ stdcall DMOEnum(ptr long long ptr long ptr ptr) +@ stdcall DMOGetName(ptr wstr) +@ stdcall DMOGetTypes(ptr long ptr ptr long ptr ptr) +@ stub DMOGuidToStrA +@ stub DMOGuidToStrW +@ stdcall DMORegister(wstr ptr ptr long long ptr long ptr) +@ stub DMOStrToGuidA +@ stub DMOStrToGuidW +@ stdcall DMOUnregister(ptr ptr) +@ stdcall MoCopyMediaType(ptr ptr) +@ stdcall MoCreateMediaType(ptr long) +@ stdcall MoDeleteMediaType(ptr) +@ stdcall MoDuplicateMediaType(ptr ptr) +@ stdcall MoFreeMediaType(ptr) +@ stdcall MoInitMediaType(ptr long) --- /dev/null 2002-09-09 22:24:09.000000000 +0200 +++ dlls/msdmo/rsrc.rc 2003-07-19 08:36:14.000000000 +0200 @@ -0,0 +1,33 @@ +#include "winver.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +1 VERSIONINFO +FILEVERSION 6, 3, 1, 400 +PRODUCTVERSION 6, 3, 1, 400 +FILEFLAGSMASK 0x30003fL +#ifdef NDEBUG +FILEFLAGS 0 +#else +FILEFLAGS VS_FF_DEBUG +#endif +FILEOS VOS_DOS_WINDOWS32 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "040904E4" /* English (USA) */ + { + VALUE "Comments", "\0" + VALUE "CompanyName", "Wine Developer Team\0" + VALUE "DirectShow", "Core\0" + VALUE "FileDescription", "DMO Runtime\0" + VALUE "FileVersion", "6.03.01.0400\0" + VALUE "InternalName", "msdmo.dll\0" + VALUE "LegalCopyright", "Copyright \251 Michael Günnewig 2003\0" + VALUE "OriginalFilename", "msdmo.dll\0" + VALUE "ProductName", "DirectShow\0" + VALUE "ProductVersion", "6.03.01.0400\0" + } + } +}