ReactOS  0.4.13-dev-464-g6b95727
dllfunc.c
Go to the documentation of this file.
1 /*
2  * Strmbase DLL functions
3  *
4  * Copyright (C) 2005 Rolf Kalbermatter
5  * Copyright (C) 2010 Aric Stewart, CodeWeavers
6 *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 #include "config.h"
22 
23 #include <stdarg.h>
24 #include <assert.h>
25 
26 #define COBJMACROS
27 #define NONAMELESSSTRUCT
28 #define NONAMELESSUNION
29 
30 #include "windef.h"
31 #include "winbase.h"
32 #include "wingdi.h"
33 #include "winerror.h"
34 #include "winreg.h"
35 #include "objbase.h"
36 #include "uuids.h"
37 #include "strmif.h"
38 
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
41 #include "wine/strmbase.h"
42 
44 
45 extern const int g_cTemplates;
46 extern const FactoryTemplate g_Templates[];
47 
49 static LONG server_locks = 0;
50 
51 /*
52  * defines and constants
53  */
54 
55 static const WCHAR clsid_keyname[] = {'C','L','S','I','D',0 };
56 static const WCHAR ips32_keyname[] = {'I','n','P','r','o','c','S','e','r','v','e','r','3','2',0};
57 static const WCHAR tmodel_keyname[] = {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0};
58 static const WCHAR tmodel_both[] = {'B','o','t','h',0};
59 
60 /*
61  * SetupRegisterClass()
62  */
65  LPCWSTR szFileName,
66  LPCWSTR szServerType,
67  LPCWSTR szThreadingModel)
68 {
69  HKEY hkey, hsubkey = NULL;
70  LONG ret = RegCreateKeyW(clsid, szCLSID, &hkey);
71  if (ERROR_SUCCESS != ret)
72  return HRESULT_FROM_WIN32(ret);
73 
74  /* set description string */
76  sizeof(WCHAR) * (lstrlenW(szDescription) + 1));
77  if (ERROR_SUCCESS != ret)
78  goto err_out;
79 
80  /* create CLSID\\{"CLSID"}\\"ServerType" key, using key to CLSID\\{"CLSID"}
81  passed back by last call to RegCreateKeyW(). */
82  ret = RegCreateKeyW(hkey, szServerType, &hsubkey);
83  if (ERROR_SUCCESS != ret)
84  goto err_out;
85 
86  /* set server path */
87  ret = RegSetValueW(hsubkey, NULL, REG_SZ, szFileName,
88  sizeof(WCHAR) * (lstrlenW(szFileName) + 1));
89  if (ERROR_SUCCESS != ret)
90  goto err_out;
91 
92  /* set threading model */
94  (const BYTE*)szThreadingModel,
95  sizeof(WCHAR) * (lstrlenW(szThreadingModel) + 1));
96 err_out:
97  if (hsubkey)
98  RegCloseKey(hsubkey);
99  RegCloseKey(hkey);
100  return HRESULT_FROM_WIN32(ret);
101 }
102 
103 /*
104  * RegisterAllClasses()
105  */
107  LPCWSTR szFileName, BOOL bRegister)
108 {
109  HRESULT hr = NOERROR;
110  HKEY hkey;
113  if (ERROR_SUCCESS != ret)
114  return HRESULT_FROM_WIN32(ret);
115 
116  for (i = 0; i < num; i++, pList++)
117  {
118  /* (un)register CLSID and InprocServer32 */
120  if (SUCCEEDED(hr))
121  {
122  if (bRegister )
123  hr = SetupRegisterClass(hkey, szCLSID,
124  pList->m_Name, szFileName,
126  else
127  hr = RegDeleteTreeW(hkey, szCLSID);
128  }
129  }
130  RegCloseKey(hkey);
131  return hr;
132 }
133 
135 {
136  if (!pFilter)
137  return S_OK;
138 
139  if (bRegister)
140  {
141  {
142  REGFILTER2 rf2;
143  rf2.dwVersion = 1;
144  rf2.dwMerit = pFilter->merit;
145  rf2.u.s1.cPins = pFilter->pins;
146  rf2.u.s1.rgPins = pFilter->pPin;
147 
148  return IFilterMapper2_RegisterFilter(pIFM2, pFilter->clsid, pFilter->name, NULL, &CLSID_LegacyAmFilterCategory, NULL, &rf2);
149  }
150  }
151  else
152  return IFilterMapper2_UnregisterFilter(pIFM2, &CLSID_LegacyAmFilterCategory, NULL, pFilter->clsid);
153 }
154 
156 {
157  HRESULT hr;
158  int i;
159  IFilterMapper2 *pIFM2 = NULL;
160  WCHAR szFileName[MAX_PATH];
161 
162  if (!GetModuleFileNameW(g_hInst, szFileName, MAX_PATH))
163  {
164  ERR("Failed to get module file name for registration\n");
165  return E_FAIL;
166  }
167 
168  if (bRegister)
170 
172 
173  TRACE("Getting IFilterMapper2\r\n");
174  hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
175  &IID_IFilterMapper2, (void **)&pIFM2);
176 
177  for (i = 0; SUCCEEDED(hr) && i < g_cTemplates; i++)
178  hr = AMovieSetupRegisterFilter2(g_Templates[i].m_pAMovieSetup_Filter, pIFM2, bRegister);
179 
180  /* release interface */
181  if (pIFM2)
182  IFilterMapper2_Release(pIFM2);
183 
184  /* and clear up */
186  CoUninitialize();
187 
188  /* if unregistering, unregister all OLE servers */
189  if (SUCCEEDED(hr) && !bRegister)
191 
192  return hr;
193 }
194 
195 /****************************************************************************
196  * SetupInitializeServers
197  *
198  * This function is table driven using the static members of the
199  * CFactoryTemplate class defined in the Dll.
200  *
201  * It calls the initialize function for any class in CFactoryTemplate with
202  * one defined.
203  *
204  ****************************************************************************/
205 static void SetupInitializeServers(const FactoryTemplate * pList, int num,
206  BOOL bLoading)
207 {
208  int i;
209 
210  for (i = 0; i < num; i++, pList++)
211  {
212  if (pList->m_lpfnInit)
213  pList->m_lpfnInit(bLoading, pList->m_ClsID);
214  }
215 }
216 
218 {
219  switch (fdwReason)
220  {
221  case DLL_PROCESS_ATTACH:
222  g_hInst = hInstDLL;
223  DisableThreadLibraryCalls(hInstDLL);
225  break;
226  case DLL_PROCESS_DETACH:
228  break;
229  }
230  return TRUE;
231 }
232 
233 /******************************************************************************
234  * DLL ClassFactory
235  */
236 typedef struct {
237  IClassFactory IClassFactory_iface;
238  LONG ref;
241 
243 {
244  return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
245 }
246 
248 {
249  if (IsEqualGUID(riid, &IID_IUnknown) ||
251  {
252  IClassFactory_AddRef(iface);
253  *ppobj = iface;
254  return S_OK;
255  }
256 
257  *ppobj = NULL;
258  WARN("(%p)->(%s,%p), not found\n", iface, debugstr_guid(riid), ppobj);
259  return E_NOINTERFACE;
260 }
261 
263 {
265  return InterlockedIncrement(&This->ref);
266 }
267 
269 {
272 
273  if (ref == 0)
275 
276  return ref;
277 }
278 
280  REFIID riid, void **ppobj)
281 {
284  LPUNKNOWN punk;
285 
286  TRACE("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
287 
288  if (!ppobj)
289  return E_POINTER;
290 
291  /* Enforce the normal OLE rules regarding interfaces and delegation */
292  if (pOuter && !IsEqualGUID(riid, &IID_IUnknown))
293  return E_NOINTERFACE;
294 
295  *ppobj = NULL;
296  punk = This->pfnCreateInstance(pOuter, &hres);
297  if (!punk)
298  {
299  /* No object created, update error if it isn't done already and return */
300  if (SUCCEEDED(hres))
302  return hres;
303  }
304 
305  if (SUCCEEDED(hres))
306  {
307  hres = IUnknown_QueryInterface(punk, riid, ppobj);
308  }
309  /* Releasing the object. If everything was successful, QueryInterface
310  should have incremented the refcount once more, otherwise this will
311  purge the object. */
312  IUnknown_Release(punk);
313  return hres;
314 }
315 
317 {
319  TRACE("(%p)->(%d)\n",This, dolock);
320 
321  if (dolock)
323  else
325  return S_OK;
326 }
327 
328 static const IClassFactoryVtbl DSCF_Vtbl =
329 {
331  DSCF_AddRef,
332  DSCF_Release,
335 };
336 
337 /***********************************************************************
338  * DllGetClassObject
339  */
341 {
342  const FactoryTemplate *pList = g_Templates;
344  int i;
345 
346  TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
347 
348  if (!ppv)
349  return E_POINTER;
350 
351  *ppv = NULL;
352 
355  return E_NOINTERFACE;
356 
357  for (i = 0; i < g_cTemplates; i++, pList++)
358  {
359  if (IsEqualGUID(pList->m_ClsID, rclsid))
360  break;
361  }
362 
363  if (i == g_cTemplates)
364  {
365  char dllname[MAX_PATH];
366  if (!GetModuleFileNameA(g_hInst, dllname, sizeof(dllname)))
367  strcpy(dllname, "???");
368  ERR("%s: no class found in %s.\n", debugstr_guid(rclsid), dllname);
370  }
371  else if (!pList->m_lpfnNew)
372  {
373  FIXME("%s: class not implemented yet.\n", debugstr_guid(rclsid));
375  }
376 
378  if (!factory)
379  return E_OUTOFMEMORY;
380 
382  factory->ref = 1;
383 
384  factory->pfnCreateInstance = pList->m_lpfnNew;
385 
387  return S_OK;
388 }
389 
390 /***********************************************************************
391  * DllCanUnloadNow
392  */
394 {
395  TRACE("\n");
396 
397  if (server_locks == 0)
398  return S_OK;
399  return S_FALSE;
400 }
static HRESULT WINAPI DSCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: dllfunc.c:279
WCHAR OLECHAR
Definition: compat.h:1933
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:607
const WCHAR * name
Definition: strmbase.h:324
#define REFIID
Definition: guiddef.h:113
#define TRUE
Definition: types.h:120
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
const AMOVIESETUP_PIN * pPin
Definition: strmbase.h:327
#define ERROR_SUCCESS
Definition: deptool.c:10
static IClassFactoryImpl * impl_from_IClassFactory(IClassFactory *iface)
Definition: dllfunc.c:242
static ULONG WINAPI DSCF_Release(IClassFactory *iface)
Definition: dllfunc.c:268
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * m_Name
Definition: strmbase.h:334
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
static const WCHAR tmodel_keyname[]
Definition: dllfunc.c:57
#define NOERROR
Definition: winerror.h:2354
REFIID riid
Definition: precomp.h:44
#define REFCLSID
Definition: guiddef.h:112
#define WARN(fmt,...)
Definition: debug.h:111
#define CHARS_IN_GUID
REFIID LPVOID * ppv
Definition: atlbase.h:39
LONG WINAPI RegSetValueW(HKEY hKeyOriginal, LPCWSTR lpSubKey, DWORD dwType, LPCWSTR lpData, DWORD cbData)
Definition: reg.c:5014
static const WCHAR szCLSID[]
Definition: msipriv.h:1160
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
#define DLL_PROCESS_ATTACH
Definition: compat.h:120
#define lstrlenW
Definition: compat.h:407
#define E_FAIL
Definition: ddrawi.h:102
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:546
Definition: send.c:47
struct tagIClassFactoryImpl IClassFactoryImpl
DWORD dwMerit
Definition: axextend.idl:232
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void WINAPI DECLSPEC_HOTPATCH CoFreeUnusedLibraries(void)
Definition: compobj.c:3610
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
const int g_cTemplates
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
Definition: main.c:440
static LPUNKNOWN
Definition: ndr_ole.c:49
static const WCHAR tmodel_both[]
Definition: dllfunc.c:58
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
static ULONG WINAPI DSCF_AddRef(IClassFactory *iface)
Definition: dllfunc.c:262
#define S_FALSE
Definition: winerror.h:2357
static HRESULT SetupRegisterAllClasses(const FactoryTemplate *pList, int num, LPCWSTR szFileName, BOOL bRegister)
Definition: dllfunc.c:106
smooth NULL
Definition: ftsmooth.c:416
static const WCHAR ips32_keyname[]
Definition: dllfunc.c:56
const REGFILTERPINS * rgPins
Definition: axextend.idl:239
static const WCHAR clsid_keyname[]
Definition: dllfunc.c:55
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define DLL_PROCESS_DETACH
Definition: compat.h:119
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4895
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
static LONG server_locks
Definition: dllfunc.c:49
static const IClassFactoryVtbl DSCF_Vtbl
Definition: dllfunc.c:328
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2343
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint num
Definition: glext.h:9618
static HINSTANCE g_hInst
Definition: dllfunc.c:48
LPFNInitRoutine m_lpfnInit
Definition: strmbase.h:337
HRESULT WINAPI AMovieSetupRegisterFilter2(const AMOVIESETUP_FILTER *pFilter, IFilterMapper2 *pIFM2, BOOL bRegister)
Definition: dllfunc.c:134
int ret
REFCLSID clsid
Definition: msctf.c:84
static HRESULT WINAPI DSCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
Definition: dllfunc.c:247
static const WCHAR L[]
Definition: oid.c:1250
#define InterlockedDecrement
Definition: armddk.h:52
unsigned char BYTE
Definition: mem.h:68
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1199
ULONG cPins
Definition: axextend.idl:238
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3234
LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: reg.c:1746
#define ERR(fmt,...)
Definition: debug.h:109
const CLSID * m_ClsID
Definition: strmbase.h:335
LPFNNewCOMObject m_lpfnNew
Definition: strmbase.h:336
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:1991
DWORD dwVersion
Definition: axextend.idl:231
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
static HRESULT SetupRegisterClass(HKEY clsid, LPCWSTR szCLSID, LPCWSTR szDescription, LPCWSTR szFileName, LPCWSTR szServerType, LPCWSTR szThreadingModel)
Definition: dllfunc.c:63
static HRESULT WINAPI DSCF_LockServer(IClassFactory *iface, BOOL dolock)
Definition: dllfunc.c:316
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1897
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
HRESULT WINAPI AMovieDllRegisterServer2(BOOL bRegister)
Definition: dllfunc.c:155
const FactoryTemplate g_Templates[]
unsigned int ULONG
Definition: retypes.h:1
static ClassFactoryImpl factory
Definition: ole_server.c:234
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define E_POINTER
Definition: winerror.h:2365
IUnknown *(CALLBACK * LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr)
Definition: strmbase.h:330
const GUID IID_IClassFactory
HRESULT WINAPI STRMBASE_DllCanUnloadNow(void)
Definition: dllfunc.c:393
static void SetupInitializeServers(const FactoryTemplate *pList, int num, BOOL bLoading)
Definition: dllfunc.c:205
IClassFactory IClassFactory_iface
Definition: main.c:442
#define HeapFree(x, y, z)
Definition: compat.h:394
LPFNNewCOMObject pfnCreateInstance
Definition: dllfunc.c:239
const CLSID * clsid
Definition: strmbase.h:323
WINE_DEFAULT_DEBUG_CHANNEL(strmbase)
static const WCHAR szDescription[]
Definition: provider.c:52
#define SUCCEEDED(hr)
Definition: intsafe.h:57
BOOL WINAPI STRMBASE_DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
Definition: dllfunc.c:217
#define REG_SZ
Definition: layer.c:22
HRESULT WINAPI STRMBASE_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
Definition: dllfunc.c:340