mmdevapi: Always use 64-bit registry keys.

This commit is contained in:
Andrew Eikum 2015-05-01 13:11:12 -05:00 committed by Alexandre Julliard
parent a3487ad316
commit b55cc5e4c5
2 changed files with 99 additions and 8 deletions

View File

@ -143,12 +143,12 @@ static HRESULT MMDevPropStore_OpenPropKey(const GUID *guid, DWORD flow, HKEY *pr
LONG ret;
HKEY key;
StringFromGUID2(guid, buffer, 39);
if ((ret = RegOpenKeyExW(flow == eRender ? key_render : key_capture, buffer, 0, KEY_READ|KEY_WRITE, &key)) != ERROR_SUCCESS)
if ((ret = RegOpenKeyExW(flow == eRender ? key_render : key_capture, buffer, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, &key)) != ERROR_SUCCESS)
{
WARN("Opening key %s failed with %u\n", debugstr_w(buffer), ret);
return E_FAIL;
}
ret = RegOpenKeyExW(key, reg_properties, 0, KEY_READ|KEY_WRITE, propkey);
ret = RegOpenKeyExW(key, reg_properties, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, propkey);
RegCloseKey(key);
if (ret != ERROR_SUCCESS)
{
@ -345,11 +345,11 @@ static MMDevice *MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD st
else
root = key_capture;
if (RegCreateKeyExW(root, guidstr, 0, NULL, 0, KEY_WRITE|KEY_READ, NULL, &key, NULL) == ERROR_SUCCESS)
if (RegCreateKeyExW(root, guidstr, 0, NULL, 0, KEY_WRITE|KEY_READ|KEY_WOW64_64KEY, NULL, &key, NULL) == ERROR_SUCCESS)
{
HKEY keyprop;
RegSetValueExW(key, reg_devicestate, 0, REG_DWORD, (const BYTE*)&state, sizeof(DWORD));
if (!RegCreateKeyExW(key, reg_properties, 0, NULL, 0, KEY_WRITE|KEY_READ, NULL, &keyprop, NULL))
if (!RegCreateKeyExW(key, reg_properties, 0, NULL, 0, KEY_WRITE|KEY_READ|KEY_WOW64_64KEY, NULL, &keyprop, NULL))
{
PROPVARIANT pv;
@ -406,11 +406,11 @@ static HRESULT load_devices_from_reg(void)
LONG ret;
DWORD curflow;
ret = RegCreateKeyExW(HKEY_LOCAL_MACHINE, software_mmdevapi, 0, NULL, 0, KEY_WRITE|KEY_READ, NULL, &root, NULL);
ret = RegCreateKeyExW(HKEY_LOCAL_MACHINE, software_mmdevapi, 0, NULL, 0, KEY_WRITE|KEY_READ|KEY_WOW64_64KEY, NULL, &root, NULL);
if (ret == ERROR_SUCCESS)
ret = RegCreateKeyExW(root, reg_capture, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &key_capture, NULL);
ret = RegCreateKeyExW(root, reg_capture, 0, NULL, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, NULL, &key_capture, NULL);
if (ret == ERROR_SUCCESS)
ret = RegCreateKeyExW(root, reg_render, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &key_render, NULL);
ret = RegCreateKeyExW(root, reg_render, 0, NULL, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, NULL, &key_render, NULL);
RegCloseKey(root);
cur = key_capture;
curflow = eCapture;

View File

@ -30,6 +30,19 @@
#include "mmdeviceapi.h"
#include "devpkey.h"
static BOOL (WINAPI *pIsWow64Process)(HANDLE, BOOL *);
static const WCHAR software_renderW[] =
{ 'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
'W','i','n','d','o','w','s','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
'M','M','D','e','v','i','c','e','s','\\',
'A','u','d','i','o','\\',
'R','e','n','d','e','r',0 };
static const WCHAR propertiesW[] = {'P','r','o','p','e','r','t','i','e','s',0};
static void test_propertystore(IPropertyStore *store)
{
HRESULT hr;
@ -109,12 +122,86 @@ static void test_getat(IPropertyStore *store)
ok(found_desc == TRUE, "DEVPKEY_Device_DeviceDesc not found\n");
}
static void test_setvalue_on_wow64(IPropertyStore *store)
{
PROPVARIANT pv;
HRESULT hr;
LONG ret;
WCHAR *guidW;
HKEY root, props, devkey;
DWORD type, regval, size;
static const PROPERTYKEY PKEY_Bogus = {
{0x1da5d803, 0xd492, 0x4edd, {0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x00}}, 0x7f
};
static const WCHAR bogusW[] = {'{','1','D','A','5','D','8','0','3','-','D','4','9','2','-','4','E','D','D','-','8','C','2','3','-','E','0','C','0','F','F','E','E','7','F','0','0','}',',','1','2','7',0};
PropVariantInit(&pv);
pv.vt = VT_EMPTY;
hr = IPropertyStore_GetValue(store, &PKEY_AudioEndpoint_GUID, &pv);
ok(hr == S_OK, "Failed to get Endpoint GUID: %08x\n", hr);
guidW = pv.u.pwszVal;
pv.vt = VT_UI4;
pv.u.ulVal = 0xAB;
hr = IPropertyStore_SetValue(store, &PKEY_Bogus, &pv);
ok(hr == S_OK || hr == E_ACCESSDENIED, "SetValue failed: %08x\n", hr);
if (hr != S_OK)
{
win_skip("Missing permission to write to registry\n");
return;
}
pv.u.ulVal = 0x00;
hr = IPropertyStore_GetValue(store, &PKEY_Bogus, &pv);
ok(hr == S_OK, "GetValue failed: %08x\n", hr);
ok(pv.u.ulVal == 0xAB, "Got wrong value: 0x%x\n", pv.u.ulVal);
/* should find the key in 64-bit view */
ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, software_renderW, 0, KEY_READ|KEY_WOW64_64KEY, &root);
ok(ret == ERROR_SUCCESS, "Couldn't open mmdevices Render key: %u\n", ret);
ret = RegOpenKeyExW(root, guidW, 0, KEY_READ|KEY_WOW64_64KEY, &devkey);
ok(ret == ERROR_SUCCESS, "Couldn't open mmdevice guid key: %u\n", ret);
ret = RegOpenKeyExW(devkey, propertiesW, 0, KEY_READ|KEY_WOW64_64KEY, &props);
ok(ret == ERROR_SUCCESS, "Couldn't open mmdevice property key: %u\n", ret);
/* Note: the registry key exists even without calling IPropStore::Commit */
size = sizeof(regval);
ret = RegGetValueW(props, NULL, bogusW, RRF_RT_DWORD, &type, &regval, &size);
ok(ret == ERROR_SUCCESS, "Couldn't get bogus propertykey value: %u\n", ret);
ok(type == REG_DWORD, "Got wrong value type: %u\n", type);
ok(regval == 0xAB, "Got wrong value: 0x%x\n", regval);
RegCloseKey(props);
RegCloseKey(devkey);
RegCloseKey(root);
CoTaskMemFree(guidW);
/* should NOT find the key in 32-bit view */
ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, software_renderW, 0, KEY_READ, &root);
ok(ret == ERROR_FILE_NOT_FOUND, "Wrong error when opening mmdevices Render key: %u\n", ret);
}
START_TEST(propstore)
{
HRESULT hr;
IMMDeviceEnumerator *mme = NULL;
IMMDevice *dev = NULL;
IPropertyStore *store;
BOOL is_wow64 = FALSE;
HMODULE hk32 = GetModuleHandleA("kernel32.dll");
pIsWow64Process = (void *)GetProcAddress(hk32, "IsWow64Process");
if (pIsWow64Process)
pIsWow64Process(GetCurrentProcess(), &is_wow64);
CoInitializeEx(NULL, COINIT_MULTITHREADED);
hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mme);
@ -149,13 +236,17 @@ START_TEST(propstore)
ok(hr == E_POINTER, "Wrong hr returned: %08x\n", hr);
store = NULL;
hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &store);
hr = IMMDevice_OpenPropertyStore(dev, STGM_READWRITE, &store);
if(hr == E_ACCESSDENIED)
hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &store);
ok(hr == S_OK, "Opening valid store returned %08x\n", hr);
if (store)
{
test_propertystore(store);
test_deviceinterface(store);
test_getat(store);
if (is_wow64)
test_setvalue_on_wow64(store);
IPropertyStore_Release(store);
}
IMMDevice_Release(dev);