From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/mmdevapi/devenum.c | 36 ++++++++++++++++++++++++++++++++- dlls/mmdevapi/tests/propstore.c | 4 ++-- 2 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 0f48fe161a6..8cd148b0a3c 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -280,6 +280,9 @@ static unsigned int get_vt_elem_size(VARTYPE vt) case VT_BOOL: return sizeof(VARIANT_BOOL);
+ case VT_CLSID: + return sizeof(GUID); + default: return 0; } @@ -334,6 +337,20 @@ static HRESULT deserialize_reg_prop(BYTE *data, DWORD data_size, PROPVARIANT *pv memcpy(pv->cabool.pElems, reg_prop->data, elems_size); break;
+ case VT_CLSID: + pv->vt = reg_prop->vt; + pv->puuid = CoTaskMemAlloc(sizeof(*pv->puuid)); + *pv->puuid = ((GUID *)reg_prop->data)[0]; + break; + + case VT_CLSID | VT_VECTOR: + pv->vt = reg_prop->vt; + pv->cauuid.cElems = reg_prop->elems; + elems_size = sizeof(*pv->cauuid.pElems) * reg_prop->elems; + pv->cauuid.pElems = CoTaskMemAlloc(elems_size); + memcpy(pv->cauuid.pElems, reg_prop->data, elems_size); + break; + default: ERR("Tried to deserialize unhandled vt %#x.\n", reg_prop->vt); hr = E_NOTIMPL; @@ -348,7 +365,7 @@ static HRESULT serialize_reg_prop(HKEY reg_key, const WCHAR *prop_id, PROPVARIAN const struct reg_prop_serialized reg_prop_init = { pv->vt, WINE_REG_PROP_MAGIC }; struct reg_prop_serialized *reg_prop = NULL; unsigned int size = sizeof(reg_prop_init); - unsigned int elems_size, elem_count = 1; + unsigned int elems_size = 0, elem_count = 1; void *elems_val = NULL; LONG ret;
@@ -364,6 +381,21 @@ static HRESULT serialize_reg_prop(HKEY reg_key, const WCHAR *prop_id, PROPVARIAN elems_size = elem_count * sizeof(*pv->cabool.pElems); elems_val = pv->cabool.pElems; break; + + case VT_CLSID: + elems_size = sizeof(*pv->puuid); + elems_val = pv->puuid; + break; + + case VT_CLSID | VT_VECTOR: + elem_count = pv->cauuid.cElems; + elems_size = elem_count * sizeof(*pv->cauuid.pElems); + elems_val = pv->cauuid.pElems; + break; + + default: + assert(0); + break; }
size += elems_size; @@ -477,6 +509,8 @@ static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERT
case VT_BOOL: case VT_BOOL | VT_VECTOR: + case VT_CLSID: + case VT_CLSID | VT_VECTOR: { hr = serialize_reg_prop(regkey, buffer, (PROPVARIANT *)pv); ret = 0; diff --git a/dlls/mmdevapi/tests/propstore.c b/dlls/mmdevapi/tests/propstore.c index 15d1f5b4866..3c1e6c1512a 100644 --- a/dlls/mmdevapi/tests/propstore.c +++ b/dlls/mmdevapi/tests/propstore.c @@ -256,8 +256,8 @@ static void test_setvalue_on_wow64(IPropertyStore *store) { { VT_BOOL, vt_bool_vals, sizeof(vt_bool_vals[0]), S_OK, REG_BINARY, 0xa }, { VT_BOOL | VT_VECTOR, vt_bool_vals, sizeof(vt_bool_vals), S_OK, REG_BINARY, 0xc }, - { VT_CLSID, vt_clsid_vals, sizeof(vt_clsid_vals[0]), S_OK, REG_BINARY, 0x18, TRUE, TRUE }, - { VT_CLSID | VT_VECTOR, vt_clsid_vals, sizeof(vt_clsid_vals), S_OK, REG_BINARY, 0x28, TRUE, TRUE }, + { VT_CLSID, vt_clsid_vals, sizeof(vt_clsid_vals[0]), S_OK, REG_BINARY, 0x18 }, + { VT_CLSID | VT_VECTOR, vt_clsid_vals, sizeof(vt_clsid_vals), S_OK, REG_BINARY, 0x28 }, { VT_BSTR, vt_bstr_val, sizeof(vt_bstr_val), S_OK, REG_BINARY, 0x14, TRUE, TRUE }, { VT_BLOB, vt_blob_val, sizeof(vt_blob_val), S_OK, REG_BINARY, 0xe, .todo_data = TRUE }, };