ReactOS 0.4.17-dev-1037-g720d112
filtermapper.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winreg.h"
#include "winerror.h"
#include "quartz_private.h"
#include "ole2.h"
#include "olectl.h"
#include "strmif.h"
#include "uuids.h"
#include "initguid.h"
#include "wine/fil_data.h"
#include "wine/debug.h"
Include dependency graph for filtermapper.c:

Go to the source code of this file.

Classes

struct  enum_reg_filters
 
struct  enum_moniker
 
struct  FilterMapper3Impl
 
struct  REG_RF
 
struct  REG_RFP
 
struct  REG_TYPE
 
struct  MONIKER_MERIT
 
struct  Vector
 

Typedefs

typedef struct FilterMapper3Impl FilterMapper3Impl
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (quartz)
 
static struct enum_reg_filters * impl_from_IEnumRegFilters (IEnumRegFilters *iface)
 
static HRESULT WINAPI enum_reg_filters_QueryInterface (IEnumRegFilters *iface, REFIID iid, void **out)
 
static ULONG WINAPI enum_reg_filters_AddRef (IEnumRegFilters *iface)
 
static ULONG WINAPI enum_reg_filters_Release (IEnumRegFilters *iface)
 
static HRESULT WINAPI enum_reg_filters_Next (IEnumRegFilters *iface, ULONG count, REGFILTER **filters, ULONG *ret_count)
 
static HRESULT WINAPI enum_reg_filters_Skip (IEnumRegFilters *iface, ULONG count)
 
static HRESULT WINAPI enum_reg_filters_Reset (IEnumRegFilters *iface)
 
static HRESULT WINAPI enum_reg_filters_Clone (IEnumRegFilters *iface, IEnumRegFilters **out)
 
static HRESULT enum_reg_filters_create (REGFILTER *filters, unsigned int count, IEnumRegFilters **out)
 
static struct enum_moniker * impl_from_IEnumMoniker (IEnumMoniker *iface)
 
static HRESULT WINAPI enum_moniker_QueryInterface (IEnumMoniker *iface, REFIID iid, void **out)
 
static ULONG WINAPI enum_moniker_AddRef (IEnumMoniker *iface)
 
static ULONG WINAPI enum_moniker_Release (IEnumMoniker *iface)
 
static HRESULT WINAPI enum_moniker_Next (IEnumMoniker *iface, ULONG count, IMoniker **filters, ULONG *ret_count)
 
static HRESULT WINAPI enum_moniker_Skip (IEnumMoniker *iface, ULONG count)
 
static HRESULT WINAPI enum_moniker_Reset (IEnumMoniker *iface)
 
static HRESULT WINAPI enum_moniker_Clone (IEnumMoniker *iface, IEnumMoniker **out)
 
static HRESULT enum_moniker_create (IMoniker **filters, unsigned int count, IEnumMoniker **out)
 
static FilterMapper3Impl * impl_from_IFilterMapper3 (IFilterMapper3 *iface)
 
static FilterMapper3Impl * impl_from_IFilterMapper (IFilterMapper *iface)
 
static FilterMapper3Impl * impl_from_IAMFilterData (IAMFilterData *iface)
 
static FilterMapper3Impl * impl_from_IUnknown (IUnknown *iface)
 
static int add_data (struct Vector *v, const void *pData, int size)
 
static int find_data (const struct Vector *v, const void *pData, int size)
 
static void delete_vector (struct Vector *v)
 
static HRESULT WINAPI Inner_QueryInterface (IUnknown *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI Inner_AddRef (IUnknown *iface)
 
static ULONG WINAPI Inner_Release (IUnknown *iface)
 
static HRESULT WINAPI FilterMapper3_QueryInterface (IFilterMapper3 *iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI FilterMapper3_AddRef (IFilterMapper3 *iface)
 
static ULONG WINAPI FilterMapper3_Release (IFilterMapper3 *iface)
 
static HRESULT WINAPI FilterMapper3_CreateCategory (IFilterMapper3 *iface, REFCLSID category, DWORD merit, const WCHAR *description)
 
static HRESULT WINAPI FilterMapper3_UnregisterFilter (IFilterMapper3 *iface, const CLSID *category, const WCHAR *instance, REFCLSID clsid)
 
static HRESULT FM2_WriteFilterData (const REGFILTER2 *prf2, BYTE **ppData, ULONG *pcbData)
 
static HRESULT FM2_ReadFilterData (BYTE *pData, REGFILTER2 *prf2)
 
static void FM2_DeleteRegFilter (REGFILTER2 *prf2)
 
static HRESULT WINAPI FilterMapper3_RegisterFilter (IFilterMapper3 *iface, REFCLSID clsid, const WCHAR *name, IMoniker **ret_moniker, const CLSID *category, const WCHAR *instance, const REGFILTER2 *prf2)
 
static BOOL MatchTypes (BOOL bExactMatch, DWORD nPinTypes, const REGPINTYPES *pPinTypes, DWORD nMatchTypes, const GUID *pMatchTypes)
 
static int __cdecl mm_compare (const void *left, const void *right)
 
static HRESULT WINAPI FilterMapper3_EnumMatchingFilters (IFilterMapper3 *iface, IEnumMoniker **ppEnum, DWORD dwFlags, BOOL bExactMatch, DWORD dwMerit, BOOL bInputNeeded, DWORD cInputTypes, const GUID *pInputTypes, const REGPINMEDIUM *pMedIn, const CLSID *pPinCategoryIn, BOOL bRender, BOOL bOutputNeeded, DWORD cOutputTypes, const GUID *pOutputTypes, const REGPINMEDIUM *pMedOut, const CLSID *pPinCategoryOut)
 
static HRESULT WINAPI FilterMapper3_GetICreateDevEnum (IFilterMapper3 *iface, ICreateDevEnum **ppEnum)
 
static HRESULT WINAPI FilterMapper_QueryInterface (IFilterMapper *iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI FilterMapper_AddRef (IFilterMapper *iface)
 
static ULONG WINAPI FilterMapper_Release (IFilterMapper *iface)
 
static HRESULT WINAPI FilterMapper_EnumMatchingFilters (IFilterMapper *iface, IEnumRegFilters **ppEnum, DWORD dwMerit, BOOL bInputNeeded, CLSID clsInMaj, CLSID clsInSub, BOOL bRender, BOOL bOutputNeeded, CLSID clsOutMaj, CLSID clsOutSub)
 
static HRESULT WINAPI FilterMapper_RegisterFilter (IFilterMapper *iface, CLSID clsid, const WCHAR *name, DWORD merit)
 
static HRESULT WINAPI FilterMapper_RegisterFilterInstance (IFilterMapper *iface, CLSID clsid, LPCWSTR szName, CLSID *MRId)
 
static HRESULT WINAPI FilterMapper_RegisterPin (IFilterMapper *iface, CLSID clsid, const WCHAR *name, BOOL rendered, BOOL output, BOOL zero, BOOL many, CLSID external_filter, const WCHAR *external_pin)
 
static HRESULT WINAPI FilterMapper_RegisterPinType (IFilterMapper *iface, CLSID clsid, const WCHAR *pin, CLSID majortype, CLSID subtype)
 
static HRESULT WINAPI FilterMapper_UnregisterFilter (IFilterMapper *iface, CLSID clsid)
 
static HRESULT WINAPI FilterMapper_UnregisterFilterInstance (IFilterMapper *iface, CLSID MRId)
 
static HRESULT WINAPI FilterMapper_UnregisterPin (IFilterMapper *iface, CLSID clsid, const WCHAR *name)
 
static HRESULT WINAPI AMFilterData_QueryInterface (IAMFilterData *iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI AMFilterData_AddRef (IAMFilterData *iface)
 
static ULONG WINAPI AMFilterData_Release (IAMFilterData *iface)
 
static HRESULT WINAPI AMFilterData_ParseFilterData (IAMFilterData *iface, BYTE *pData, ULONG cb, BYTE **ppRegFilter2)
 
static HRESULT WINAPI AMFilterData_CreateFilterData (IAMFilterData *iface, REGFILTER2 *prf2, BYTE **pRegFilterData, ULONG *pcb)
 
HRESULT filter_mapper_create (IUnknown *pUnkOuter, IUnknown **out)
 

Variables

static const IEnumRegFiltersVtbl enum_reg_filters_vtbl
 
static const IEnumMonikerVtbl enum_moniker_vtbl
 
static const IUnknownVtbl IInner_VTable
 
static const IFilterMapper3Vtbl fm3vtbl
 
static const IFilterMapperVtbl fmvtbl
 
static const IAMFilterDataVtbl AMFilterDataVtbl
 

Typedef Documentation

◆ FilterMapper3Impl

Function Documentation

◆ add_data()

static int add_data ( struct Vector *  v,
const void *  pData,
int  size 
)
static

Definition at line 407 of file filtermapper.c.

408{
409 int index = v->current;
410 if (v->current + size > v->capacity)
411 {
412 int new_capacity = (v->capacity + size) * 2;
413 BYTE *new_data = CoTaskMemRealloc(v->pData, new_capacity);
414 if (!new_data) return -1;
415 v->capacity = new_capacity;
416 v->pData = new_data;
417 }
418 memcpy(v->pData + v->current, pData, size);
419 v->current += size;
420 return index;
421}
#define index(s, c)
Definition: various.h:29
void *WINAPI CoTaskMemRealloc(void *ptr, SIZE_T size)
Definition: malloc.c:397
const GLdouble * v
Definition: gl.h:2040
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
unsigned char BYTE
Definition: xxhash.c:193

Referenced by FilterMapper3_EnumMatchingFilters(), and FM2_WriteFilterData().

◆ AMFilterData_AddRef()

static ULONG WINAPI AMFilterData_AddRef ( IAMFilterData *  iface)
static

Definition at line 1616 of file filtermapper.c.

1617{
1619
1620 return IUnknown_AddRef(This->outer_unk);
1621}
static FilterMapper3Impl * impl_from_IAMFilterData(IAMFilterData *iface)
Definition: filtermapper.c:355

◆ AMFilterData_CreateFilterData()

static HRESULT WINAPI AMFilterData_CreateFilterData ( IAMFilterData *  iface,
REGFILTER2 *  prf2,
BYTE **  pRegFilterData,
ULONG *  pcb 
)
static

Definition at line 1656 of file filtermapper.c.

1660{
1662
1663 TRACE("(%p/%p)->(%p, %p, %p)\n", This, iface, prf2, pRegFilterData, pcb);
1664
1665 return FM2_WriteFilterData(prf2, pRegFilterData, pcb);
1666}
static HRESULT FM2_WriteFilterData(const REGFILTER2 *prf2, BYTE **ppData, ULONG *pcbData)
Definition: filtermapper.c:585
#define TRACE(s)
Definition: solgame.cpp:4

◆ AMFilterData_ParseFilterData()

static HRESULT WINAPI AMFilterData_ParseFilterData ( IAMFilterData *  iface,
BYTE *  pData,
ULONG  cb,
BYTE **  ppRegFilter2 
)
static

Definition at line 1631 of file filtermapper.c.

1634{
1636 HRESULT hr = S_OK;
1637 static REGFILTER2 *prf2;
1638
1639 TRACE("mapper %p, data %p, size %lu, parsed_data %p.\n", This, pData, cb, ppRegFilter2);
1640
1641 prf2 = CoTaskMemAlloc(sizeof(*prf2));
1642 if (!prf2)
1643 return E_OUTOFMEMORY;
1644 *ppRegFilter2 = (BYTE *)&prf2;
1645
1646 hr = FM2_ReadFilterData(pData, prf2);
1647 if (FAILED(hr))
1648 {
1649 CoTaskMemFree(prf2);
1650 *ppRegFilter2 = NULL;
1651 }
1652
1653 return hr;
1654}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
static HRESULT FM2_ReadFilterData(BYTE *pData, REGFILTER2 *prf2)
Definition: filtermapper.c:682
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51

◆ AMFilterData_QueryInterface()

static HRESULT WINAPI AMFilterData_QueryInterface ( IAMFilterData *  iface,
REFIID  riid,
LPVOID *  ppv 
)
static

Definition at line 1609 of file filtermapper.c.

1610{
1612
1613 return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
1614}
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ AMFilterData_Release()

static ULONG WINAPI AMFilterData_Release ( IAMFilterData *  iface)
static

Definition at line 1623 of file filtermapper.c.

1624{
1626
1627 return IUnknown_Release(This->outer_unk);
1628}

◆ delete_vector()

static void delete_vector ( struct Vector *  v)
static

Definition at line 433 of file filtermapper.c.

434{
435 CoTaskMemFree(v->pData);
436 v->current = 0;
437 v->capacity = 0;
438}

Referenced by FilterMapper3_EnumMatchingFilters(), and FM2_WriteFilterData().

◆ enum_moniker_AddRef()

static ULONG WINAPI enum_moniker_AddRef ( IEnumMoniker *  iface)
static

Definition at line 231 of file filtermapper.c.

232{
233 struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface);
235 TRACE("%p increasing refcount to %lu.\n", enumerator, refcount);
236 return refcount;
237}
#define InterlockedIncrement
Definition: armddk.h:53
static struct enum_moniker * impl_from_IEnumMoniker(IEnumMoniker *iface)
Definition: filtermapper.c:210
uint32_t ULONG
Definition: typedefs.h:59

◆ enum_moniker_Clone()

static HRESULT WINAPI enum_moniker_Clone ( IEnumMoniker *  iface,
IEnumMoniker **  out 
)
static

Definition at line 293 of file filtermapper.c.

294{
295 TRACE("iface %p, out %p, unimplemented.\n", iface, out);
296 return E_NOTIMPL;
297}
#define E_NOTIMPL
Definition: ddrawi.h:99
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

◆ enum_moniker_create()

static HRESULT enum_moniker_create ( IMoniker **  filters,
unsigned int  count,
IEnumMoniker **  out 
)
static

Definition at line 310 of file filtermapper.c.

311{
312 struct enum_moniker *object;
313
314 *out = NULL;
315
316 if (!(object = calloc(1, sizeof(*object))))
317 return E_OUTOFMEMORY;
318
319 if (!(object->filters = malloc(count * sizeof(*object->filters))))
320 {
321 free(object);
322 return E_OUTOFMEMORY;
323 }
324 memcpy(object->filters, filters, count * sizeof(*filters));
325
326 object->IEnumMoniker_iface.lpVtbl = &enum_moniker_vtbl;
327 object->refcount = 1;
328 object->count = count;
329
330 TRACE("Created enumerator %p.\n", object);
331 *out = &object->IEnumMoniker_iface;
332 return S_OK;
333}
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
static const IEnumMonikerVtbl enum_moniker_vtbl
Definition: filtermapper.c:299
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define calloc
Definition: rosglue.h:14
IMoniker ** filters
Definition: filtermapper.c:207

Referenced by FilterMapper3_EnumMatchingFilters().

◆ enum_moniker_Next()

static HRESULT WINAPI enum_moniker_Next ( IEnumMoniker *  iface,
ULONG  count,
IMoniker **  filters,
ULONG *  ret_count 
)
static

Definition at line 256 of file filtermapper.c.

258{
259 struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface);
260 unsigned int i;
261
262 TRACE("iface %p, count %lu, filters %p, ret_count %p.\n", iface, count, filters, ret_count);
263
264 for (i = 0; i < count && enumerator->index + i < enumerator->count; ++i)
265 IMoniker_AddRef(filters[i] = enumerator->filters[enumerator->index + i]);
266
267 enumerator->index += i;
268 if (ret_count)
269 *ret_count = i;
270 return i ? S_OK : S_FALSE;
271}
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
unsigned int index
Definition: filtermapper.c:206
unsigned int count
Definition: filtermapper.c:206
#define S_FALSE
Definition: winerror.h:3451

◆ enum_moniker_QueryInterface()

static HRESULT WINAPI enum_moniker_QueryInterface ( IEnumMoniker *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 215 of file filtermapper.c.

216{
217 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
218
220 {
221 IEnumMoniker_AddRef(iface);
222 *out = iface;
223 return S_OK;
224 }
225
226 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
227 *out = NULL;
228 return E_NOINTERFACE;
229}
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
#define debugstr_guid
Definition: kernel32.h:35
const GUID IID_IEnumMoniker
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ enum_moniker_Release()

static ULONG WINAPI enum_moniker_Release ( IEnumMoniker *  iface)
static

Definition at line 239 of file filtermapper.c.

240{
241 struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface);
243 unsigned int i;
244
245 TRACE("%p decreasing refcount to %lu.\n", enumerator, refcount);
246 if (!refcount)
247 {
248 for (i = 0; i < enumerator->count; ++i)
249 IMoniker_Release(enumerator->filters[i]);
250 free(enumerator->filters);
251 free(enumerator);
252 }
253 return refcount;
254}
#define InterlockedDecrement
Definition: armddk.h:52

◆ enum_moniker_Reset()

static HRESULT WINAPI enum_moniker_Reset ( IEnumMoniker *  iface)
static

Definition at line 283 of file filtermapper.c.

284{
285 struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface);
286
287 TRACE("iface %p.\n", iface);
288
289 enumerator->index = 0;
290 return S_OK;
291}

◆ enum_moniker_Skip()

static HRESULT WINAPI enum_moniker_Skip ( IEnumMoniker *  iface,
ULONG  count 
)
static

Definition at line 273 of file filtermapper.c.

274{
275 struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface);
276
277 TRACE("iface %p, count %lu.\n", iface, count);
278
279 enumerator->index += count;
280 return S_OK;
281}

◆ enum_reg_filters_AddRef()

static ULONG WINAPI enum_reg_filters_AddRef ( IEnumRegFilters *  iface)
static

Definition at line 73 of file filtermapper.c.

74{
75 struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
77 TRACE("%p increasing refcount to %lu.\n", enumerator, refcount);
78 return refcount;
79}
static struct enum_reg_filters * impl_from_IEnumRegFilters(IEnumRegFilters *iface)
Definition: filtermapper.c:52

◆ enum_reg_filters_Clone()

static HRESULT WINAPI enum_reg_filters_Clone ( IEnumRegFilters *  iface,
IEnumRegFilters **  out 
)
static

Definition at line 146 of file filtermapper.c.

147{
148 TRACE("iface %p, out %p, unimplemented.\n", iface, out);
149 return E_NOTIMPL;
150}

◆ enum_reg_filters_create()

static HRESULT enum_reg_filters_create ( REGFILTER *  filters,
unsigned int  count,
IEnumRegFilters **  out 
)
static

Definition at line 163 of file filtermapper.c.

164{
165 struct enum_reg_filters *object;
166 unsigned int i;
167
168 *out = NULL;
169
170 if (!(object = calloc(1, sizeof(*object))))
171 return E_OUTOFMEMORY;
172
173 if (!(object->filters = malloc(count * sizeof(*object->filters))))
174 {
175 free(object);
176 return E_OUTOFMEMORY;
177 }
178
179 for (i = 0; i < count; ++i)
180 {
181 object->filters[i].Clsid = filters[i].Clsid;
182 if (!(object->filters[i].Name = wcsdup(filters[i].Name)))
183 {
184 while (i--)
185 free(object->filters[i].Name);
186 free(object->filters);
187 free(object);
188 return E_OUTOFMEMORY;
189 }
190 }
191
192 object->IEnumRegFilters_iface.lpVtbl = &enum_reg_filters_vtbl;
193 object->refcount = 1;
194 object->count = count;
195
196 TRACE("Created enumerator %p.\n", object);
197 *out = &object->IEnumRegFilters_iface;
198 return S_OK;
199}
LPWSTR Name
Definition: desk.c:124
static const IEnumRegFiltersVtbl enum_reg_filters_vtbl
Definition: filtermapper.c:152
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
CLSID Clsid
Definition: axextend.idl:83
REGFILTER * filters
Definition: filtermapper.c:49

Referenced by FilterMapper_EnumMatchingFilters().

◆ enum_reg_filters_Next()

static HRESULT WINAPI enum_reg_filters_Next ( IEnumRegFilters *  iface,
ULONG  count,
REGFILTER **  filters,
ULONG *  ret_count 
)
static

Definition at line 98 of file filtermapper.c.

100{
101 struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
102 unsigned int i;
103
104 TRACE("iface %p, count %lu, filters %p, ret_count %p.\n", iface, count, filters, ret_count);
105
106 for (i = 0; i < count && enumerator->index + i < enumerator->count; ++i)
107 {
108 REGFILTER *filter = &enumerator->filters[enumerator->index + i];
109
110 if (!(filters[i] = CoTaskMemAlloc(sizeof(REGFILTER) + (wcslen(filter->Name) + 1) * sizeof(WCHAR))))
111 {
112 while (i--)
114 memset(filters, 0, count * sizeof(*filters));
115 *ret_count = 0;
116 return E_OUTOFMEMORY;
117 }
118
119 filters[i]->Clsid = filter->Clsid;
120 filters[i]->Name = (WCHAR *)(filters[i] + 1);
121 wcscpy(filters[i]->Name, filter->Name);
122 }
123
124 enumerator->index += i;
125 if (ret_count)
126 *ret_count = i;
127 return i ? S_OK : S_FALSE;
128}
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
short WCHAR
Definition: pedump.c:58
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
LPWSTR Name
Definition: axextend.idl:84
unsigned int index
Definition: filtermapper.c:48
unsigned int count
Definition: filtermapper.c:48
Definition: filter.c:165

◆ enum_reg_filters_QueryInterface()

static HRESULT WINAPI enum_reg_filters_QueryInterface ( IEnumRegFilters *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 57 of file filtermapper.c.

58{
59 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
60
61 if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IEnumRegFilters))
62 {
63 IEnumRegFilters_AddRef(iface);
64 *out = iface;
65 return S_OK;
66 }
67
68 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
69 *out = NULL;
70 return E_NOINTERFACE;
71}

◆ enum_reg_filters_Release()

static ULONG WINAPI enum_reg_filters_Release ( IEnumRegFilters *  iface)
static

Definition at line 81 of file filtermapper.c.

82{
83 struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
85 unsigned int i;
86
87 TRACE("%p decreasing refcount to %lu.\n", enumerator, refcount);
88 if (!refcount)
89 {
90 for (i = 0; i < enumerator->count; ++i)
91 free(enumerator->filters[i].Name);
92 free(enumerator->filters);
93 free(enumerator);
94 }
95 return refcount;
96}

◆ enum_reg_filters_Reset()

static HRESULT WINAPI enum_reg_filters_Reset ( IEnumRegFilters *  iface)
static

Definition at line 136 of file filtermapper.c.

137{
138 struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
139
140 TRACE("iface %p.\n", iface);
141
142 enumerator->index = 0;
143 return S_OK;
144}

◆ enum_reg_filters_Skip()

static HRESULT WINAPI enum_reg_filters_Skip ( IEnumRegFilters *  iface,
ULONG  count 
)
static

Definition at line 130 of file filtermapper.c.

131{
132 TRACE("iface %p, count %lu, unimplemented.\n", iface, count);
133 return E_NOTIMPL;
134}

◆ filter_mapper_create()

HRESULT filter_mapper_create ( IUnknown *  pUnkOuter,
IUnknown **  out 
)

Definition at line 1676 of file filtermapper.c.

1677{
1678 FilterMapper3Impl * pFM2impl;
1679
1680 pFM2impl = CoTaskMemAlloc(sizeof(*pFM2impl));
1681 if (!pFM2impl)
1682 return E_OUTOFMEMORY;
1683
1684 pFM2impl->IUnknown_inner.lpVtbl = &IInner_VTable;
1685 pFM2impl->IFilterMapper3_iface.lpVtbl = &fm3vtbl;
1686 pFM2impl->IFilterMapper_iface.lpVtbl = &fmvtbl;
1687 pFM2impl->IAMFilterData_iface.lpVtbl = &AMFilterDataVtbl;
1688 pFM2impl->ref = 1;
1689
1690 if (pUnkOuter)
1691 pFM2impl->outer_unk = pUnkOuter;
1692 else
1693 pFM2impl->outer_unk = &pFM2impl->IUnknown_inner;
1694
1695 TRACE("Created filter mapper %p.\n", pFM2impl);
1696 *out = &pFM2impl->IUnknown_inner;
1697 return S_OK;
1698}
static const IAMFilterDataVtbl AMFilterDataVtbl
static const IFilterMapperVtbl fmvtbl
static const IFilterMapper3Vtbl fm3vtbl
static const IUnknownVtbl IInner_VTable
Definition: filtermapper.c:493
IFilterMapper3 IFilterMapper3_iface
Definition: filtermapper.c:338
IUnknown * outer_unk
Definition: filtermapper.c:341
IUnknown IUnknown_inner
Definition: filtermapper.c:337
IFilterMapper IFilterMapper_iface
Definition: filtermapper.c:339
IAMFilterData IAMFilterData_iface
Definition: filtermapper.c:340

◆ FilterMapper3_AddRef()

static ULONG WINAPI FilterMapper3_AddRef ( IFilterMapper3 *  iface)
static

Definition at line 507 of file filtermapper.c.

508{
510
511 return IUnknown_AddRef(This->outer_unk);
512}
static FilterMapper3Impl * impl_from_IFilterMapper3(IFilterMapper3 *iface)
Definition: filtermapper.c:345

◆ FilterMapper3_CreateCategory()

static HRESULT WINAPI FilterMapper3_CreateCategory ( IFilterMapper3 *  iface,
REFCLSID  category,
DWORD  merit,
const WCHAR *  description 
)
static

Definition at line 523 of file filtermapper.c.

525{
526 WCHAR guidstr[39], keypath[93];
527 HKEY key;
528 LONG ret;
529
530 TRACE("iface %p, category %s, merit %#lx, description %s.\n", iface,
532
533 StringFromGUID2(category, guidstr, ARRAY_SIZE(guidstr));
534 wcscpy(keypath, L"CLSID\\{da4e3da0-d07d-11d0-bd50-00a0c911ce86}\\Instance\\");
535 wcscat(keypath, guidstr);
536
537 if ((ret = RegCreateKeyExW(HKEY_CLASSES_ROOT, keypath, 0, NULL, 0, KEY_WRITE, NULL, &key, NULL)))
538 return HRESULT_FROM_WIN32(ret);
539
540 if ((ret = RegSetValueExW(key, L"FriendlyName", 0, REG_SZ,
541 (const BYTE *)description, (wcslen(description) + 1) * sizeof(WCHAR))))
542 {
544 return HRESULT_FROM_WIN32(ret);
545 }
546
547 if ((ret = RegSetValueExW(key, L"CLSID", 0, REG_SZ, (const BYTE *)guidstr, sizeof(guidstr))))
548 {
550 return HRESULT_FROM_WIN32(ret);
551 }
552
553 if ((ret = RegSetValueExW(key, L"Merit", 0, REG_DWORD, (const BYTE *)&merit, sizeof(DWORD))))
554 {
556 return HRESULT_FROM_WIN32(ret);
557 }
558
560 return S_OK;
561}
#define REG_SZ
Definition: layer.c:22
#define ARRAY_SIZE(A)
Definition: main.h:20
#define RegCloseKey(hKey)
Definition: registry.h:49
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
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
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
Definition: combase.c:1525
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
#define debugstr_w
Definition: kernel32.h:32
#define KEY_WRITE
Definition: nt_native.h:1034
long LONG
Definition: pedump.c:60
#define REG_DWORD
Definition: sdbapi.c:615
wcscat
Definition: copy.c:22
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

◆ FilterMapper3_EnumMatchingFilters()

static HRESULT WINAPI FilterMapper3_EnumMatchingFilters ( IFilterMapper3 *  iface,
IEnumMoniker **  ppEnum,
DWORD  dwFlags,
BOOL  bExactMatch,
DWORD  dwMerit,
BOOL  bInputNeeded,
DWORD  cInputTypes,
const GUID *  pInputTypes,
const REGPINMEDIUM *  pMedIn,
const CLSID *  pPinCategoryIn,
BOOL  bRender,
BOOL  bOutputNeeded,
DWORD  cOutputTypes,
const GUID *  pOutputTypes,
const REGPINMEDIUM *  pMedOut,
const CLSID *  pPinCategoryOut 
)
static

Definition at line 999 of file filtermapper.c.

1016{
1017 ICreateDevEnum * pCreateDevEnum;
1018 IMoniker * pMonikerCat;
1019 IEnumMoniker * pEnumCat;
1020 HRESULT hr;
1021 struct Vector monikers = {NULL, 0, 0};
1022
1023 TRACE("(%p, %#lx, %s, %#lx, %s, %lu, %p, %p, %p, %s, %s, %p, %p, %p)\n",
1024 ppEnum,
1025 dwFlags,
1026 bExactMatch ? "true" : "false",
1027 dwMerit,
1028 bInputNeeded ? "true" : "false",
1029 cInputTypes,
1030 pInputTypes,
1031 pMedIn,
1032 pPinCategoryIn,
1033 bRender ? "true" : "false",
1034 bOutputNeeded ? "true" : "false",
1035 pOutputTypes,
1036 pMedOut,
1037 pPinCategoryOut);
1038
1039 if (dwFlags != 0)
1040 FIXME("Ignoring flags %#lx.\n", dwFlags);
1041
1042 *ppEnum = NULL;
1043
1044 hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (LPVOID*)&pCreateDevEnum);
1045 if (FAILED(hr))
1046 return hr;
1047
1048 hr = ICreateDevEnum_CreateClassEnumerator(pCreateDevEnum, &CLSID_ActiveMovieCategories, &pEnumCat, 0);
1049 if (FAILED(hr)) {
1050 ICreateDevEnum_Release(pCreateDevEnum);
1051 return hr;
1052 }
1053
1054 while (IEnumMoniker_Next(pEnumCat, 1, &pMonikerCat, NULL) == S_OK)
1055 {
1056 IPropertyBag * pPropBagCat = NULL;
1057 VARIANT var;
1058 HRESULT hrSub; /* this is so that one buggy filter
1059 doesn't make the whole lot fail */
1060
1061 VariantInit(&var);
1062
1063 hrSub = IMoniker_BindToStorage(pMonikerCat, NULL, NULL, &IID_IPropertyBag, (LPVOID*)&pPropBagCat);
1064
1065 if (SUCCEEDED(hrSub))
1066 hrSub = IPropertyBag_Read(pPropBagCat, L"Merit", &var, NULL);
1067
1068 if (SUCCEEDED(hrSub) && (V_UI4(&var) >= dwMerit))
1069 {
1070 CLSID clsidCat;
1071 IEnumMoniker * pEnum;
1072 IMoniker * pMoniker;
1073
1074 VariantClear(&var);
1075
1076 if (TRACE_ON(quartz))
1077 {
1078 VARIANT temp;
1079 V_VT(&temp) = VT_EMPTY;
1080 IPropertyBag_Read(pPropBagCat, L"FriendlyName", &temp, NULL);
1081 TRACE("Considering category %s\n", debugstr_w(V_BSTR(&temp)));
1083 }
1084
1085 hrSub = IPropertyBag_Read(pPropBagCat, L"CLSID", &var, NULL);
1086
1087 if (SUCCEEDED(hrSub))
1088 hrSub = CLSIDFromString(V_BSTR(&var), &clsidCat);
1089
1090 if (SUCCEEDED(hrSub))
1091 hrSub = ICreateDevEnum_CreateClassEnumerator(pCreateDevEnum, &clsidCat, &pEnum, 0);
1092
1093 if (hrSub == S_OK)
1094 {
1095 while (IEnumMoniker_Next(pEnum, 1, &pMoniker, NULL) == S_OK)
1096 {
1097 IPropertyBag * pPropBag = NULL;
1098 VARIANT var;
1099 BYTE *pData = NULL;
1100 REGFILTER2 rf2;
1101 DWORD i;
1102 BOOL bInputMatch = !bInputNeeded;
1103 BOOL bOutputMatch = !bOutputNeeded;
1104
1105 ZeroMemory(&rf2, sizeof(rf2));
1106 VariantInit(&var);
1107
1108 hrSub = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID*)&pPropBag);
1109
1110 if (TRACE_ON(quartz))
1111 {
1112 VARIANT temp;
1113 V_VT(&temp) = VT_EMPTY;
1114 IPropertyBag_Read(pPropBag, L"FriendlyName", &temp, NULL);
1115 TRACE("Considering filter %s\n", debugstr_w(V_BSTR(&temp)));
1117 }
1118
1119 if (SUCCEEDED(hrSub))
1120 {
1121 hrSub = IPropertyBag_Read(pPropBag, L"FilterData", &var, NULL);
1122 }
1123
1124 if (SUCCEEDED(hrSub))
1126
1127 if (SUCCEEDED(hrSub))
1128 hrSub = FM2_ReadFilterData(pData, &rf2);
1129
1130 if (pData)
1132
1133 VariantClear(&var);
1134
1135 /* Logic used for bInputMatch expression:
1136 * There exists some pin such that bInputNeeded implies (pin is an input and
1137 * (bRender implies pin has render flag) and major/minor types members of
1138 * pInputTypes )
1139 * bOutputMatch is similar, but without the "bRender implies ..." part
1140 * and substituting variables names containing input for output
1141 */
1142
1143 /* determine whether filter meets requirements */
1144 if (SUCCEEDED(hrSub) && (rf2.dwMerit >= dwMerit))
1145 {
1146 for (i = 0; (i < rf2.cPins2) && (!bInputMatch || !bOutputMatch); i++)
1147 {
1148 const REGFILTERPINS2 * rfp2 = rf2.rgPins2 + i;
1149
1150 bInputMatch = bInputMatch || (!(rfp2->dwFlags & REG_PINFLAG_B_OUTPUT) &&
1151 (!bRender || (rfp2->dwFlags & REG_PINFLAG_B_RENDERER)) &&
1152 MatchTypes(bExactMatch, rfp2->nMediaTypes, rfp2->lpMediaType, cInputTypes, pInputTypes));
1153 bOutputMatch = bOutputMatch || ((rfp2->dwFlags & REG_PINFLAG_B_OUTPUT) &&
1154 MatchTypes(bExactMatch, rfp2->nMediaTypes, rfp2->lpMediaType, cOutputTypes, pOutputTypes));
1155 }
1156
1157 if (bInputMatch && bOutputMatch)
1158 {
1159 struct MONIKER_MERIT mm = {pMoniker, rf2.dwMerit};
1160 IMoniker_AddRef(pMoniker);
1161 add_data(&monikers, &mm, sizeof(mm));
1162 }
1163 }
1164
1165 FM2_DeleteRegFilter(&rf2);
1166 if (pPropBag)
1167 IPropertyBag_Release(pPropBag);
1168 IMoniker_Release(pMoniker);
1169 }
1170 IEnumMoniker_Release(pEnum);
1171 }
1172 }
1173
1174 VariantClear(&var);
1175 if (pPropBagCat)
1176 IPropertyBag_Release(pPropBagCat);
1177 IMoniker_Release(pMonikerCat);
1178 }
1179
1180 if (SUCCEEDED(hr))
1181 {
1182 IMoniker ** ppMoniker;
1183 unsigned int i;
1184 ULONG nMonikerCount = monikers.current / sizeof(struct MONIKER_MERIT);
1185
1186 /* sort the monikers in descending merit order */
1187 qsort(monikers.pData, nMonikerCount,
1188 sizeof(struct MONIKER_MERIT),
1189 mm_compare);
1190
1191 /* construct an IEnumMoniker interface */
1192 ppMoniker = CoTaskMemAlloc(nMonikerCount * sizeof(IMoniker *));
1193 for (i = 0; i < nMonikerCount; i++)
1194 {
1195 /* no need to AddRef here as already AddRef'd above */
1196 ppMoniker[i] = ((struct MONIKER_MERIT *)monikers.pData)[i].pMoniker;
1197 }
1198 hr = enum_moniker_create(ppMoniker, nMonikerCount, ppEnum);
1199 CoTaskMemFree(ppMoniker);
1200 }
1201
1202 delete_vector(&monikers);
1203 IEnumMoniker_Release(pEnumCat);
1204 ICreateDevEnum_Release(pCreateDevEnum);
1205
1206 return hr;
1207}
@ REG_PINFLAG_B_RENDERER
Definition: axextend.idl:219
@ REG_PINFLAG_B_OUTPUT
Definition: axextend.idl:221
#define FIXME(fmt,...)
Definition: precomp.h:53
static void delete_vector(struct Vector *v)
Definition: filtermapper.c:433
static BOOL MatchTypes(BOOL bExactMatch, DWORD nPinTypes, const REGPINTYPES *pPinTypes, DWORD nMatchTypes, const GUID *pMatchTypes)
Definition: filtermapper.c:950
static void FM2_DeleteRegFilter(REGFILTER2 *prf2)
Definition: filtermapper.c:788
static HRESULT enum_moniker_create(IMoniker **filters, unsigned int count, IEnumMoniker **out)
Definition: filtermapper.c:310
static int add_data(struct Vector *v, const void *pData, int size)
Definition: filtermapper.c:407
static int __cdecl mm_compare(const void *left, const void *right)
Definition: filtermapper.c:980
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#define TRACE_ON(x)
Definition: compat.h:75
@ VT_EMPTY
Definition: compat.h:2295
_ACRTIMP void __cdecl qsort(void *, size_t, size_t, int(__cdecl *)(const void *, const void *))
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
unsigned int BOOL
Definition: ntddk_ex.h:94
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define ZeroMemory
Definition: minwinbase.h:31
const char * var
Definition: shader.c:5879
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_UI4(A)
Definition: oleauto.h:270
const GUID IID_IPropertyBag
static calc_node_t temp
Definition: rpn_ieee.c:38
IMoniker * pMoniker
Definition: filtermapper.c:395
DWORD dwMerit
Definition: axextend.idl:239
const REGFILTERPINS2 * rgPins2
Definition: axextend.idl:253
ULONG cPins2
Definition: axextend.idl:252
const REGPINTYPES * lpMediaType
Definition: axextend.idl:230
LPBYTE pData
Definition: filtermapper.c:401
int current
Definition: filtermapper.c:403
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547

◆ FilterMapper3_GetICreateDevEnum()

static HRESULT WINAPI FilterMapper3_GetICreateDevEnum ( IFilterMapper3 *  iface,
ICreateDevEnum **  ppEnum 
)
static

Definition at line 1209 of file filtermapper.c.

1210{
1211 TRACE("(%p, %p)\n", iface, ppEnum);
1212 if (!ppEnum)
1213 return E_POINTER;
1214 return CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (void**)ppEnum);
1215}
#define E_POINTER
Definition: winerror.h:3480

◆ FilterMapper3_QueryInterface()

static HRESULT WINAPI FilterMapper3_QueryInterface ( IFilterMapper3 *  iface,
REFIID  riid,
LPVOID *  ppv 
)
static

Definition at line 500 of file filtermapper.c.

501{
503
504 return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
505}

Referenced by FilterMapper_QueryInterface().

◆ FilterMapper3_RegisterFilter()

static HRESULT WINAPI FilterMapper3_RegisterFilter ( IFilterMapper3 *  iface,
REFCLSID  clsid,
const WCHAR *  name,
IMoniker **  ret_moniker,
const CLSID *  category,
const WCHAR *  instance,
const REGFILTER2 *  prf2 
)
static

Definition at line 807 of file filtermapper.c.

810{
811 WCHAR *display_name, clsid_string[39];
813 IPropertyBag *prop_bag;
814 ULONG filter_data_len;
816 BYTE *filter_data;
817 VARIANT var;
818 ULONG eaten;
819 HRESULT hr;
820 size_t len;
821 REGFILTER2 regfilter2;
822 REGFILTERPINS2* pregfp2 = NULL;
823
824 TRACE("iface %p, clsid %s, name %s, ret_moniker %p, category %s, instance %s, prf2 %p.\n",
825 iface, debugstr_guid(clsid), debugstr_w(name), ret_moniker,
827
828 if (prf2->dwVersion == 2)
829 {
830 regfilter2 = *prf2;
831 }
832 else if (prf2->dwVersion == 1)
833 {
834 ULONG i;
835 DWORD flags;
836 /* REGFILTER2 structure is converted from version 1 to 2. Tested on Win2k. */
837 regfilter2.dwVersion = 2;
838 regfilter2.dwMerit = prf2->dwMerit;
839 regfilter2.cPins2 = prf2->cPins;
840 pregfp2 = CoTaskMemAlloc(prf2->cPins * sizeof(REGFILTERPINS2));
841 regfilter2.rgPins2 = pregfp2;
842 for (i = 0; i < prf2->cPins; i++)
843 {
844 flags = 0;
845 if (prf2->rgPins[i].bRendered)
847 if (prf2->rgPins[i].bOutput)
849 if (prf2->rgPins[i].bZero)
851 if (prf2->rgPins[i].bMany)
853 pregfp2[i].dwFlags = flags;
854 pregfp2[i].cInstances = 1;
855 pregfp2[i].nMediaTypes = prf2->rgPins[i].nMediaTypes;
856 pregfp2[i].lpMediaType = prf2->rgPins[i].lpMediaType;
857 pregfp2[i].nMediums = 0;
858 pregfp2[i].lpMedium = NULL;
859 pregfp2[i].clsPinCategory = NULL;
860 }
861 }
862 else
863 {
864 FIXME("dwVersion other that 1 or 2 not supported at the moment\n");
865 return E_NOTIMPL;
866 }
867
868 if (ret_moniker)
869 *ret_moniker = NULL;
870
871 if (!category)
872 category = &CLSID_LegacyAmFilterCategory;
873
874 StringFromGUID2(clsid, clsid_string, ARRAY_SIZE(clsid_string));
875
876 len = 50 + (instance ? wcslen(instance) : 38) + 1;
877 if (!(display_name = malloc(len * sizeof(WCHAR))))
878 return E_OUTOFMEMORY;
879
880 wcscpy(display_name, L"@device:sw:");
881 StringFromGUID2(category, display_name + wcslen(display_name), len - wcslen(display_name));
882 wcscat(display_name, L"\\");
883 wcscat(display_name, instance ? instance : clsid_string);
884
885 if (FAILED(hr = CoCreateInstance(&CLSID_CDeviceMoniker, NULL, CLSCTX_INPROC,
886 &IID_IParseDisplayName, (void **)&parser)))
887 {
888 free(display_name);
889 return hr;
890 }
891
892 if (FAILED(hr = IParseDisplayName_ParseDisplayName(parser, NULL, display_name, &eaten, &moniker)))
893 {
894 ERR("Failed to parse display name, hr %#lx.\n", hr);
895 IParseDisplayName_Release(parser);
896 free(display_name);
897 return hr;
898 }
899
900 IParseDisplayName_Release(parser);
901
902 if (FAILED(hr = IMoniker_BindToStorage(moniker, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag)))
903 {
904 ERR("Failed to get property bag, hr %#lx.\n", hr);
905 IMoniker_Release(moniker);
906 free(display_name);
907 return hr;
908 }
909
910 V_VT(&var) = VT_BSTR;
912 if (FAILED(hr = IPropertyBag_Write(prop_bag, L"FriendlyName", &var)))
913 ERR("Failed to write friendly name, hr %#lx.\n", hr);
915
916 V_VT(&var) = VT_BSTR;
917 V_BSTR(&var) = SysAllocString(clsid_string);
918 if (FAILED(hr = IPropertyBag_Write(prop_bag, L"CLSID", &var)))
919 ERR("Failed to write class ID, hr %#lx.\n", hr);
921
922 if (SUCCEEDED(FM2_WriteFilterData(&regfilter2, &filter_data, &filter_data_len)))
923 {
924 V_VT(&var) = VT_ARRAY | VT_UI1;
925 if ((V_ARRAY(&var) = SafeArrayCreateVector(VT_UI1, 0, filter_data_len)))
926 {
927 memcpy(V_ARRAY(&var)->pvData, filter_data, filter_data_len);
928 if (FAILED(hr = IPropertyBag_Write(prop_bag, L"FilterData", &var)))
929 ERR("Failed to write filter data, hr %#lx.\n", hr);
931 }
932
933 CoTaskMemFree(filter_data);
934 }
935
936 IPropertyBag_Release(prop_bag);
937 free(display_name);
938
939 if (ret_moniker)
940 *ret_moniker = moniker;
941 else
942 IMoniker_Release(moniker);
943
944 CoTaskMemFree(pregfp2);
945
946 return S_OK;
947}
@ REG_PINFLAG_B_ZERO
Definition: axextend.idl:218
#define ERR(fmt,...)
Definition: precomp.h:57
static HINSTANCE instance
Definition: main.c:35
@ VT_BSTR
Definition: compat.h:2303
@ VT_ARRAY
Definition: compat.h:2341
@ VT_UI1
Definition: compat.h:2311
SAFEARRAY *WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements)
Definition: safearray.c:677
#define REG_PINFLAG_B_MANY
Definition: precomp.h:17
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
const CLSID * clsid
Definition: msctf.cpp:50
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
const GUID IID_IParseDisplayName
DWORD dwVersion
Definition: axextend.idl:238
const REGFILTERPINS * rgPins
Definition: axextend.idl:246
ULONG cPins
Definition: axextend.idl:245
const CLSID * clsPinCategory
Definition: axextend.idl:233
const REGPINMEDIUM * lpMedium
Definition: axextend.idl:232
const REGPINTYPES * lpMediaType
Definition: axextend.idl:206
UINT nMediaTypes
Definition: axextend.idl:205
Definition: name.c:39
Definition: import.c:81

◆ FilterMapper3_Release()

static ULONG WINAPI FilterMapper3_Release ( IFilterMapper3 *  iface)
static

Definition at line 514 of file filtermapper.c.

515{
517
518 return IUnknown_Release(This->outer_unk);
519}

◆ FilterMapper3_UnregisterFilter()

static HRESULT WINAPI FilterMapper3_UnregisterFilter ( IFilterMapper3 *  iface,
const CLSID *  category,
const WCHAR *  instance,
REFCLSID  clsid 
)
static

Definition at line 563 of file filtermapper.c.

565{
566 WCHAR keypath[93];
567
568 TRACE("iface %p, category %s, instance %s, clsid %s.\n",
570
571 if (!category)
572 category = &CLSID_LegacyAmFilterCategory;
573
574 wcscpy(keypath, L"CLSID\\");
575 StringFromGUID2(category, keypath + wcslen(keypath), ARRAY_SIZE(keypath) - wcslen(keypath));
576 wcscat(keypath, L"\\Instance\\");
577 if (instance)
578 wcscat(keypath, instance);
579 else
580 StringFromGUID2(clsid, keypath + wcslen(keypath), ARRAY_SIZE(keypath) - wcslen(keypath));
581
583}
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239

◆ FilterMapper_AddRef()

static ULONG WINAPI FilterMapper_AddRef ( IFilterMapper *  iface)
static

Definition at line 1242 of file filtermapper.c.

1243{
1245
1246 return IUnknown_AddRef(This->outer_unk);
1247}
static FilterMapper3Impl * impl_from_IFilterMapper(IFilterMapper *iface)
Definition: filtermapper.c:350

◆ FilterMapper_EnumMatchingFilters()

static HRESULT WINAPI FilterMapper_EnumMatchingFilters ( IFilterMapper *  iface,
IEnumRegFilters **  ppEnum,
DWORD  dwMerit,
BOOL  bInputNeeded,
CLSID  clsInMaj,
CLSID  clsInSub,
BOOL  bRender,
BOOL  bOutputNeeded,
CLSID  clsOutMaj,
CLSID  clsOutSub 
)
static

Definition at line 1258 of file filtermapper.c.

1269{
1271 GUID InputType[2];
1272 GUID OutputType[2];
1273 IEnumMoniker* ppEnumMoniker;
1274 IMoniker* IMon;
1275 ULONG nb;
1276 ULONG idx = 0, nb_mon = 0;
1277 REGFILTER* regfilters;
1278 HRESULT hr;
1279
1280 TRACE("(%p/%p)->(%p, %#lx, %s, %s, %s, %s, %s, %s, %s)\n",
1281 This,
1282 iface,
1283 ppEnum,
1284 dwMerit,
1285 bInputNeeded ? "true" : "false",
1286 debugstr_guid(&clsInMaj),
1287 debugstr_guid(&clsInSub),
1288 bRender ? "true" : "false",
1289 bOutputNeeded ? "true" : "false",
1290 debugstr_guid(&clsOutMaj),
1291 debugstr_guid(&clsOutSub));
1292
1293 InputType[0] = clsInMaj;
1294 InputType[1] = clsInSub;
1295 OutputType[0] = clsOutMaj;
1296 OutputType[1] = clsOutSub;
1297
1298 *ppEnum = NULL;
1299
1300 hr = IFilterMapper3_EnumMatchingFilters(&This->IFilterMapper3_iface, &ppEnumMoniker, 0, TRUE,
1301 dwMerit, bInputNeeded, 1, InputType, NULL, &GUID_NULL, bRender, bOutputNeeded, 1,
1302 OutputType, NULL, &GUID_NULL);
1303
1304 if (FAILED(hr))
1305 return hr;
1306
1307 while(IEnumMoniker_Next(ppEnumMoniker, 1, &IMon, &nb) == S_OK)
1308 {
1309 IMoniker_Release(IMon);
1310 nb_mon++;
1311 }
1312
1313 if (!nb_mon)
1314 {
1315 IEnumMoniker_Release(ppEnumMoniker);
1316 return enum_reg_filters_create(NULL, 0, ppEnum);
1317 }
1318
1319 regfilters = CoTaskMemAlloc(nb_mon * sizeof(REGFILTER));
1320 if (!regfilters)
1321 {
1322 IEnumMoniker_Release(ppEnumMoniker);
1323 return E_OUTOFMEMORY;
1324 }
1325 ZeroMemory(regfilters, nb_mon * sizeof(REGFILTER)); /* will prevent bad free of Name in case of error. */
1326
1327 IEnumMoniker_Reset(ppEnumMoniker);
1328 while(IEnumMoniker_Next(ppEnumMoniker, 1, &IMon, &nb) == S_OK)
1329 {
1330 IPropertyBag * pPropBagCat = NULL;
1331 VARIANT var;
1332 HRESULT hrSub;
1333 GUID clsid;
1334 int len;
1335
1336 VariantInit(&var);
1337
1338 hrSub = IMoniker_BindToStorage(IMon, NULL, NULL, &IID_IPropertyBag, (LPVOID*)&pPropBagCat);
1339
1340 if (SUCCEEDED(hrSub))
1341 hrSub = IPropertyBag_Read(pPropBagCat, L"CLSID", &var, NULL);
1342
1343 if (SUCCEEDED(hrSub))
1344 hrSub = CLSIDFromString(V_BSTR(&var), &clsid);
1345
1346 VariantClear(&var);
1347
1348 if (SUCCEEDED(hrSub))
1349 hrSub = IPropertyBag_Read(pPropBagCat, L"FriendlyName", &var, NULL);
1350
1351 if (SUCCEEDED(hrSub))
1352 {
1353 len = (wcslen(V_BSTR(&var)) + 1) * sizeof(WCHAR);
1354 if (!(regfilters[idx].Name = CoTaskMemAlloc(len*2)))
1355 hr = E_OUTOFMEMORY;
1356 }
1357
1358 if (SUCCEEDED(hrSub) && regfilters[idx].Name)
1359 {
1360 memcpy(regfilters[idx].Name, V_BSTR(&var), len);
1361 regfilters[idx].Clsid = clsid;
1362 idx++;
1363 }
1364
1365 if (pPropBagCat)
1366 IPropertyBag_Release(pPropBagCat);
1367 IMoniker_Release(IMon);
1368 VariantClear(&var);
1369 }
1370
1371 if (SUCCEEDED(hr))
1372 {
1373 hr = enum_reg_filters_create(regfilters, idx, ppEnum);
1374 }
1375
1376 for (idx = 0; idx < nb_mon; idx++)
1377 CoTaskMemFree(regfilters[idx].Name);
1378 CoTaskMemFree(regfilters);
1379 IEnumMoniker_Release(ppEnumMoniker);
1380
1381 return hr;
1382}
#define TRUE
Definition: types.h:120
static HRESULT enum_reg_filters_create(REGFILTER *filters, unsigned int count, IEnumRegFilters **out)
Definition: filtermapper.c:163
unsigned int idx
Definition: utils.c:40
#define GUID_NULL
Definition: ks.h:106

◆ FilterMapper_QueryInterface()

static HRESULT WINAPI FilterMapper_QueryInterface ( IFilterMapper *  iface,
REFIID  riid,
LPVOID *  ppv 
)
static

Definition at line 1233 of file filtermapper.c.

1234{
1236
1237 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
1238
1239 return FilterMapper3_QueryInterface(&This->IFilterMapper3_iface, riid, ppv);
1240}
static HRESULT WINAPI FilterMapper3_QueryInterface(IFilterMapper3 *iface, REFIID riid, LPVOID *ppv)
Definition: filtermapper.c:500

◆ FilterMapper_RegisterFilter()

static HRESULT WINAPI FilterMapper_RegisterFilter ( IFilterMapper *  iface,
CLSID  clsid,
const WCHAR *  name,
DWORD  merit 
)
static

Definition at line 1385 of file filtermapper.c.

1387{
1388 WCHAR keypath[46], guidstr[39];
1389 HKEY key;
1390 LONG ret;
1391
1392 TRACE("iface %p, clsid %s, name %s, merit %#lx.\n",
1393 iface, debugstr_guid(&clsid), debugstr_w(name), merit);
1394
1395 StringFromGUID2(&clsid, guidstr, ARRAY_SIZE(guidstr));
1396
1397 wcscpy(keypath, L"Filter\\");
1398 wcscat(keypath, guidstr);
1399 if ((ret = RegCreateKeyExW(HKEY_CLASSES_ROOT, keypath, 0, NULL, 0, KEY_WRITE, NULL, &key, NULL)))
1400 return HRESULT_FROM_WIN32(ret);
1401
1402 if ((ret = RegSetValueExW(key, NULL, 0, REG_SZ, (const BYTE *)name, (wcslen(name) + 1) * sizeof(WCHAR))))
1403 ERR("Failed to set filter name, error %lu.\n", ret);
1405
1406 wcscpy(keypath, L"CLSID\\");
1407 wcscat(keypath, guidstr);
1408 if (!(ret = RegCreateKeyExW(HKEY_CLASSES_ROOT, keypath, 0, NULL, 0, KEY_WRITE, NULL, &key, NULL)))
1409 {
1410 if ((ret = RegSetValueExW(key, L"Merit", 0, REG_DWORD, (const BYTE *)&merit, sizeof(DWORD))))
1411 ERR("Failed to set merit, error %lu.\n", ret);
1413 }
1414 else
1415 ERR("Failed to create CLSID key, error %lu.\n", ret);
1416
1417 return S_OK;
1418}

◆ FilterMapper_RegisterFilterInstance()

static HRESULT WINAPI FilterMapper_RegisterFilterInstance ( IFilterMapper *  iface,
CLSID  clsid,
LPCWSTR  szName,
CLSID *  MRId 
)
static

Definition at line 1420 of file filtermapper.c.

1421{
1422 TRACE("(%p)->(%s, %s, %p)\n", iface, debugstr_guid(&clsid), debugstr_w(szName), MRId);
1423
1424 /* Not implemented in Windows (tested on Win2k) */
1425
1426 return E_NOTIMPL;
1427}
static const WCHAR szName[]
Definition: powrprof.c:45

◆ FilterMapper_RegisterPin()

static HRESULT WINAPI FilterMapper_RegisterPin ( IFilterMapper *  iface,
CLSID  clsid,
const WCHAR *  name,
BOOL  rendered,
BOOL  output,
BOOL  zero,
BOOL  many,
CLSID  external_filter,
const WCHAR *  external_pin 
)
static

Definition at line 1429 of file filtermapper.c.

1432{
1433 WCHAR keypath[6 + 38 + 1], *pin_keypath;
1434 HKEY key, pin_key, type_key;
1435 LONG ret;
1436
1437 TRACE("iface %p, clsid %s, name %s, rendered %d, output %d, zero %d, "
1438 "many %d, external_filter %s, external_pin %s.\n",
1439 iface, debugstr_guid(&clsid), debugstr_w(name), rendered, output,
1440 zero, many, debugstr_guid(&external_filter), debugstr_w(external_pin));
1441
1442 wcscpy(keypath, L"CLSID\\");
1443 StringFromGUID2(&clsid, keypath + wcslen(keypath), ARRAY_SIZE(keypath) - wcslen(keypath));
1444 if ((ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, keypath, 0, KEY_WRITE, &key)))
1445 return HRESULT_FROM_WIN32(ret);
1446
1447 if (!(pin_keypath = malloc((5 + wcslen(name) + 1) * sizeof(WCHAR))))
1448 {
1450 return E_OUTOFMEMORY;
1451 }
1452 wcscpy(pin_keypath, L"Pins\\");
1453 wcscat(pin_keypath, name);
1454
1455 if ((ret = RegCreateKeyExW(key, pin_keypath, 0, NULL, 0, KEY_WRITE, NULL, &pin_key, NULL)))
1456 {
1457 ERR("Failed to open pin key, error %lu.\n", ret);
1458 free(pin_keypath);
1460 return HRESULT_FROM_WIN32(ret);
1461 }
1462 free(pin_keypath);
1463
1464 if ((ret = RegSetValueExW(pin_key, L"AllowedMany", 0, REG_DWORD, (const BYTE *)&many, sizeof(DWORD))))
1465 ERR("Failed to set AllowedMany value, error %lu.\n", ret);
1466 if ((ret = RegSetValueExW(pin_key, L"AllowedZero", 0, REG_DWORD, (const BYTE *)&zero, sizeof(DWORD))))
1467 ERR("Failed to set AllowedZero value, error %lu.\n", ret);
1468 if ((ret = RegSetValueExW(pin_key, L"Direction", 0, REG_DWORD, (const BYTE *)&output, sizeof(DWORD))))
1469 ERR("Failed to set Direction value, error %lu.\n", ret);
1470 if ((ret = RegSetValueExW(pin_key, L"IsRendered", 0, REG_DWORD, (const BYTE *)&rendered, sizeof(DWORD))))
1471 ERR("Failed to set IsRendered value, error %lu.\n", ret);
1472
1473 if (!(ret = RegCreateKeyExW(pin_key, L"Types", 0, NULL, 0, 0, NULL, &type_key, NULL)))
1474 RegCloseKey(type_key);
1475 else
1476 ERR("Failed to create Types subkey, error %lu.\n", ret);
1477
1478 RegCloseKey(pin_key);
1480
1481 return S_OK;
1482}
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
int zero
Definition: sehframes.cpp:29

◆ FilterMapper_RegisterPinType()

static HRESULT WINAPI FilterMapper_RegisterPinType ( IFilterMapper *  iface,
CLSID  clsid,
const WCHAR *  pin,
CLSID  majortype,
CLSID  subtype 
)
static

Definition at line 1485 of file filtermapper.c.

1487{
1488 WCHAR *keypath, type_keypath[38 + 1 + 38 + 1];
1489 HKEY key, type_key;
1490 size_t len;
1491 LONG ret;
1492
1493 TRACE("iface %p, clsid %s, pin %s, majortype %s, subtype %s.\n", iface,
1495
1496 len = 6 + 38 + 6 + wcslen(pin) + 6 + 1;
1497 if (!(keypath = malloc(len * sizeof(WCHAR))))
1498 return E_OUTOFMEMORY;
1499
1500 wcscpy(keypath, L"CLSID\\");
1501 StringFromGUID2(&clsid, keypath + wcslen(keypath), len - wcslen(keypath));
1502 wcscat(keypath, L"\\Pins\\");
1503 wcscat(keypath, pin);
1504 wcscat(keypath, L"\\Types");
1506 {
1507 free(keypath);
1508 return HRESULT_FROM_WIN32(ret);
1509 }
1510 free(keypath);
1511
1512 StringFromGUID2(&majortype, type_keypath, ARRAY_SIZE(type_keypath));
1513 wcscat(type_keypath, L"\\");
1514 StringFromGUID2(&subtype, type_keypath + wcslen(type_keypath), ARRAY_SIZE(type_keypath) - wcslen(type_keypath));
1515 if (!(ret = RegCreateKeyExW(key, type_keypath, 0, NULL, 0, 0, NULL, &type_key, NULL)))
1516 RegCloseKey(type_key);
1517 else
1518 ERR("Failed to create type key, error %lu.\n", ret);
1519
1521 return HRESULT_FROM_WIN32(ret);
1522}
const GUID * subtype
Definition: mpegvideo.c:120
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1021

◆ FilterMapper_Release()

static ULONG WINAPI FilterMapper_Release ( IFilterMapper *  iface)
static

Definition at line 1249 of file filtermapper.c.

1250{
1252
1253 return IUnknown_Release(This->outer_unk);
1254}

◆ FilterMapper_UnregisterFilter()

static HRESULT WINAPI FilterMapper_UnregisterFilter ( IFilterMapper *  iface,
CLSID  clsid 
)
static

Definition at line 1524 of file filtermapper.c.

1525{
1526 WCHAR guidstr[39], keypath[6 + 38 + 1];
1527 LONG ret;
1528 HKEY key;
1529
1530 TRACE("iface %p, clsid %s.\n", iface, debugstr_guid(&clsid));
1531
1532 StringFromGUID2(&clsid, guidstr, ARRAY_SIZE(guidstr));
1533
1534 if ((ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Filter", 0, 0, &key)))
1535 return HRESULT_FROM_WIN32(ret);
1536 if ((ret = RegDeleteKeyW(key, guidstr)))
1537 ERR("Failed to delete filter key, error %lu.\n", ret);
1539
1540 wcscpy(keypath, L"CLSID\\");
1541 wcscat(keypath, guidstr);
1542 if (!(ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, keypath, 0, KEY_WRITE, &key)))
1543 {
1544 if ((ret = RegDeleteValueW(key, L"Merit")))
1545 ERR("Failed to delete Merit value, error %lu.\n", ret);
1546 if ((ret = RegDeleteTreeW(key, L"Pins")))
1547 ERR("Failed to delete Pins key, error %lu.\n", ret);
1549 }
1550 else
1551 ERR("Failed to open CLSID key, error %lu.\n", ret);
1552
1553 return S_OK;
1554}
LSTATUS WINAPI RegDeleteTreeW(_In_ HKEY, _In_opt_ LPCWSTR)
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330

◆ FilterMapper_UnregisterFilterInstance()

static HRESULT WINAPI FilterMapper_UnregisterFilterInstance ( IFilterMapper *  iface,
CLSID  MRId 
)
static

Definition at line 1556 of file filtermapper.c.

1557{
1558 TRACE("(%p)->(%s)\n", iface, debugstr_guid(&MRId));
1559
1560 /* Not implemented in Windows (tested on Win2k) */
1561
1562 return E_NOTIMPL;
1563}

◆ FilterMapper_UnregisterPin()

static HRESULT WINAPI FilterMapper_UnregisterPin ( IFilterMapper *  iface,
CLSID  clsid,
const WCHAR *  name 
)
static

Definition at line 1565 of file filtermapper.c.

1566{
1567 WCHAR keypath[6 + 38 + 5 + 1];
1568 LONG ret;
1569 HKEY key;
1570
1571 TRACE("iface %p, clsid %s, name %s.\n", iface, debugstr_guid(&clsid), debugstr_w(name));
1572
1573 if (!name)
1574 return E_INVALIDARG;
1575
1576 wcscpy(keypath, L"CLSID\\");
1577 StringFromGUID2(&clsid, keypath + wcslen(keypath), ARRAY_SIZE(keypath) - wcslen(keypath));
1578 wcscat(keypath, L"\\Pins");
1579 if ((ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, keypath, 0, 0, &key)))
1580 return HRESULT_FROM_WIN32(ret);
1581
1582 if ((ret = RegDeleteTreeW(key, name)))
1583 ERR("Failed to delete subkey, error %lu.\n", ret);
1584
1586
1587 return S_OK;
1588}
#define E_INVALIDARG
Definition: ddrawi.h:101

◆ find_data()

static int find_data ( const struct Vector *  v,
const void *  pData,
int  size 
)
static

◆ FM2_DeleteRegFilter()

static void FM2_DeleteRegFilter ( REGFILTER2 *  prf2)
static

Definition at line 788 of file filtermapper.c.

789{
790 UINT i;
791 for (i = 0; i < prf2->cPins2; i++)
792 {
793 UINT j;
794 CoTaskMemFree((void*)prf2->rgPins2[i].clsPinCategory);
795
796 for (j = 0; j < prf2->rgPins2[i].nMediaTypes; j++)
797 {
798 CoTaskMemFree((LPVOID)prf2->rgPins2[i].lpMediaType[j].clsMajorType);
799 CoTaskMemFree((LPVOID)prf2->rgPins2[i].lpMediaType[j].clsMinorType);
800 }
803 }
805}
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 GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: sysinfo.c:13

Referenced by FilterMapper3_EnumMatchingFilters().

◆ FM2_ReadFilterData()

static HRESULT FM2_ReadFilterData ( BYTE *  pData,
REGFILTER2 *  prf2 
)
static

Definition at line 682 of file filtermapper.c.

683{
684 HRESULT hr = S_OK;
685 struct REG_RF * prrf;
686 LPBYTE pCurrent;
687 DWORD i;
688 REGFILTERPINS2 * rgPins2;
689
690 prrf = (struct REG_RF *)pData;
691 pCurrent = pData;
692
693 if (prrf->dwVersion != 2)
694 {
695 FIXME("Filter registry version %lu is not supported.\n", prrf->dwVersion);
696 ZeroMemory(prf2, sizeof(*prf2));
697 hr = E_FAIL;
698 }
699
700 if (SUCCEEDED(hr))
701 {
702 TRACE("dwVersion %lu, dwMerit %#lx, dwPins %lu, dwUnused %#lx.\n",
703 prrf->dwVersion, prrf->dwMerit, prrf->dwPins, prrf->dwUnused);
704
705 prf2->dwVersion = prrf->dwVersion;
706 prf2->dwMerit = prrf->dwMerit;
707 prf2->cPins2 = prrf->dwPins;
708 rgPins2 = CoTaskMemAlloc(prrf->dwPins * sizeof(*rgPins2));
709 prf2->rgPins2 = rgPins2;
710 pCurrent += sizeof(struct REG_RF);
711
712 for (i = 0; i < prrf->dwPins; i++)
713 {
714 struct REG_RFP * prrfp = (struct REG_RFP *)pCurrent;
715 REGPINTYPES * lpMediaType;
716 REGPINMEDIUM * lpMedium;
717 UINT j;
718
719 /* FIXME: check signature */
720
721 TRACE("\tsignature = %s\n", debugstr_fourcc(prrfp->signature));
722
723 TRACE("\tPin %lu: dwFlags %#lx, dwInstances %lu, dwMediaTypes %lu, dwMediums %lu.\n",
724 i, prrfp->dwFlags, prrfp->dwInstances, prrfp->dwMediaTypes, prrfp->dwMediums);
725
726 rgPins2[i].dwFlags = prrfp->dwFlags;
727 rgPins2[i].cInstances = prrfp->dwInstances;
728 rgPins2[i].nMediaTypes = prrfp->dwMediaTypes;
729 rgPins2[i].nMediums = prrfp->dwMediums;
730 pCurrent += sizeof(struct REG_RFP);
731 if (prrfp->bCategory)
732 {
733 CLSID * clsCat = CoTaskMemAlloc(sizeof(CLSID));
734 memcpy(clsCat, pData + *(DWORD*)(pCurrent), sizeof(CLSID));
735 pCurrent += sizeof(DWORD);
736 rgPins2[i].clsPinCategory = clsCat;
737 }
738 else
739 rgPins2[i].clsPinCategory = NULL;
740
741 if (rgPins2[i].nMediaTypes > 0)
742 lpMediaType = CoTaskMemAlloc(rgPins2[i].nMediaTypes * sizeof(*lpMediaType));
743 else
744 lpMediaType = NULL;
745
746 rgPins2[i].lpMediaType = lpMediaType;
747
748 for (j = 0; j < rgPins2[i].nMediaTypes; j++)
749 {
750 struct REG_TYPE * prt = (struct REG_TYPE *)pCurrent;
751 CLSID * clsMajor = CoTaskMemAlloc(sizeof(CLSID));
752 CLSID * clsMinor = CoTaskMemAlloc(sizeof(CLSID));
753
754 /* FIXME: check signature */
755 TRACE("\t\tsignature = %s\n", debugstr_fourcc(prt->signature));
756
757 memcpy(clsMajor, pData + prt->dwOffsetMajor, sizeof(CLSID));
758 memcpy(clsMinor, pData + prt->dwOffsetMinor, sizeof(CLSID));
759
760 lpMediaType[j].clsMajorType = clsMajor;
761 lpMediaType[j].clsMinorType = clsMinor;
762
763 pCurrent += sizeof(*prt);
764 }
765
766 if (rgPins2[i].nMediums > 0)
767 lpMedium = CoTaskMemAlloc(rgPins2[i].nMediums * sizeof(*lpMedium));
768 else
769 lpMedium = NULL;
770
771 rgPins2[i].lpMedium = lpMedium;
772
773 for (j = 0; j < rgPins2[i].nMediums; j++)
774 {
775 DWORD dwOffset = *(DWORD *)pCurrent;
776
777 memcpy(lpMedium + j, pData + dwOffset, sizeof(REGPINMEDIUM));
778
779 pCurrent += sizeof(dwOffset);
780 }
781 }
782
783 }
784
785 return hr;
786}
REGPINTYPES
Definition: axextend.idl:194
#define E_FAIL
Definition: ddrawi.h:102
#define DWORD
Definition: nt_native.h:44
_In_ DWORD _In_ DWORD dwOffset
Definition: ntgdi.h:2053
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
DWORD dwMediaTypes
Definition: filtermapper.c:379
DWORD bCategory
Definition: filtermapper.c:381
DWORD dwInstances
Definition: filtermapper.c:378
DWORD dwFlags
Definition: filtermapper.c:377
DWORD dwMediums
Definition: filtermapper.c:380
DWORD signature
Definition: filtermapper.c:376
DWORD dwVersion
Definition: filtermapper.c:368
DWORD dwUnused
Definition: filtermapper.c:371
DWORD dwMerit
Definition: filtermapper.c:369
DWORD dwPins
Definition: filtermapper.c:370
DWORD dwOffsetMajor
Definition: filtermapper.c:389
DWORD signature
Definition: filtermapper.c:387
DWORD dwOffsetMinor
Definition: filtermapper.c:390
unsigned char * LPBYTE
Definition: typedefs.h:53

Referenced by AMFilterData_ParseFilterData(), and FilterMapper3_EnumMatchingFilters().

◆ FM2_WriteFilterData()

static HRESULT FM2_WriteFilterData ( const REGFILTER2 *  prf2,
BYTE **  ppData,
ULONG *  pcbData 
)
static

Definition at line 585 of file filtermapper.c.

586{
587 int size = sizeof(struct REG_RF);
588 unsigned int i;
589 struct Vector mainStore = {NULL, 0, 0};
590 struct Vector clsidStore = {NULL, 0, 0};
591 struct REG_RF rrf;
592 HRESULT hr = S_OK;
593
594 rrf.dwVersion = prf2->dwVersion;
595 rrf.dwMerit = prf2->dwMerit;
596 rrf.dwPins = prf2->cPins2;
597 rrf.dwUnused = 0;
598
599 add_data(&mainStore, &rrf, sizeof(rrf));
600
601 for (i = 0; i < prf2->cPins2; i++)
602 {
603 size += sizeof(struct REG_RFP);
604 if (prf2->rgPins2[i].clsPinCategory)
605 size += sizeof(DWORD);
606 size += prf2->rgPins2[i].nMediaTypes * sizeof(struct REG_TYPE);
607 size += prf2->rgPins2[i].nMediums * sizeof(DWORD);
608 }
609
610 for (i = 0; i < prf2->cPins2; i++)
611 {
612 struct REG_RFP rrfp;
613 REGFILTERPINS2 rgPin2 = prf2->rgPins2[i];
614 unsigned int j;
615
616 rrfp.signature = MAKEFOURCC('0'+i,'p','i','3');
617 rrfp.dwFlags = rgPin2.dwFlags;
618 rrfp.dwInstances = rgPin2.cInstances;
619 rrfp.dwMediaTypes = rgPin2.nMediaTypes;
620 rrfp.dwMediums = rgPin2.nMediums;
621 rrfp.bCategory = rgPin2.clsPinCategory ? 1 : 0;
622
623 add_data(&mainStore, &rrfp, sizeof(rrfp));
624 if (rrfp.bCategory)
625 {
626 DWORD index = find_data(&clsidStore, rgPin2.clsPinCategory, sizeof(CLSID));
627 if (index == -1)
628 index = add_data(&clsidStore, rgPin2.clsPinCategory, sizeof(CLSID));
629 index += size;
630
631 add_data(&mainStore, &index, sizeof(index));
632 }
633
634 for (j = 0; j < rgPin2.nMediaTypes; j++)
635 {
636 struct REG_TYPE rt;
637 const CLSID * clsMinorType = rgPin2.lpMediaType[j].clsMinorType ? rgPin2.lpMediaType[j].clsMinorType : &MEDIASUBTYPE_NULL;
638 rt.signature = MAKEFOURCC('0'+j,'t','y','3');
639 rt.dwUnused = 0;
640 rt.dwOffsetMajor = find_data(&clsidStore, rgPin2.lpMediaType[j].clsMajorType, sizeof(CLSID));
641 if (rt.dwOffsetMajor == -1)
642 rt.dwOffsetMajor = add_data(&clsidStore, rgPin2.lpMediaType[j].clsMajorType, sizeof(CLSID));
643 rt.dwOffsetMajor += size;
644 rt.dwOffsetMinor = find_data(&clsidStore, clsMinorType, sizeof(CLSID));
645 if (rt.dwOffsetMinor == -1)
646 rt.dwOffsetMinor = add_data(&clsidStore, clsMinorType, sizeof(CLSID));
647 rt.dwOffsetMinor += size;
648
649 add_data(&mainStore, &rt, sizeof(rt));
650 }
651
652 for (j = 0; j < rgPin2.nMediums; j++)
653 {
654 DWORD index = find_data(&clsidStore, rgPin2.lpMedium + j, sizeof(REGPINMEDIUM));
655 if (index == -1)
656 index = add_data(&clsidStore, rgPin2.lpMedium + j, sizeof(REGPINMEDIUM));
657 index += size;
658
659 add_data(&mainStore, &index, sizeof(index));
660 }
661 }
662
663 if (SUCCEEDED(hr))
664 {
665 *pcbData = mainStore.current + clsidStore.current;
667 if (!*ppData)
669 }
670
671 if (SUCCEEDED(hr))
672 {
673 memcpy(*ppData, mainStore.pData, mainStore.current);
674 memcpy((*ppData) + mainStore.current, clsidStore.pData, clsidStore.current);
675 }
676
677 delete_vector(&mainStore);
678 delete_vector(&clsidStore);
679 return hr;
680}
const CLSID * clsMinorType
Definition: axextend.idl:193
static int find_data(const struct Vector *v, const void *pData, int size)
Definition: filtermapper.c:423
#define MAKEFOURCC(ch0, ch1, ch2, ch3)
Definition: ddsformat.c:45
PSDBQUERYRESULT_VISTA PVOID * ppData
Definition: env.c:56
_In_ _Out_writes_opt_ pcchValueName _Inout_opt_ LPDWORD _Out_opt_ _Out_writes_bytes_to_opt_ pcbData _Inout_opt_ LPDWORD pcbData
Definition: shlwapi.h:757
#define MEDIASUBTYPE_NULL
Definition: uuids.h:25

Referenced by AMFilterData_CreateFilterData(), and FilterMapper3_RegisterFilter().

◆ impl_from_IAMFilterData()

static FilterMapper3Impl * impl_from_IAMFilterData ( IAMFilterData *  iface)
inlinestatic

Definition at line 355 of file filtermapper.c.

356{
357 return CONTAINING_RECORD(iface, FilterMapper3Impl, IAMFilterData_iface);
358}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by AMFilterData_AddRef(), AMFilterData_CreateFilterData(), AMFilterData_ParseFilterData(), AMFilterData_QueryInterface(), and AMFilterData_Release().

◆ impl_from_IEnumMoniker()

static struct enum_moniker * impl_from_IEnumMoniker ( IEnumMoniker *  iface)
static

Definition at line 210 of file filtermapper.c.

211{
212 return CONTAINING_RECORD(iface, struct enum_moniker, IEnumMoniker_iface);
213}

Referenced by enum_moniker_AddRef(), enum_moniker_Next(), enum_moniker_Release(), enum_moniker_Reset(), and enum_moniker_Skip().

◆ impl_from_IEnumRegFilters()

static struct enum_reg_filters * impl_from_IEnumRegFilters ( IEnumRegFilters *  iface)
static

Definition at line 52 of file filtermapper.c.

53{
54 return CONTAINING_RECORD(iface, struct enum_reg_filters, IEnumRegFilters_iface);
55}

Referenced by enum_reg_filters_AddRef(), enum_reg_filters_Next(), enum_reg_filters_Release(), and enum_reg_filters_Reset().

◆ impl_from_IFilterMapper()

static FilterMapper3Impl * impl_from_IFilterMapper ( IFilterMapper *  iface)
inlinestatic

Definition at line 350 of file filtermapper.c.

351{
352 return CONTAINING_RECORD(iface, FilterMapper3Impl, IFilterMapper_iface);
353}

Referenced by FilterMapper_AddRef(), FilterMapper_EnumMatchingFilters(), FilterMapper_QueryInterface(), and FilterMapper_Release().

◆ impl_from_IFilterMapper3()

static FilterMapper3Impl * impl_from_IFilterMapper3 ( IFilterMapper3 *  iface)
inlinestatic

Definition at line 345 of file filtermapper.c.

346{
347 return CONTAINING_RECORD(iface, FilterMapper3Impl, IFilterMapper3_iface);
348}

Referenced by FilterMapper3_AddRef(), FilterMapper3_QueryInterface(), and FilterMapper3_Release().

◆ impl_from_IUnknown()

static FilterMapper3Impl * impl_from_IUnknown ( IUnknown *  iface)
inlinestatic

Definition at line 360 of file filtermapper.c.

361{
362 return CONTAINING_RECORD(iface, FilterMapper3Impl, IUnknown_inner);
363}

Referenced by Inner_AddRef(), Inner_QueryInterface(), and Inner_Release().

◆ Inner_AddRef()

static ULONG WINAPI Inner_AddRef ( IUnknown *  iface)
static

Definition at line 468 of file filtermapper.c.

469{
470 FilterMapper3Impl *mapper = impl_from_IUnknown(iface);
471 ULONG refcount = InterlockedIncrement(&mapper->ref);
472
473 TRACE("%p increasing refcount to %lu.\n", mapper, refcount);
474
475 return refcount;
476}
static FilterMapper3Impl * impl_from_IUnknown(IUnknown *iface)
Definition: filtermapper.c:360

◆ Inner_QueryInterface()

static HRESULT WINAPI Inner_QueryInterface ( IUnknown *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 442 of file filtermapper.c.

443{
445
446 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
447
448 *ppv = NULL;
450 *ppv = &This->IUnknown_inner;
451 else if (IsEqualIID(riid, &IID_IFilterMapper2) || IsEqualIID(riid, &IID_IFilterMapper3))
452 *ppv = &This->IFilterMapper3_iface;
453 else if (IsEqualIID(riid, &IID_IFilterMapper))
454 *ppv = &This->IFilterMapper_iface;
455 else if (IsEqualIID(riid, &IID_IAMFilterData))
456 *ppv = &This->IAMFilterData_iface;
457
458 if (*ppv != NULL)
459 {
460 IUnknown_AddRef((IUnknown *)*ppv);
461 return S_OK;
462 }
463
464 FIXME("No interface for %s\n", debugstr_guid(riid));
465 return E_NOINTERFACE;
466}
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95

◆ Inner_Release()

static ULONG WINAPI Inner_Release ( IUnknown *  iface)
static

Definition at line 478 of file filtermapper.c.

479{
480 FilterMapper3Impl *mapper = impl_from_IUnknown(iface);
481 ULONG refcount = InterlockedDecrement(&mapper->ref);
482
483 TRACE("%p decreasing refcount to %lu.\n", mapper, refcount);
484
485 if (!refcount)
486 {
487 CoTaskMemFree(mapper);
488 }
489
490 return refcount;
491}

◆ MatchTypes()

static BOOL MatchTypes ( BOOL  bExactMatch,
DWORD  nPinTypes,
const REGPINTYPES *  pPinTypes,
DWORD  nMatchTypes,
const GUID *  pMatchTypes 
)
static

Definition at line 950 of file filtermapper.c.

956{
957 BOOL bMatch = FALSE;
958 DWORD j;
959
960 if ((nMatchTypes == 0) && (nPinTypes > 0))
961 bMatch = TRUE;
962
963 for (j = 0; j < nPinTypes; j++)
964 {
965 DWORD i;
966 for (i = 0; i < nMatchTypes*2; i+=2)
967 {
968 if (((!bExactMatch && IsEqualGUID(pPinTypes[j].clsMajorType, &GUID_NULL)) || IsEqualGUID(&pMatchTypes[i], &GUID_NULL) || IsEqualGUID(pPinTypes[j].clsMajorType, &pMatchTypes[i])) &&
969 ((!bExactMatch && IsEqualGUID(pPinTypes[j].clsMinorType, &GUID_NULL)) || IsEqualGUID(&pMatchTypes[i+1], &GUID_NULL) || IsEqualGUID(pPinTypes[j].clsMinorType, &pMatchTypes[i+1])))
970 {
971 bMatch = TRUE;
972 break;
973 }
974 }
975 }
976 return bMatch;
977}
#define FALSE
Definition: types.h:117

Referenced by FilterMapper3_EnumMatchingFilters().

◆ mm_compare()

static int __cdecl mm_compare ( const void *  left,
const void *  right 
)
static

Definition at line 980 of file filtermapper.c.

981{
982 const struct MONIKER_MERIT * mmLeft = left;
983 const struct MONIKER_MERIT * mmRight = right;
984
985 if (mmLeft->dwMerit == mmRight->dwMerit)
986 return 0;
987 if (mmLeft->dwMerit > mmRight->dwMerit)
988 return -1;
989 return 1;
990}
GLdouble GLdouble right
Definition: glext.h:10859
GLint left
Definition: glext.h:7726

Referenced by FilterMapper3_EnumMatchingFilters().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( quartz  )

Variable Documentation

◆ AMFilterDataVtbl

const IAMFilterDataVtbl AMFilterDataVtbl
static
Initial value:
= {
}
static ULONG WINAPI AMFilterData_Release(IAMFilterData *iface)
static ULONG WINAPI AMFilterData_AddRef(IAMFilterData *iface)
static HRESULT WINAPI AMFilterData_QueryInterface(IAMFilterData *iface, REFIID riid, LPVOID *ppv)
static HRESULT WINAPI AMFilterData_ParseFilterData(IAMFilterData *iface, BYTE *pData, ULONG cb, BYTE **ppRegFilter2)
static HRESULT WINAPI AMFilterData_CreateFilterData(IAMFilterData *iface, REGFILTER2 *prf2, BYTE **pRegFilterData, ULONG *pcb)

Definition at line 1668 of file filtermapper.c.

Referenced by filter_mapper_create().

◆ enum_moniker_vtbl

const IEnumMonikerVtbl enum_moniker_vtbl
static
Initial value:
=
{
}
static ULONG WINAPI enum_moniker_AddRef(IEnumMoniker *iface)
Definition: filtermapper.c:231
static HRESULT WINAPI enum_moniker_Reset(IEnumMoniker *iface)
Definition: filtermapper.c:283
static HRESULT WINAPI enum_moniker_QueryInterface(IEnumMoniker *iface, REFIID iid, void **out)
Definition: filtermapper.c:215
static HRESULT WINAPI enum_moniker_Next(IEnumMoniker *iface, ULONG count, IMoniker **filters, ULONG *ret_count)
Definition: filtermapper.c:256
static ULONG WINAPI enum_moniker_Release(IEnumMoniker *iface)
Definition: filtermapper.c:239
static HRESULT WINAPI enum_moniker_Clone(IEnumMoniker *iface, IEnumMoniker **out)
Definition: filtermapper.c:293
static HRESULT WINAPI enum_moniker_Skip(IEnumMoniker *iface, ULONG count)
Definition: filtermapper.c:273

Definition at line 299 of file filtermapper.c.

Referenced by enum_moniker_create().

◆ enum_reg_filters_vtbl

const IEnumRegFiltersVtbl enum_reg_filters_vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI enum_reg_filters_Reset(IEnumRegFilters *iface)
Definition: filtermapper.c:136
static HRESULT WINAPI enum_reg_filters_Skip(IEnumRegFilters *iface, ULONG count)
Definition: filtermapper.c:130
static HRESULT WINAPI enum_reg_filters_QueryInterface(IEnumRegFilters *iface, REFIID iid, void **out)
Definition: filtermapper.c:57
static HRESULT WINAPI enum_reg_filters_Next(IEnumRegFilters *iface, ULONG count, REGFILTER **filters, ULONG *ret_count)
Definition: filtermapper.c:98
static ULONG WINAPI enum_reg_filters_AddRef(IEnumRegFilters *iface)
Definition: filtermapper.c:73
static HRESULT WINAPI enum_reg_filters_Clone(IEnumRegFilters *iface, IEnumRegFilters **out)
Definition: filtermapper.c:146
static ULONG WINAPI enum_reg_filters_Release(IEnumRegFilters *iface)
Definition: filtermapper.c:81

Definition at line 152 of file filtermapper.c.

Referenced by enum_reg_filters_create().

◆ fm3vtbl

const IFilterMapper3Vtbl fm3vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI FilterMapper3_RegisterFilter(IFilterMapper3 *iface, REFCLSID clsid, const WCHAR *name, IMoniker **ret_moniker, const CLSID *category, const WCHAR *instance, const REGFILTER2 *prf2)
Definition: filtermapper.c:807
static ULONG WINAPI FilterMapper3_Release(IFilterMapper3 *iface)
Definition: filtermapper.c:514
static HRESULT WINAPI FilterMapper3_EnumMatchingFilters(IFilterMapper3 *iface, IEnumMoniker **ppEnum, DWORD dwFlags, BOOL bExactMatch, DWORD dwMerit, BOOL bInputNeeded, DWORD cInputTypes, const GUID *pInputTypes, const REGPINMEDIUM *pMedIn, const CLSID *pPinCategoryIn, BOOL bRender, BOOL bOutputNeeded, DWORD cOutputTypes, const GUID *pOutputTypes, const REGPINMEDIUM *pMedOut, const CLSID *pPinCategoryOut)
Definition: filtermapper.c:999
static HRESULT WINAPI FilterMapper3_GetICreateDevEnum(IFilterMapper3 *iface, ICreateDevEnum **ppEnum)
static HRESULT WINAPI FilterMapper3_UnregisterFilter(IFilterMapper3 *iface, const CLSID *category, const WCHAR *instance, REFCLSID clsid)
Definition: filtermapper.c:563
static ULONG WINAPI FilterMapper3_AddRef(IFilterMapper3 *iface)
Definition: filtermapper.c:507
static HRESULT WINAPI FilterMapper3_CreateCategory(IFilterMapper3 *iface, REFCLSID category, DWORD merit, const WCHAR *description)
Definition: filtermapper.c:523

Definition at line 1217 of file filtermapper.c.

Referenced by filter_mapper_create().

◆ fmvtbl

const IFilterMapperVtbl fmvtbl
static
Initial value:
=
{
}
static HRESULT WINAPI FilterMapper_UnregisterFilter(IFilterMapper *iface, CLSID clsid)
static HRESULT WINAPI FilterMapper_RegisterPinType(IFilterMapper *iface, CLSID clsid, const WCHAR *pin, CLSID majortype, CLSID subtype)
static HRESULT WINAPI FilterMapper_RegisterPin(IFilterMapper *iface, CLSID clsid, const WCHAR *name, BOOL rendered, BOOL output, BOOL zero, BOOL many, CLSID external_filter, const WCHAR *external_pin)
static HRESULT WINAPI FilterMapper_RegisterFilter(IFilterMapper *iface, CLSID clsid, const WCHAR *name, DWORD merit)
static ULONG WINAPI FilterMapper_Release(IFilterMapper *iface)
static HRESULT WINAPI FilterMapper_RegisterFilterInstance(IFilterMapper *iface, CLSID clsid, LPCWSTR szName, CLSID *MRId)
static HRESULT WINAPI FilterMapper_QueryInterface(IFilterMapper *iface, REFIID riid, LPVOID *ppv)
static HRESULT WINAPI FilterMapper_UnregisterPin(IFilterMapper *iface, CLSID clsid, const WCHAR *name)
static HRESULT WINAPI FilterMapper_UnregisterFilterInstance(IFilterMapper *iface, CLSID MRId)
static HRESULT WINAPI FilterMapper_EnumMatchingFilters(IFilterMapper *iface, IEnumRegFilters **ppEnum, DWORD dwMerit, BOOL bInputNeeded, CLSID clsInMaj, CLSID clsInSub, BOOL bRender, BOOL bOutputNeeded, CLSID clsOutMaj, CLSID clsOutSub)
static ULONG WINAPI FilterMapper_AddRef(IFilterMapper *iface)

Definition at line 1590 of file filtermapper.c.

Referenced by filter_mapper_create().

◆ IInner_VTable

const IUnknownVtbl IInner_VTable
static
Initial value:
=
{
}
static HRESULT WINAPI Inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: filtermapper.c:442
static ULONG WINAPI Inner_Release(IUnknown *iface)
Definition: filtermapper.c:478
static ULONG WINAPI Inner_AddRef(IUnknown *iface)
Definition: filtermapper.c:468

Definition at line 493 of file filtermapper.c.

Referenced by filter_mapper_create().