[DEVENUM]

* Sync with Wine 1.7.1.
CORE-7469

svn path=/trunk/; revision=60507
This commit is contained in:
Amine Khaldi 2013-10-01 22:07:54 +00:00
parent 9d641d5625
commit 1c2a66bf08
12 changed files with 398 additions and 500 deletions

View file

@ -2,22 +2,22 @@
remove_definitions(-D_WIN32_WINNT=0x502)
add_definitions(-D_WIN32_WINNT=0x600)
add_definitions(-D__WINESRC__)
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
spec2def(devenum.dll devenum.spec)
add_library(devenum SHARED
list(APPEND SOURCE
createdevenum.c
devenum_main.c
factory.c
mediacatenum.c
parsedisplayname.c
devenum.rc
${CMAKE_CURRENT_BINARY_DIR}/devenum.def)
add_library(devenum SHARED ${SOURCE} devenum.rc)
set_source_files_properties(devenum.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/devenum_classes.rgs)
set_module_type(devenum win32dll UNICODE)
target_link_libraries(devenum strmiids uuid wine)
add_importlibs(devenum advapi32 ole32 oleaut32 winmm user32 avicap32 msvcrt kernel32 ntdll)
add_pch(devenum devenum_private.h)
add_dependencies(devenum dxsdk)
add_cd_file(TARGET devenum DESTINATION reactos/system32 FOR all)

View file

@ -1,20 +0,0 @@
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = devenum.dll
IMPORTS = ole32 oleaut32 winmm user32 advapi32 kernel32
EXTRALIBS = -lstrmiids -luuid
C_SRCS = \
createdevenum.c \
devenum_main.c \
factory.c \
mediacatenum.c \
parsedisplayname.c
RC_SRCS = devenum.rc
@MAKE_DLL_RULES@
### Dependencies:

View file

@ -52,6 +52,9 @@ static const WCHAR wszAllowedZero[] = {'A','l','l','o','w','e','d','Z','e','r','
static const WCHAR wszDirection[] = {'D','i','r','e','c','t','i','o','n',0};
static const WCHAR wszIsRendered[] = {'I','s','R','e','n','d','e','r','e','d',0};
static const WCHAR wszTypes[] = {'T','y','p','e','s',0};
static const WCHAR wszFriendlyName[] = {'F','r','i','e','n','d','l','y','N','a','m','e',0};
static const WCHAR wszWaveInID[] = {'W','a','v','e','I','n','I','D',0};
static const WCHAR wszWaveOutID[] = {'W','a','v','e','O','u','t','I','D',0};
static ULONG WINAPI DEVENUM_ICreateDevEnum_AddRef(ICreateDevEnum * iface);
static HRESULT DEVENUM_CreateSpecialCategories(void);
@ -59,24 +62,24 @@ static HRESULT DEVENUM_CreateSpecialCategories(void);
/**********************************************************************
* DEVENUM_ICreateDevEnum_QueryInterface (also IUnknown)
*/
static HRESULT WINAPI DEVENUM_ICreateDevEnum_QueryInterface(
ICreateDevEnum * iface,
REFIID riid,
LPVOID *ppvObj)
static HRESULT WINAPI DEVENUM_ICreateDevEnum_QueryInterface(ICreateDevEnum *iface, REFIID riid,
void **ppv)
{
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
if (ppvObj == NULL) return E_POINTER;
if (!ppv)
return E_POINTER;
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_ICreateDevEnum))
{
*ppvObj = iface;
*ppv = iface;
DEVENUM_ICreateDevEnum_AddRef(iface);
return S_OK;
}
FIXME("- no interface IID: %s\n", debugstr_guid(riid));
*ppv = NULL;
return E_NOINTERFACE;
}
@ -171,10 +174,10 @@ static void DEVENUM_ReadPinTypes(HKEY hkeyPinKey, REGFILTERPINS *rgPin)
for (i1 = 0; i1 < dwMinorTypes; i1++)
{
WCHAR wszMinorTypeName[64];
DWORD cName = sizeof(wszMinorTypeName) / sizeof(WCHAR);
CLSID *clsMajorType = NULL, *clsMinorType = NULL;
HRESULT hr;
cName = sizeof(wszMinorTypeName) / sizeof(WCHAR);
if (RegEnumKeyExW(hkeyMajorType, i1, wszMinorTypeName, &cName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) continue;
clsMinorType = CoTaskMemAlloc(sizeof(CLSID));
@ -349,7 +352,6 @@ static HRESULT DEVENUM_RegisterLegacyAmFilters(void)
HKEY hkeyCategoryBaseKey;
WCHAR wszRegKey[MAX_PATH];
HKEY hkeyInstance = NULL;
HRESULT hr;
if (RegEnumKeyExW(hkeyFilter, i, wszFilterSubkeyName, &cName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) continue;
@ -463,9 +465,8 @@ static HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator(
HKEY hkey;
HKEY hbasekey;
HRESULT hr;
CreateDevEnumImpl *This = (CreateDevEnumImpl *)iface;
TRACE("(%p)->(%s, %p, %x)\n\tDeviceClass:\t%s\n", This, debugstr_guid(clsidDeviceClass), ppEnumMoniker, dwFlags, debugstr_guid(clsidDeviceClass));
TRACE("(%p)->(%s, %p, %x)\n", iface, debugstr_guid(clsidDeviceClass), ppEnumMoniker, dwFlags);
if (!ppEnumMoniker)
return E_POINTER;
@ -519,7 +520,7 @@ static const ICreateDevEnumVtbl ICreateDevEnum_Vtbl =
/**********************************************************************
* static CreateDevEnum instance
*/
CreateDevEnumImpl DEVENUM_CreateDevEnum = { &ICreateDevEnum_Vtbl };
ICreateDevEnum DEVENUM_CreateDevEnum = { &ICreateDevEnum_Vtbl };
/**********************************************************************
* DEVENUM_CreateAMCategoryKey (INTERNAL)
@ -631,6 +632,7 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
WAVEINCAPSW wicaps;
MIDIOUTCAPSW mocaps;
REGPINTYPES * pTypes;
IPropertyBag * pPropBag = NULL;
numDevs = waveOutGetNumDevs();
@ -668,10 +670,27 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
wocaps.szPname,
&rf2);
/* FIXME: do additional stuff with IMoniker here, depending on what RegisterFilter does */
if (pMoniker)
{
VARIANT var;
if (pMoniker)
IMoniker_Release(pMoniker);
V_VT(&var) = VT_I4;
V_UNION(&var, ulVal) = i;
res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag);
if (SUCCEEDED(res))
res = IPropertyBag_Write(pPropBag, wszWaveOutID, &var);
else
pPropBag = NULL;
V_VT(&var) = VT_LPWSTR;
V_UNION(&var, bstrVal) = wocaps.szPname;
if (SUCCEEDED(res))
res = IPropertyBag_Write(pPropBag, wszFriendlyName, &var);
if (pPropBag)
IPropertyBag_Release(pPropBag);
IMoniker_Release(pMoniker);
pMoniker = NULL;
}
wsprintfW(szDSoundName, szDSoundNameFormat, wocaps.szPname);
res = IFilterMapper2_RegisterFilter(pMapper,
@ -724,7 +743,7 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
rfp2.lpMediaType = pTypes;
res = IFilterMapper2_RegisterFilter(pMapper,
res = IFilterMapper2_RegisterFilter(pMapper,
&CLSID_AudioRecord,
wicaps.szPname,
&pMoniker,
@ -732,10 +751,27 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
wicaps.szPname,
&rf2);
/* FIXME: do additional stuff with IMoniker here, depending on what RegisterFilter does */
if (pMoniker)
IMoniker_Release(pMoniker);
if (pMoniker) {
VARIANT var;
V_VT(&var) = VT_I4;
V_UNION(&var, ulVal) = i;
res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag);
if (SUCCEEDED(res))
res = IPropertyBag_Write(pPropBag, wszWaveInID, &var);
else
pPropBag = NULL;
V_VT(&var) = VT_LPWSTR;
V_UNION(&var, bstrVal) = wicaps.szPname;
if (SUCCEEDED(res))
res = IPropertyBag_Write(pPropBag, wszFriendlyName, &var);
if (pPropBag)
IPropertyBag_Release(pPropBag);
IMoniker_Release(pMoniker);
}
CoTaskMemFree(pTypes);
}
@ -802,7 +838,6 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
szDeviceVersion, sizeof(szDeviceVersion)/sizeof(WCHAR)))
{
IMoniker * pMoniker = NULL;
IPropertyBag * pPropBag = NULL;
WCHAR dprintf[] = { 'v','i','d','e','o','%','d',0 };
snprintfW(szDevicePath, sizeof(szDevicePath)/sizeof(WCHAR), dprintf, i);
/* The above code prevents 1 device with a different ID overwriting another */
@ -833,8 +868,10 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
V_VT(&var) = VT_I4;
V_UNION(&var, ulVal) = i;
res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag);
if (SUCCEEDED(res))
res = IPropertyBag_Write(pPropBag, wszVfwIndex, &var);
if (SUCCEEDED(res)) {
res = IPropertyBag_Write(pPropBag, wszVfwIndex, &var);
IPropertyBag_Release(pPropBag);
}
IMoniker_Release(pMoniker);
}

View file

@ -20,9 +20,20 @@
#pragma code_page(65001)
#include "windef.h"
//#include "windef.h"
//#include "winbase.h"
//#include "winnls.h"
#include "devenum_private.h"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE
{
IDS_DEVENUM_DSDEFAULT "Default DirectSound"
IDS_DEVENUM_DS "DirectSound: %s"
IDS_DEVENUM_WODEFAULT "Default WaveOut Device"
IDS_DEVENUM_MIDEFAULT "Default MidiOut Device"
}
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
@ -33,4 +44,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#define WINE_PRODUCTVERSION 6,5,1,902
#define WINE_PRODUCTVERSION_STR "6.5"
#include "wine/wine_common_ver.rc"
#include <wine/wine_common_ver.rc>
1 WINE_REGISTRY devenum_classes.rgs

View file

@ -0,0 +1,90 @@
/*
* COM Classes for devenum
*
* Copyright 2010 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
[
helpstring("System Device Enum"),
threading(both),
uuid(62be5d10-60eb-11d0-bd3b-00a0c911ce86)
]
coclass SystemDeviceEnum { interface ICreateDevEnum; }
[
threading(both),
progid("device.1"),
vi_progid("device"),
uuid(4315d437-5b8c-11d0-bd3b-00a0c911ce86)
]
coclass DeviceMoniker { interface IParseDisplayName; }
[
helpstring("ACM Class Manager"),
threading(both),
uuid(33d9a761-90c8-11d0-bd43-00a0c911ce86)
]
coclass AudioCompressorCategory { }
[
helpstring("ICM Class Manager"),
threading(both),
uuid(33d9a760-90c8-11d0-bd43-00a0c911ce86)
]
coclass VideoCompressorCategory { }
[
helpstring("ActiveMovie Filter Class Manager"),
threading(both),
uuid(083863f1-70de-11d0-bd40-00a0c911ce86)
]
coclass LegacyAmFilterCategory { }
[
helpstring("VFW Capture Class Manager"),
threading(both),
uuid(860bb310-5d01-11d0-bd3b-00a0c911ce86)
]
coclass VideoInputDeviceCategory { }
[
helpstring("WaveIn Class Manager"),
threading(both),
uuid(33d9a762-90c8-11d0-bd43-00a0c911ce86)
]
coclass AudioInputDeviceCategory { }
[
helpstring("WaveOut and DSound Class Manager"),
threading(both),
uuid(e0f158e1-cb04-11d0-bd4e-00a0c911ce86)
]
coclass AudioRendererCategory { }
[
helpstring("MidiOut Class Manager"),
threading(both),
uuid(4efe2452-168a-11d1-bc76-00c04fb9453b)
]
coclass MidiRendererCategory { }
[
helpstring("ActiveMovie Filter Categories"),
threading(both),
uuid(da4e3da0-d07d-11d0-bd50-00a0c911ce86)
]
coclass ActiveMovieCategories { }

View file

@ -0,0 +1,60 @@
HKCR
{
NoRemove Interface
{
}
NoRemove CLSID
{
'{62BE5D10-60EB-11D0-BD3B-00A0C911CE86}' = s 'System Device Enum'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{4315D437-5B8C-11D0-BD3B-00A0C911CE86}' = s 'DeviceMoniker'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
ProgId = s 'device.1'
VersionIndependentProgId = s 'device'
}
'{33D9A761-90C8-11D0-BD43-00A0C911CE86}' = s 'ACM Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{33D9A760-90C8-11D0-BD43-00A0C911CE86}' = s 'ICM Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{083863F1-70DE-11D0-BD40-00A0C911CE86}' = s 'ActiveMovie Filter Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{860BB310-5D01-11D0-BD3B-00A0C911CE86}' = s 'VFW Capture Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{33D9A762-90C8-11D0-BD43-00A0C911CE86}' = s 'WaveIn Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}' = s 'WaveOut and DSound Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{4EFE2452-168A-11D1-BC76-00C04FB9453B}' = s 'MidiOut Class Manager'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}' = s 'ActiveMovie Filter Categories'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
}
'device.1' = s 'DeviceMoniker'
{
CLSID = s '{4315D437-5B8C-11D0-BD3B-00A0C911CE86}'
}
'device' = s 'DeviceMoniker'
{
CLSID = s '{4315D437-5B8C-11D0-BD3B-00A0C911CE86}'
CurVer = s 'device.1'
}
}

View file

@ -20,13 +20,13 @@
*/
#include "devenum_private.h"
#include <rpcproxy.h>
#include <wine/debug.h>
//#include "winreg.h"
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
LONG dll_refs;
HINSTANCE DEVENUM_hInstance;
DECLSPEC_HIDDEN LONG dll_refs;
DECLSPEC_HIDDEN HINSTANCE DEVENUM_hInstance;
typedef struct
{
@ -35,7 +35,6 @@ typedef struct
BOOL instance;
} register_info;
static HRESULT register_clsids(int count, const register_info * pRegInfo, LPCWSTR pszThreadingModel);
static void DEVENUM_RegisterQuartz(void);
/***********************************************************************
@ -55,10 +54,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
DEVENUM_hInstance = hinstDLL;
DisableThreadLibraryCalls(hinstDLL);
break;
case DLL_PROCESS_DETACH:
DEVENUM_hInstance = 0;
break;
}
return TRUE;
}
@ -76,7 +71,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
* Oh well - works just fine as it is */
if (IsEqualGUID(rclsid, &CLSID_SystemDeviceEnum) ||
IsEqualGUID(rclsid, &CLSID_CDeviceMoniker))
return IClassFactory_QueryInterface((IClassFactory*)&DEVENUM_ClassFactory, iid, ppv);
return IClassFactory_QueryInterface(&DEVENUM_ClassFactory.IClassFactory_iface, iid, ppv);
FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid));
return CLASS_E_CLASSNOTAVAILABLE;
@ -96,42 +91,12 @@ HRESULT WINAPI DllCanUnloadNow(void)
HRESULT WINAPI DllRegisterServer(void)
{
HRESULT res;
HKEY hkeyClsid = NULL;
HKEY hkey1 = NULL;
HKEY hkey2 = NULL;
LPOLESTR pszClsidDevMon = NULL;
IFilterMapper2 * pMapper = NULL;
LPVOID mapvptr;
static const WCHAR threadingModel[] = {'B','o','t','h',0};
static const WCHAR sysdevenum[] = {'S','y','s','t','e','m',' ','D','e','v','i','c','e',' ','E','n','u','m',0};
static const WCHAR devmon[] = {'D','e','v','i','c','e','M','o','n','i','k','e','r',0};
static const WCHAR acmcat[] = {'A','C','M',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r',0};
static const WCHAR vidcat[] = {'I','C','M',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r',0};
static const WCHAR filtcat[] = {'A','c','t','i','v','e','M','o','v','i','e',' ','F','i','l','t','e','r',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r',0};
static const WCHAR vfwcat[] = {'V','F','W',' ','C','a','p','t','u','r','e',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r',0};
static const WCHAR wavein[] = {'W','a','v','e','I','n',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r', 0};
static const WCHAR waveout[] = {'W','a','v','e','O','u','t',' ','a','n','d',' ','D','S','o','u','n','d',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r',0};
static const WCHAR midiout[] = {'M','i','d','i','O','u','t',' ','C','l','a','s','s',' ','M','a','n','a','g','e','r',0};
static const WCHAR amcat[] = {'A','c','t','i','v','e','M','o','v','i','e',' ','F','i','l','t','e','r',' ','C','a','t','e','g','o','r','i','e','s',0};
static const WCHAR device[] = {'d','e','v','i','c','e',0};
static const WCHAR device_1[] = {'d','e','v','i','c','e','.','1',0};
static const register_info ri[] =
{
{&CLSID_SystemDeviceEnum, sysdevenum, FALSE},
{&CLSID_CDeviceMoniker, devmon, FALSE},
{&CLSID_AudioCompressorCategory, acmcat, TRUE},
{&CLSID_VideoCompressorCategory, vidcat, TRUE},
{&CLSID_LegacyAmFilterCategory, filtcat, TRUE},
{&CLSID_VideoInputDeviceCategory, vfwcat, FALSE},
{&CLSID_AudioInputDeviceCategory, wavein, FALSE},
{&CLSID_AudioRendererCategory, waveout, FALSE},
{&CLSID_MidiRendererCategory, midiout, FALSE},
{&CLSID_ActiveMovieCategories, amcat, TRUE}
};
TRACE("\n");
res = register_clsids(sizeof(ri) / sizeof(register_info), ri, threadingModel);
res = __wine_register_resources( DEVENUM_hInstance );
/* Quartz is needed for IFilterMapper2 */
DEVENUM_RegisterQuartz();
@ -169,116 +134,6 @@ HRESULT WINAPI DllRegisterServer(void)
IFilterMapper2_Release(pMapper);
}
/*** CDeviceMoniker ***/
if (SUCCEEDED(res))
{
res = StringFromCLSID(&CLSID_CDeviceMoniker, &pszClsidDevMon);
}
if (SUCCEEDED(res))
{
res = RegOpenKeyW(HKEY_CLASSES_ROOT, clsid_keyname, &hkeyClsid)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegOpenKeyW(hkeyClsid, pszClsidDevMon, &hkey1)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
res = RegCreateKeyW(hkey1, wszProgID, &hkey2)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegSetValueW(hkey2, NULL, REG_SZ, device_1, (lstrlenW(device_1) + 1) * sizeof(WCHAR))
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (hkey2)
{
RegCloseKey(hkey2);
hkey2 = NULL;
}
if (SUCCEEDED(res))
{
static const WCHAR wszVProgID[] = {'V','e','r','s','i','o','n','I','n','d','e','p','e','d','e','n','t','P','r','o','g','I','D',0};
res = RegCreateKeyW(hkey1, wszVProgID, &hkey2)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegSetValueW(hkey2, NULL, REG_SZ, device, (lstrlenW(device) + 1) * sizeof(WCHAR))
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (hkey2)
{
RegCloseKey(hkey2);
hkey2 = NULL;
}
if (hkey1)
{
RegCloseKey(hkey1);
hkey1 = NULL;
}
if (SUCCEEDED(res))
{
res = RegCreateKeyW(HKEY_CLASSES_ROOT, device, &hkey1)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegCreateKeyW(hkey1, clsid_keyname, &hkey2)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegSetValueW(hkey2, NULL, REG_SZ, pszClsidDevMon, (lstrlenW(pszClsidDevMon) + 1) * sizeof(WCHAR))
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (hkey2)
{
RegCloseKey(hkey2);
hkey2 = NULL;
}
if (hkey1)
{
RegCloseKey(hkey1);
hkey1 = NULL;
}
if (SUCCEEDED(res))
{
res = RegCreateKeyW(HKEY_CLASSES_ROOT, device_1, &hkey1)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegCreateKeyW(hkey1, clsid_keyname, &hkey2)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
res = RegSetValueW(hkey2, NULL, REG_SZ, pszClsidDevMon, (lstrlenW(pszClsidDevMon) + 1) * sizeof(WCHAR))
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (hkey2)
RegCloseKey(hkey2);
if (hkey1)
RegCloseKey(hkey1);
if (hkeyClsid)
RegCloseKey(hkeyClsid);
CoTaskMemFree(pszClsidDevMon);
CoUninitialize();
return res;
@ -289,77 +144,8 @@ HRESULT WINAPI DllRegisterServer(void)
*/
HRESULT WINAPI DllUnregisterServer(void)
{
FIXME("stub!\n");
return E_FAIL;
}
static HRESULT register_clsids(int count, const register_info * pRegInfo, LPCWSTR pszThreadingModel)
{
HRESULT res = S_OK;
LPOLESTR clsidString = NULL;
HKEY hkeyClsid;
HKEY hkeySub;
HKEY hkeyInproc32;
HKEY hkeyInstance = NULL;
int i;
static const WCHAR wcszInproc32[] = {'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
static const WCHAR wcszThreadingModel[] = {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0};
static const WCHAR dll_module[] = {'d','e','v','e','n','u','m','.','d','l','l',0};
res = RegOpenKeyW(HKEY_CLASSES_ROOT, clsid_keyname, &hkeyClsid)
== ERROR_SUCCESS ? S_OK : E_FAIL;
for (i = 0; i < count; i++)
{
hkeySub = 0;
if (SUCCEEDED(res))
{
res = StringFromCLSID(pRegInfo[i].clsid, &clsidString);
}
if (SUCCEEDED(res))
{
res = RegCreateKeyW(hkeyClsid, clsidString, &hkeySub)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (pRegInfo[i].instance && SUCCEEDED(res))
{
res = RegCreateKeyW(hkeySub, wszInstanceKeyName, &hkeyInstance)
== ERROR_SUCCESS ? S_OK : E_FAIL;
RegCloseKey(hkeyInstance);
}
if (SUCCEEDED(res))
{
RegSetValueW(hkeySub,
NULL,
REG_SZ,
pRegInfo->friendly_name ? pRegInfo[i].friendly_name : clsidString,
(lstrlenW(pRegInfo[i].friendly_name ? pRegInfo->friendly_name : clsidString) + 1) * sizeof(WCHAR));
res = RegCreateKeyW(hkeySub, wcszInproc32, &hkeyInproc32)
== ERROR_SUCCESS ? S_OK : E_FAIL;
}
if (SUCCEEDED(res))
{
RegSetValueW(hkeyInproc32,
NULL,
REG_SZ,
dll_module,
(lstrlenW(dll_module) + 1) * sizeof(WCHAR));
RegSetValueExW(hkeyInproc32,
wcszThreadingModel,
0,
REG_SZ,
(LPCVOID)pszThreadingModel,
(lstrlenW(pszThreadingModel) + 1) * sizeof(WCHAR));
RegCloseKey(hkeyInproc32);
}
if (hkeySub) RegCloseKey(hkeySub);
CoTaskMemFree(clsidString);
clsidString = NULL;
}
RegCloseKey(hkeyClsid);
return res;
FIXME("stub!\n");
return __wine_unregister_resources( DEVENUM_hInstance );
}
typedef HRESULT (WINAPI *DllRegisterServer_func)(void);

View file

@ -51,7 +51,7 @@
/**********************************************************************
* Dll lifetime tracking declaration for devenum.dll
*/
extern LONG dll_refs;
extern LONG dll_refs DECLSPEC_HIDDEN;
static inline void DEVENUM_LockModule(void) { InterlockedIncrement(&dll_refs); }
static inline void DEVENUM_UnlockModule(void) { InterlockedDecrement(&dll_refs); }
@ -61,45 +61,27 @@ static inline void DEVENUM_UnlockModule(void) { InterlockedDecrement(&dll_refs);
*/
typedef struct
{
const IClassFactoryVtbl *lpVtbl;
IClassFactory IClassFactory_iface;
} ClassFactoryImpl;
typedef struct
{
const ICreateDevEnumVtbl *lpVtbl;
} CreateDevEnumImpl;
typedef struct
{
const IParseDisplayNameVtbl *lpVtbl;
} ParseDisplayNameImpl;
typedef struct
{
const IEnumMonikerVtbl *lpVtbl;
LONG ref;
DWORD index;
HKEY hkey;
} EnumMonikerImpl;
typedef struct
{
const IMonikerVtbl *lpVtbl;
IMoniker IMoniker_iface;
LONG ref;
HKEY hkey;
} MediaCatMoniker;
MediaCatMoniker * DEVENUM_IMediaCatMoniker_Construct(void);
HRESULT DEVENUM_IEnumMoniker_Construct(HKEY hkey, IEnumMoniker ** ppEnumMoniker);
MediaCatMoniker * DEVENUM_IMediaCatMoniker_Construct(void) DECLSPEC_HIDDEN;
HRESULT DEVENUM_IEnumMoniker_Construct(HKEY hkey, IEnumMoniker ** ppEnumMoniker) DECLSPEC_HIDDEN;
extern ClassFactoryImpl DEVENUM_ClassFactory;
extern CreateDevEnumImpl DEVENUM_CreateDevEnum;
extern ParseDisplayNameImpl DEVENUM_ParseDisplayName;
extern ClassFactoryImpl DEVENUM_ClassFactory DECLSPEC_HIDDEN;
extern ICreateDevEnum DEVENUM_CreateDevEnum DECLSPEC_HIDDEN;
extern IParseDisplayName DEVENUM_ParseDisplayName DECLSPEC_HIDDEN;
/**********************************************************************
* Private helper function to get AM filter category key location
*/
HRESULT DEVENUM_GetCategoryKey(REFCLSID clsidDeviceClass, HKEY *pBaseKey, WCHAR *wszRegKeyName, UINT maxLen);
HRESULT DEVENUM_GetCategoryKey(REFCLSID clsidDeviceClass, HKEY *pBaseKey, WCHAR *wszRegKeyName, UINT maxLen) DECLSPEC_HIDDEN;
/**********************************************************************
* Global string constant declarations

View file

@ -28,12 +28,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(devenum);
/**********************************************************************
* DEVENUM_IClassFactory_QueryInterface (also IUnknown)
*/
static HRESULT WINAPI DEVENUM_IClassFactory_QueryInterface(
LPCLASSFACTORY iface,
REFIID riid,
LPVOID *ppvObj)
static HRESULT WINAPI DEVENUM_IClassFactory_QueryInterface(IClassFactory *iface, REFIID riid,
void **ppvObj)
{
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObj);
if (ppvObj == NULL) return E_POINTER;
@ -56,7 +54,7 @@ static HRESULT WINAPI DEVENUM_IClassFactory_QueryInterface(
/**********************************************************************
* DEVENUM_IClassFactory_AddRef (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IClassFactory_AddRef(LPCLASSFACTORY iface)
static ULONG WINAPI DEVENUM_IClassFactory_AddRef(IClassFactory *iface)
{
TRACE("\n");
@ -68,7 +66,7 @@ static ULONG WINAPI DEVENUM_IClassFactory_AddRef(LPCLASSFACTORY iface)
/**********************************************************************
* DEVENUM_IClassFactory_Release (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IClassFactory_Release(LPCLASSFACTORY iface)
static ULONG WINAPI DEVENUM_IClassFactory_Release(IClassFactory *iface)
{
TRACE("\n");
@ -80,13 +78,10 @@ static ULONG WINAPI DEVENUM_IClassFactory_Release(LPCLASSFACTORY iface)
/**********************************************************************
* DEVENUM_IClassFactory_CreateInstance
*/
static HRESULT WINAPI DEVENUM_IClassFactory_CreateInstance(
LPCLASSFACTORY iface,
LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID *ppvObj)
static HRESULT WINAPI DEVENUM_IClassFactory_CreateInstance(IClassFactory *iface,
IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
{
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
TRACE("(%p)->(%p, %s, %p)\n", iface, pUnkOuter, debugstr_guid(riid), ppvObj);
if (ppvObj == NULL) return E_POINTER;
@ -110,9 +105,7 @@ static HRESULT WINAPI DEVENUM_IClassFactory_CreateInstance(
/**********************************************************************
* DEVENUM_IClassFactory_LockServer
*/
static HRESULT WINAPI DEVENUM_IClassFactory_LockServer(
LPCLASSFACTORY iface,
BOOL fLock)
static HRESULT WINAPI DEVENUM_IClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
{
TRACE("\n");
@ -138,4 +131,4 @@ static const IClassFactoryVtbl IClassFactory_Vtbl =
/**********************************************************************
* static ClassFactory instance
*/
ClassFactoryImpl DEVENUM_ClassFactory = { &IClassFactory_Vtbl };
ClassFactoryImpl DEVENUM_ClassFactory = { { &IClassFactory_Vtbl } };

View file

@ -30,24 +30,33 @@
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
static ULONG WINAPI DEVENUM_IEnumMoniker_AddRef(LPENUMMONIKER iface);
static ULONG WINAPI DEVENUM_IMediaCatMoniker_AddRef(LPMONIKER iface);
static ULONG WINAPI DEVENUM_IPropertyBag_AddRef(LPPROPERTYBAG iface);
typedef struct
{
IEnumMoniker IEnumMoniker_iface;
LONG ref;
DWORD index;
HKEY hkey;
} EnumMonikerImpl;
typedef struct
{
const IPropertyBagVtbl *lpVtbl;
IPropertyBag IPropertyBag_iface;
LONG ref;
HKEY hkey;
} RegPropBagImpl;
static inline RegPropBagImpl *impl_from_IPropertyBag(IPropertyBag *iface)
{
return CONTAINING_RECORD(iface, RegPropBagImpl, IPropertyBag_iface);
}
static HRESULT WINAPI DEVENUM_IPropertyBag_QueryInterface(
LPPROPERTYBAG iface,
REFIID riid,
LPVOID *ppvObj)
{
RegPropBagImpl *This = (RegPropBagImpl *)iface;
RegPropBagImpl *This = impl_from_IPropertyBag(iface);
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObj);
@ -57,7 +66,7 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_QueryInterface(
IsEqualGUID(riid, &IID_IPropertyBag))
{
*ppvObj = iface;
DEVENUM_IPropertyBag_AddRef(iface);
IPropertyBag_AddRef(iface);
return S_OK;
}
@ -70,7 +79,7 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_QueryInterface(
*/
static ULONG WINAPI DEVENUM_IPropertyBag_AddRef(LPPROPERTYBAG iface)
{
RegPropBagImpl *This = (RegPropBagImpl *)iface;
RegPropBagImpl *This = impl_from_IPropertyBag(iface);
TRACE("(%p)->() AddRef from %d\n", iface, This->ref);
@ -82,7 +91,7 @@ static ULONG WINAPI DEVENUM_IPropertyBag_AddRef(LPPROPERTYBAG iface)
*/
static ULONG WINAPI DEVENUM_IPropertyBag_Release(LPPROPERTYBAG iface)
{
RegPropBagImpl *This = (RegPropBagImpl *)iface;
RegPropBagImpl *This = impl_from_IPropertyBag(iface);
ULONG ref;
TRACE("(%p)->() ReleaseThis->ref from %d\n", iface, This->ref);
@ -105,7 +114,7 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
LPVOID pData = NULL;
DWORD received;
DWORD type = 0;
RegPropBagImpl *This = (RegPropBagImpl *)iface;
RegPropBagImpl *This = impl_from_IPropertyBag(iface);
HRESULT res = S_OK;
LONG reswin32;
@ -212,7 +221,7 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Write(
LPCOLESTR pszPropName,
VARIANT* pVar)
{
RegPropBagImpl *This = (RegPropBagImpl *)iface;
RegPropBagImpl *This = impl_from_IPropertyBag(iface);
LPVOID lpData = NULL;
DWORD cbData = 0;
DWORD dwType = 0;
@ -223,6 +232,7 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Write(
switch (V_VT(pVar))
{
case VT_BSTR:
case VT_LPWSTR:
TRACE("writing %s\n", debugstr_w(V_UNION(pVar, bstrVal)));
lpData = V_UNION(pVar, bstrVal);
dwType = REG_SZ;
@ -277,62 +287,60 @@ static HRESULT DEVENUM_IPropertyBag_Construct(HANDLE hkey, IPropertyBag **ppBag)
RegPropBagImpl * rpb = CoTaskMemAlloc(sizeof(RegPropBagImpl));
if (!rpb)
return E_OUTOFMEMORY;
rpb->lpVtbl = &IPropertyBag_Vtbl;
rpb->IPropertyBag_iface.lpVtbl = &IPropertyBag_Vtbl;
rpb->ref = 1;
rpb->hkey = hkey;
*ppBag = (IPropertyBag*)rpb;
*ppBag = &rpb->IPropertyBag_iface;
DEVENUM_LockModule();
return S_OK;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_QueryInterface(
LPMONIKER iface,
REFIID riid,
LPVOID *ppvObj)
static inline MediaCatMoniker *impl_from_IMoniker(IMoniker *iface)
{
return CONTAINING_RECORD(iface, MediaCatMoniker, IMoniker_iface);
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_QueryInterface(IMoniker *iface, REFIID riid,
void **ppv)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
if (This == NULL || ppvObj == NULL) return E_POINTER;
*ppvObj = NULL;
if (!ppv)
return E_POINTER;
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IPersist) ||
IsEqualGUID(riid, &IID_IPersistStream) ||
IsEqualGUID(riid, &IID_IMoniker))
{
*ppvObj = iface;
DEVENUM_IMediaCatMoniker_AddRef(iface);
*ppv = iface;
IMoniker_AddRef(iface);
return S_OK;
}
FIXME("- no interface IID: %s\n", debugstr_guid(riid));
*ppv = NULL;
return E_NOINTERFACE;
}
/**********************************************************************
* DEVENUM_IMediaCatMoniker_AddRef (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IMediaCatMoniker_AddRef(LPMONIKER iface)
static ULONG WINAPI DEVENUM_IMediaCatMoniker_AddRef(IMoniker *iface)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
TRACE("\n");
MediaCatMoniker *This = impl_from_IMoniker(iface);
ULONG ref = InterlockedIncrement(&This->ref);
return InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
/**********************************************************************
* DEVENUM_IMediaCatMoniker_Release (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IMediaCatMoniker_Release(LPMONIKER iface)
static ULONG WINAPI DEVENUM_IMediaCatMoniker_Release(IMoniker *iface)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
ULONG ref;
TRACE("\n");
MediaCatMoniker *This = impl_from_IMoniker(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
ref = InterlockedDecrement(&This->ref);
if (ref == 0) {
RegCloseKey(This->hkey);
CoTaskMemFree(This);
@ -341,11 +349,10 @@ static ULONG WINAPI DEVENUM_IMediaCatMoniker_Release(LPMONIKER iface)
return ref;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetClassID(
LPMONIKER iface,
CLSID* pClassID)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetClassID(IMoniker *iface, CLSID *pClassID)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
MediaCatMoniker *This = impl_from_IMoniker(iface);
FIXME("(%p)->(%p): stub\n", This, pClassID);
if (pClassID == NULL)
@ -354,30 +361,28 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetClassID(
return E_NOTIMPL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsDirty(LPMONIKER iface)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsDirty(IMoniker *iface)
{
FIXME("(%p)->(): stub\n", iface);
return S_FALSE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Load(LPMONIKER iface, IStream* pStm)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Load(IMoniker *iface, IStream *pStm)
{
FIXME("(%p)->(%p): stub\n", iface, pStm);
return E_NOTIMPL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Save(LPMONIKER iface, IStream* pStm, BOOL fClearDirty)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty)
{
FIXME("(%p)->(%p, %s): stub\n", iface, pStm, fClearDirty ? "true" : "false");
return STG_E_CANTSAVE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetSizeMax(
LPMONIKER iface,
ULARGE_INTEGER* pcbSize)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *pcbSize)
{
FIXME("(%p)->(%p): stub\n", iface, pcbSize);
@ -386,25 +391,19 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetSizeMax(
return S_OK;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToObject(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
REFIID riidResult,
void** ppvResult)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToObject(IMoniker *iface, IBindCtx *pbc,
IMoniker *pmkToLeft, REFIID riidResult, void **ppvResult)
{
MediaCatMoniker *This = impl_from_IMoniker(iface);
IUnknown * pObj = NULL;
IPropertyBag * pProp = NULL;
CLSID clsID;
VARIANT var;
HRESULT res = E_FAIL;
MediaCatMoniker *This = (MediaCatMoniker *)iface;
VariantInit(&var);
TRACE("(%p)->(%p, %p, %s, %p)\n", This, pbc, pmkToLeft, debugstr_guid(riidResult), ppvResult);
VariantInit(&var);
*ppvResult = NULL;
if(pmkToLeft==NULL)
@ -458,21 +457,28 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToObject(
return res;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToStorage(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
REFIID riid,
void** ppvObj)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToStorage(IMoniker *iface, IBindCtx *pbc,
IMoniker *pmkToLeft, REFIID riid, void **ppvObj)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
MediaCatMoniker *This = impl_from_IMoniker(iface);
TRACE("(%p)->(%p, %p, %s, %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj);
*ppvObj = NULL;
if (pbc || pmkToLeft)
if (pmkToLeft)
return MK_E_NOSTORAGE;
if (pbc != NULL)
{
static DWORD reported;
if (!reported)
{
FIXME("ignoring IBindCtx %p\n", pbc);
reported++;
}
}
if (IsEqualGUID(riid, &IID_IPropertyBag))
{
HANDLE hkey;
@ -483,12 +489,8 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToStorage(
return MK_E_NOSTORAGE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Reduce(
LPMONIKER iface,
IBindCtx* pbc,
DWORD dwReduceHowFar,
IMoniker** ppmkToLeft,
IMoniker** ppmkReduced)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Reduce(IMoniker *iface, IBindCtx *pbc,
DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
{
TRACE("(%p)->(%p, %d, %p, %p)\n", iface, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
@ -499,11 +501,8 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Reduce(
return MK_S_REDUCED_TO_SELF;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ComposeWith(
LPMONIKER iface,
IMoniker* pmkRight,
BOOL fOnlyIfNotGeneric,
IMoniker** ppmkComposite)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
BOOL fOnlyIfNotGeneric, IMoniker **ppmkComposite)
{
FIXME("(%p)->(%p, %s, %p): stub\n", iface, pmkRight, fOnlyIfNotGeneric ? "true" : "false", ppmkComposite);
@ -513,10 +512,8 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ComposeWith(
return E_NOTIMPL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Enum(
LPMONIKER iface,
BOOL fForward,
IEnumMoniker** ppenumMoniker)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Enum(IMoniker *iface, BOOL fForward,
IEnumMoniker **ppenumMoniker)
{
FIXME("(%p)->(%s, %p): stub\n", iface, fForward ? "true" : "false", ppenumMoniker);
@ -525,18 +522,14 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Enum(
return S_OK;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsEqual(
LPMONIKER iface,
IMoniker* pmkOtherMoniker)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker)
{
FIXME("(%p)->(%p): stub\n", iface, pmkOtherMoniker);
return E_NOTIMPL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Hash(
LPMONIKER iface,
DWORD* pdwHash)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Hash(IMoniker *iface, DWORD *pdwHash)
{
TRACE("(%p)->(%p)\n", iface, pdwHash);
@ -545,22 +538,16 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Hash(
return S_OK;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsRunning(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
IMoniker* pmkNewlyRunning)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsRunning(IMoniker *iface, IBindCtx *pbc,
IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning)
{
FIXME("(%p)->(%p, %p, %p): stub\n", iface, pbc, pmkToLeft, pmkNewlyRunning);
return S_FALSE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetTimeOfLastChange(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
FILETIME* pFileTime)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc,
IMoniker *pmkToLeft, FILETIME *pFileTime)
{
TRACE("(%p)->(%p, %p, %p)\n", iface, pbc, pmkToLeft, pFileTime);
@ -570,9 +557,7 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetTimeOfLastChange(
return MK_E_UNAVAILABLE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Inverse(
LPMONIKER iface,
IMoniker** ppmk)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Inverse(IMoniker *iface, IMoniker **ppmk)
{
TRACE("(%p)->(%p)\n", iface, ppmk);
@ -581,10 +566,8 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Inverse(
return MK_E_NOINVERSE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_CommonPrefixWith(
LPMONIKER iface,
IMoniker* pmkOtherMoniker,
IMoniker** ppmkPrefix)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_CommonPrefixWith(IMoniker *iface,
IMoniker *pmkOtherMoniker, IMoniker **ppmkPrefix)
{
TRACE("(%p)->(%p, %p)\n", iface, pmkOtherMoniker, ppmkPrefix);
@ -593,10 +576,8 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_CommonPrefixWith(
return MK_E_NOPREFIX;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_RelativePathTo(
LPMONIKER iface,
IMoniker* pmkOther,
IMoniker** ppmkRelPath)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther,
IMoniker **ppmkRelPath)
{
TRACE("(%p)->(%p, %p)\n", iface, pmkOther, ppmkRelPath);
@ -605,13 +586,10 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_RelativePathTo(
return MK_S_HIM;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetDisplayName(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
LPOLESTR* ppszDisplayName)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
MediaCatMoniker *This = impl_from_IMoniker(iface);
WCHAR wszBuffer[MAX_PATH];
static const WCHAR wszFriendlyName[] = {'F','r','i','e','n','d','l','y','N','a','m','e',0};
LONG received = sizeof(wszFriendlyName);
@ -631,13 +609,8 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetDisplayName(
return E_FAIL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ParseDisplayName(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
LPOLESTR pszDisplayName,
ULONG* pchEaten,
IMoniker** ppmkOut)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc,
IMoniker *pmkToLeft, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
{
FIXME("(%p)->(%p, %p, %s, %p, %p)\n", iface, pbc, pmkToLeft, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
@ -647,9 +620,7 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ParseDisplayName(
return MK_E_SYNTAX;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsSystemMoniker(
LPMONIKER iface,
DWORD* pdwMksys)
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsSystemMoniker(IMoniker *iface, DWORD *pdwMksys)
{
TRACE("(%p)->(%p)\n", iface, pdwMksys);
@ -690,65 +661,59 @@ MediaCatMoniker * DEVENUM_IMediaCatMoniker_Construct(void)
if (!pMoniker)
return NULL;
pMoniker->lpVtbl = &IMoniker_Vtbl;
pMoniker->IMoniker_iface.lpVtbl = &IMoniker_Vtbl;
pMoniker->ref = 0;
pMoniker->hkey = NULL;
DEVENUM_IMediaCatMoniker_AddRef((LPMONIKER)pMoniker);
DEVENUM_IMediaCatMoniker_AddRef(&pMoniker->IMoniker_iface);
DEVENUM_LockModule();
return pMoniker;
}
/**********************************************************************
* DEVENUM_IEnumMoniker_QueryInterface (also IUnknown)
*/
static HRESULT WINAPI DEVENUM_IEnumMoniker_QueryInterface(
LPENUMMONIKER iface,
REFIID riid,
LPVOID *ppvObj)
static inline EnumMonikerImpl *impl_from_IEnumMoniker(IEnumMoniker *iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
return CONTAINING_RECORD(iface, EnumMonikerImpl, IEnumMoniker_iface);
}
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObj);
static HRESULT WINAPI DEVENUM_IEnumMoniker_QueryInterface(IEnumMoniker *iface, REFIID riid,
void **ppv)
{
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
if (This == NULL || ppvObj == NULL) return E_POINTER;
if (!ppv)
return E_POINTER;
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IEnumMoniker))
{
*ppvObj = iface;
DEVENUM_IEnumMoniker_AddRef(iface);
*ppv = iface;
IEnumMoniker_AddRef(iface);
return S_OK;
}
FIXME("- no interface IID: %s\n", debugstr_guid(riid));
*ppv = NULL;
return E_NOINTERFACE;
}
/**********************************************************************
* DEVENUM_IEnumMoniker_AddRef (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IEnumMoniker_AddRef(LPENUMMONIKER iface)
static ULONG WINAPI DEVENUM_IEnumMoniker_AddRef(IEnumMoniker *iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->() AddRef from %d\n", iface, ref - 1);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
/**********************************************************************
* DEVENUM_IEnumMoniker_Release (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IEnumMoniker_Release(LPENUMMONIKER iface)
static ULONG WINAPI DEVENUM_IEnumMoniker_Release(IEnumMoniker *iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->() Release from %d\n", iface, ref + 1);
TRACE("(%p) ref=%d\n", This, ref);
if (!ref)
{
@ -760,13 +725,14 @@ static ULONG WINAPI DEVENUM_IEnumMoniker_Release(LPENUMMONIKER iface)
return ref;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Next(LPENUMMONIKER iface, ULONG celt, IMoniker ** rgelt, ULONG * pceltFetched)
static HRESULT WINAPI DEVENUM_IEnumMoniker_Next(IEnumMoniker *iface, ULONG celt, IMoniker **rgelt,
ULONG *pceltFetched)
{
EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
WCHAR buffer[MAX_PATH + 1];
LONG res;
ULONG fetched = 0;
MediaCatMoniker * pMoniker;
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("(%p)->(%d, %p, %p)\n", iface, celt, rgelt, pceltFetched);
@ -783,10 +749,10 @@ static HRESULT WINAPI DEVENUM_IEnumMoniker_Next(LPENUMMONIKER iface, ULONG celt,
if (RegOpenKeyW(This->hkey, buffer, &pMoniker->hkey) != ERROR_SUCCESS)
{
DEVENUM_IMediaCatMoniker_Release((LPMONIKER)pMoniker);
IMoniker_Release(&pMoniker->IMoniker_iface);
break;
}
rgelt[fetched] = (LPMONIKER)pMoniker;
rgelt[fetched] = &pMoniker->IMoniker_iface;
fetched++;
}
@ -803,15 +769,15 @@ static HRESULT WINAPI DEVENUM_IEnumMoniker_Next(LPENUMMONIKER iface, ULONG celt,
return S_OK;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Skip(LPENUMMONIKER iface, ULONG celt)
static HRESULT WINAPI DEVENUM_IEnumMoniker_Skip(IEnumMoniker *iface, ULONG celt)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
DWORD subKeys;
TRACE("(%p)->(%d)\n", iface, celt);
/* Before incrementing, check if there are any more values to run thru.
Some programs use the Skip() function to get the amount of devices */
/* Before incrementing, check if there are any more values to run through.
Some programs use the Skip() function to get the number of devices */
if(RegQueryInfoKeyW(This->hkey, NULL, NULL, NULL, &subKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
{
return S_FALSE;
@ -826,9 +792,9 @@ static HRESULT WINAPI DEVENUM_IEnumMoniker_Skip(LPENUMMONIKER iface, ULONG celt)
return S_OK;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Reset(LPENUMMONIKER iface)
static HRESULT WINAPI DEVENUM_IEnumMoniker_Reset(IEnumMoniker *iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
TRACE("(%p)->()\n", iface);
@ -837,7 +803,7 @@ static HRESULT WINAPI DEVENUM_IEnumMoniker_Reset(LPENUMMONIKER iface)
return S_OK;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Clone(LPENUMMONIKER iface, IEnumMoniker ** ppenum)
static HRESULT WINAPI DEVENUM_IEnumMoniker_Clone(IEnumMoniker *iface, IEnumMoniker **ppenum)
{
FIXME("(%p)->(%p): stub\n", iface, ppenum);
@ -864,12 +830,12 @@ HRESULT DEVENUM_IEnumMoniker_Construct(HKEY hkey, IEnumMoniker ** ppEnumMoniker)
if (!pEnumMoniker)
return E_OUTOFMEMORY;
pEnumMoniker->lpVtbl = &IEnumMoniker_Vtbl;
pEnumMoniker->IEnumMoniker_iface.lpVtbl = &IEnumMoniker_Vtbl;
pEnumMoniker->ref = 1;
pEnumMoniker->index = 0;
pEnumMoniker->hkey = hkey;
*ppEnumMoniker = (IEnumMoniker *)pEnumMoniker;
*ppEnumMoniker = &pEnumMoniker->IEnumMoniker_iface;
DEVENUM_LockModule();

View file

@ -27,31 +27,28 @@
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
static HRESULT WINAPI DEVENUM_IParseDisplayName_QueryInterface(
LPPARSEDISPLAYNAME iface,
REFIID riid,
LPVOID *ppvObj)
static HRESULT WINAPI DEVENUM_IParseDisplayName_QueryInterface(IParseDisplayName *iface,
REFIID riid, void **ppv)
{
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
if (!ppv)
return E_POINTER;
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IParseDisplayName))
{
*ppvObj = iface;
IParseDisplayName_AddRef(iface);
return S_OK;
*ppv = iface;
IParseDisplayName_AddRef(iface);
return S_OK;
}
FIXME("- no interface IID: %s\n", debugstr_guid(riid));
*ppv = NULL;
return E_NOINTERFACE;
}
/**********************************************************************
* DEVENUM_IParseDisplayName_AddRef (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IParseDisplayName_AddRef(LPPARSEDISPLAYNAME iface)
static ULONG WINAPI DEVENUM_IParseDisplayName_AddRef(IParseDisplayName *iface)
{
TRACE("\n");
@ -60,10 +57,7 @@ static ULONG WINAPI DEVENUM_IParseDisplayName_AddRef(LPPARSEDISPLAYNAME iface)
return 2; /* non-heap based object */
}
/**********************************************************************
* DEVENUM_IParseDisplayName_Release (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IParseDisplayName_Release(LPPARSEDISPLAYNAME iface)
static ULONG WINAPI DEVENUM_IParseDisplayName_Release(IParseDisplayName *iface)
{
TRACE("\n");
@ -81,12 +75,8 @@ static ULONG WINAPI DEVENUM_IParseDisplayName_Release(LPPARSEDISPLAYNAME iface)
* Might not handle more complicated strings properly (ie anything
* not in "@device:sw:{CLSID1}\<filter name or CLSID>" format
*/
static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(
LPPARSEDISPLAYNAME iface,
IBindCtx *pbc,
LPOLESTR pszDisplayName,
ULONG *pchEaten,
IMoniker **ppmkOut)
static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(IParseDisplayName *iface,
IBindCtx *pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
{
LPOLESTR pszBetween = NULL;
LPOLESTR pszClass = NULL;
@ -136,10 +126,10 @@ static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(
strcatW(wszRegKeyName, pszBetween);
if (RegCreateKeyW(hbasekey, wszRegKeyName, &pMoniker->hkey) == ERROR_SUCCESS)
*ppmkOut = (LPMONIKER)pMoniker;
*ppmkOut = &pMoniker->IMoniker_iface;
else
{
IMoniker_Release((LPMONIKER)pMoniker);
IMoniker_Release(&pMoniker->IMoniker_iface);
res = MK_E_NOOBJECT;
}
}
@ -163,4 +153,4 @@ static const IParseDisplayNameVtbl IParseDisplayName_Vtbl =
};
/* The one instance of this class */
ParseDisplayNameImpl DEVENUM_ParseDisplayName = { &IParseDisplayName_Vtbl };
IParseDisplayName DEVENUM_ParseDisplayName = { &IParseDisplayName_Vtbl };

View file

@ -34,6 +34,7 @@ reactos/dll/directx/wine/d3dcompiler_43 # Synced to Wine-1.7.1
reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to Wine-1.7.1
reactos/dll/directx/wine/d3dxof # Synced to Wine-1.7.1
reactos/dll/directx/wine/ddraw # Synced to Wine-1.7.1
reactos/dll/directx/wine/devenum # Synced to Wine-1.7.1
reactos/dll/directx/wine/dinput # Synced to Wine-1.7.1
reactos/dll/directx/wine/dinput8 # Synced to Wine-1.5.26
reactos/dll/directx/wine/dmusic # Synced to Wine-1.5.26