ReactOS 0.4.16-dev-338-g34e76ad
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
45extern const int g_cTemplates;
46extern const FactoryTemplate g_Templates[];
47
49static LONG server_locks = 0;
50
51/*
52 * defines and constants
53 */
54
55static const WCHAR clsid_keyname[] = {'C','L','S','I','D',0 };
56static const WCHAR ips32_keyname[] = {'I','n','P','r','o','c','S','e','r','v','e','r','3','2',0};
57static const WCHAR tmodel_keyname[] = {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0};
58static 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));
96err_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{
110 HKEY hkey;
111 OLECHAR szCLSID[CHARS_IN_GUID];
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 */
119 hr = StringFromGUID2(pList->m_ClsID, szCLSID, CHARS_IN_GUID);
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 */
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 ****************************************************************************/
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 {
222 g_hInst = hInstDLL;
225 break;
228 break;
229 }
230 return TRUE;
231}
232
233/******************************************************************************
234 * DLL ClassFactory
235 */
236typedef struct {
237 IClassFactory IClassFactory_iface;
238 LONG ref;
241
243{
244 return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
245}
246
248{
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
328static const IClassFactoryVtbl DSCF_Vtbl =
329{
335};
336
337/***********************************************************************
338 * DllGetClassObject
339 */
341{
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}
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define RegCloseKey(hKey)
Definition: registry.h:49
LSTATUS WINAPI RegDeleteTreeW(_In_ HKEY, _In_opt_ LPCWSTR)
#define CHARS_IN_GUID
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const WCHAR szDescription[]
Definition: provider.c:55
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:4882
LONG WINAPI RegSetValueW(HKEY hKeyOriginal, LPCWSTR lpSubKey, DWORD dwType, LPCWSTR lpData, DWORD cbData)
Definition: reg.c:5000
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1201
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define HeapAlloc
Definition: compat.h:733
WCHAR OLECHAR
Definition: compat.h:2292
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
void WINAPI DECLSPEC_HOTPATCH CoFreeUnusedLibraries(void)
Definition: compobj.c:3701
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
static const WCHAR tmodel_keyname[]
Definition: dllfunc.c:57
static ULONG WINAPI DSCF_AddRef(IClassFactory *iface)
Definition: dllfunc.c:262
static HRESULT SetupRegisterClass(HKEY clsid, LPCWSTR szCLSID, LPCWSTR szDescription, LPCWSTR szFileName, LPCWSTR szServerType, LPCWSTR szThreadingModel)
Definition: dllfunc.c:63
static HRESULT SetupRegisterAllClasses(const FactoryTemplate *pList, int num, LPCWSTR szFileName, BOOL bRegister)
Definition: dllfunc.c:106
HRESULT WINAPI AMovieSetupRegisterFilter2(const AMOVIESETUP_FILTER *pFilter, IFilterMapper2 *pIFM2, BOOL bRegister)
Definition: dllfunc.c:134
const int g_cTemplates
Definition: qcap_main.c:145
static ULONG WINAPI DSCF_Release(IClassFactory *iface)
Definition: dllfunc.c:268
HRESULT WINAPI STRMBASE_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
Definition: dllfunc.c:340
HRESULT WINAPI STRMBASE_DllCanUnloadNow(void)
Definition: dllfunc.c:393
static const WCHAR tmodel_both[]
Definition: dllfunc.c:58
BOOL WINAPI STRMBASE_DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
Definition: dllfunc.c:217
static HRESULT WINAPI DSCF_LockServer(IClassFactory *iface, BOOL dolock)
Definition: dllfunc.c:316
static LONG server_locks
Definition: dllfunc.c:49
static const WCHAR clsid_keyname[]
Definition: dllfunc.c:55
static void SetupInitializeServers(const FactoryTemplate *pList, int num, BOOL bLoading)
Definition: dllfunc.c:205
static HRESULT WINAPI DSCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
Definition: dllfunc.c:247
const FactoryTemplate g_Templates[]
Definition: qcap_main.c:76
HRESULT WINAPI AMovieDllRegisterServer2(BOOL bRegister)
Definition: dllfunc.c:155
static const IClassFactoryVtbl DSCF_Vtbl
Definition: dllfunc.c:328
static IClassFactoryImpl * impl_from_IClassFactory(IClassFactory *iface)
Definition: dllfunc.c:242
static HRESULT WINAPI DSCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: dllfunc.c:279
static const WCHAR ips32_keyname[]
Definition: dllfunc.c:56
static HINSTANCE g_hInst
Definition: dllfunc.c:48
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxChildList * pList
GLuint GLuint num
Definition: glext.h:9618
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
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_guid
Definition: kernel32.h:35
#define REG_SZ
Definition: layer.c:22
HRESULT hres
Definition: protocol.c:465
REFCLSID clsid
Definition: msctf.c:82
static LPUNKNOWN
Definition: ndr_ole.c:49
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
IUnknown *(CALLBACK * LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr)
Definition: strmbase.h:330
const CLSID * clsid
Definition: strmbase.h:323
const AMOVIESETUP_PIN * pPin
Definition: strmbase.h:327
const WCHAR * name
Definition: strmbase.h:324
LPFNNewCOMObject pfnCreateInstance
Definition: dllfunc.c:239
DWORD dwVersion
Definition: axextend.idl:236
const REGFILTERPINS * rgPins
Definition: axextend.idl:244
ULONG cPins
Definition: axextend.idl:243
DWORD dwMerit
Definition: axextend.idl:237
Definition: main.c:439
IClassFactory IClassFactory_iface
Definition: main.c:440
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
int ret
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define NOERROR
Definition: winerror.h:2354
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define E_POINTER
Definition: winerror.h:2365
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193