devenum: Move locating category key to function, use it ParseDisplayName.
This commit is contained in:
parent
cd5fa7dedb
commit
de70686f17
@ -96,6 +96,35 @@ static ULONG WINAPI DEVENUM_ICreateDevEnum_Release(ICreateDevEnum * iface)
|
|||||||
return 1; /* non-heap based object */
|
return 1; /* non-heap based object */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT DEVENUM_GetCategoryKey(REFCLSID clsidDeviceClass, HKEY *pBaseKey, WCHAR *wszRegKeyName, UINT maxLen)
|
||||||
|
{
|
||||||
|
if (IsEqualGUID(clsidDeviceClass, &CLSID_AudioRendererCategory) ||
|
||||||
|
IsEqualGUID(clsidDeviceClass, &CLSID_AudioInputDeviceCategory) ||
|
||||||
|
IsEqualGUID(clsidDeviceClass, &CLSID_VideoInputDeviceCategory) ||
|
||||||
|
IsEqualGUID(clsidDeviceClass, &CLSID_MidiRendererCategory))
|
||||||
|
{
|
||||||
|
*pBaseKey = HKEY_CURRENT_USER;
|
||||||
|
strcpyW(wszRegKeyName, wszActiveMovieKey);
|
||||||
|
|
||||||
|
if (!StringFromGUID2(clsidDeviceClass, wszRegKeyName + strlenW(wszRegKeyName), maxLen - strlenW(wszRegKeyName)))
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*pBaseKey = HKEY_CLASSES_ROOT;
|
||||||
|
strcpyW(wszRegKeyName, clsid_keyname);
|
||||||
|
strcatW(wszRegKeyName, wszRegSeparator);
|
||||||
|
|
||||||
|
if (!StringFromGUID2(clsidDeviceClass, wszRegKeyName + CLSID_STR_LEN, maxLen - CLSID_STR_LEN))
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
strcatW(wszRegKeyName, wszRegSeparator);
|
||||||
|
strcatW(wszRegKeyName, wszInstanceKeyName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* DEVENUM_ICreateDevEnum_CreateClassEnumerator
|
* DEVENUM_ICreateDevEnum_CreateClassEnumerator
|
||||||
*/
|
*/
|
||||||
@ -108,6 +137,7 @@ HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator(
|
|||||||
WCHAR wszRegKey[MAX_PATH];
|
WCHAR wszRegKey[MAX_PATH];
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
HKEY hbasekey;
|
HKEY hbasekey;
|
||||||
|
HRESULT hr;
|
||||||
CreateDevEnumImpl *This = (CreateDevEnumImpl *)iface;
|
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\tDeviceClass:\t%s\n", This, debugstr_guid(clsidDeviceClass), ppEnumMoniker, dwFlags, debugstr_guid(clsidDeviceClass));
|
||||||
@ -117,29 +147,9 @@ HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator(
|
|||||||
|
|
||||||
*ppEnumMoniker = NULL;
|
*ppEnumMoniker = NULL;
|
||||||
|
|
||||||
if (IsEqualGUID(clsidDeviceClass, &CLSID_AudioRendererCategory) ||
|
hr = DEVENUM_GetCategoryKey(clsidDeviceClass, &hbasekey, wszRegKey, MAX_PATH);
|
||||||
IsEqualGUID(clsidDeviceClass, &CLSID_AudioInputDeviceCategory) ||
|
if (FAILED(hr))
|
||||||
IsEqualGUID(clsidDeviceClass, &CLSID_VideoInputDeviceCategory) ||
|
return hr;
|
||||||
IsEqualGUID(clsidDeviceClass, &CLSID_MidiRendererCategory))
|
|
||||||
{
|
|
||||||
hbasekey = HKEY_CURRENT_USER;
|
|
||||||
strcpyW(wszRegKey, wszActiveMovieKey);
|
|
||||||
|
|
||||||
if (!StringFromGUID2(clsidDeviceClass, wszRegKey + strlenW(wszRegKey), MAX_PATH - strlenW(wszRegKey)))
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hbasekey = HKEY_CLASSES_ROOT;
|
|
||||||
strcpyW(wszRegKey, clsid_keyname);
|
|
||||||
strcatW(wszRegKey, wszRegSeparator);
|
|
||||||
|
|
||||||
if (!StringFromGUID2(clsidDeviceClass, wszRegKey + CLSID_STR_LEN, MAX_PATH - CLSID_STR_LEN))
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
strcatW(wszRegKey, wszRegSeparator);
|
|
||||||
strcatW(wszRegKey, wszInstanceKeyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegOpenKeyW(hbasekey, wszRegKey, &hkey) != ERROR_SUCCESS)
|
if (RegOpenKeyW(hbasekey, wszRegKey, &hkey) != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
@ -148,7 +158,7 @@ HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator(
|
|||||||
IsEqualGUID(clsidDeviceClass, &CLSID_VideoInputDeviceCategory) ||
|
IsEqualGUID(clsidDeviceClass, &CLSID_VideoInputDeviceCategory) ||
|
||||||
IsEqualGUID(clsidDeviceClass, &CLSID_MidiRendererCategory))
|
IsEqualGUID(clsidDeviceClass, &CLSID_MidiRendererCategory))
|
||||||
{
|
{
|
||||||
HRESULT hr = DEVENUM_CreateSpecialCategories();
|
hr = DEVENUM_CreateSpecialCategories();
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
if (RegOpenKeyW(hbasekey, wszRegKey, &hkey) != ERROR_SUCCESS)
|
if (RegOpenKeyW(hbasekey, wszRegKey, &hkey) != ERROR_SUCCESS)
|
||||||
|
@ -92,6 +92,11 @@ extern ClassFactoryImpl DEVENUM_ClassFactory;
|
|||||||
extern CreateDevEnumImpl DEVENUM_CreateDevEnum;
|
extern CreateDevEnumImpl DEVENUM_CreateDevEnum;
|
||||||
extern ParseDisplayNameImpl DEVENUM_ParseDisplayName;
|
extern ParseDisplayNameImpl DEVENUM_ParseDisplayName;
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* Private helper function to get AM filter category key location
|
||||||
|
*/
|
||||||
|
HRESULT DEVENUM_GetCategoryKey(REFCLSID clsidDeviceClass, HKEY *pBaseKey, WCHAR *wszRegKeyName, UINT maxLen);
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Global string constant declarations
|
* Global string constant declarations
|
||||||
*/
|
*/
|
||||||
|
@ -90,11 +90,13 @@ static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(
|
|||||||
{
|
{
|
||||||
LPOLESTR pszBetween = NULL;
|
LPOLESTR pszBetween = NULL;
|
||||||
LPOLESTR pszClass = NULL;
|
LPOLESTR pszClass = NULL;
|
||||||
IEnumMoniker * pEm = NULL;
|
|
||||||
MediaCatMoniker * pMoniker = NULL;
|
MediaCatMoniker * pMoniker = NULL;
|
||||||
CLSID clsidDevice;
|
CLSID clsidDevice;
|
||||||
HRESULT res = S_OK;
|
HRESULT res = S_OK;
|
||||||
|
WCHAR wszRegKeyName[MAX_PATH];
|
||||||
|
HKEY hbasekey;
|
||||||
int classlen;
|
int classlen;
|
||||||
|
static const WCHAR wszRegSeparator[] = {'\\', 0 };
|
||||||
|
|
||||||
TRACE("(%p, %s, %p, %p)\n", pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
|
TRACE("(%p, %s, %p, %p)\n", pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
|
||||||
|
|
||||||
@ -122,9 +124,7 @@ static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(
|
|||||||
|
|
||||||
if (SUCCEEDED(res))
|
if (SUCCEEDED(res))
|
||||||
{
|
{
|
||||||
res = DEVENUM_ICreateDevEnum_CreateClassEnumerator((ICreateDevEnum *)(char*)&DEVENUM_CreateDevEnum, &clsidDevice, &pEm, 0);
|
res = DEVENUM_GetCategoryKey(&clsidDevice, &hbasekey, wszRegKeyName, MAX_PATH);
|
||||||
if (res == S_FALSE) /* S_FALSE means no category */
|
|
||||||
res = MK_E_NOOBJECT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SUCCEEDED(res))
|
if (SUCCEEDED(res))
|
||||||
@ -132,9 +132,10 @@ static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(
|
|||||||
pMoniker = DEVENUM_IMediaCatMoniker_Construct();
|
pMoniker = DEVENUM_IMediaCatMoniker_Construct();
|
||||||
if (pMoniker)
|
if (pMoniker)
|
||||||
{
|
{
|
||||||
if (RegCreateKeyW(((EnumMonikerImpl *)pEm)->hkey,
|
strcatW(wszRegKeyName, wszRegSeparator);
|
||||||
pszBetween,
|
strcatW(wszRegKeyName, pszBetween);
|
||||||
&pMoniker->hkey) == ERROR_SUCCESS)
|
|
||||||
|
if (RegCreateKeyW(hbasekey, wszRegKeyName, &pMoniker->hkey) == ERROR_SUCCESS)
|
||||||
*ppmkOut = (LPMONIKER)pMoniker;
|
*ppmkOut = (LPMONIKER)pMoniker;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -144,9 +145,6 @@ static HRESULT WINAPI DEVENUM_IParseDisplayName_ParseDisplayName(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pEm)
|
|
||||||
IEnumMoniker_Release(pEm);
|
|
||||||
|
|
||||||
CoTaskMemFree(pszClass);
|
CoTaskMemFree(pszClass);
|
||||||
|
|
||||||
TRACE("-- returning: %x\n", res);
|
TRACE("-- returning: %x\n", res);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user