static HRESULT WINAPI MMDevPropStore_GetAt(IPropertyStore *iface, DWORD prop, PROPERTYKEY *key) { MMDevPropStore *This = impl_from_IPropertyStore(iface); WCHAR buffer[50]; DWORD len = sizeof(buffer)/sizeof(*buffer); HRESULT hr; HKEY propkey; TRACE("(%p)->(%u,%p)\n", iface, prop, key); if (!key) return E_POINTER; hr = MMDevPropStore_OpenPropKey(&This->parent->devguid, This->parent->flow, &propkey); if (FAILED(hr)) return hr; if (RegEnumKeyExW(propkey, prop, buffer, &len, NULL, NULL, NULL, NULL) != ERROR_SUCCESS || len <= 40) { WARN("GetAt %u failed\n", prop); return E_INVALIDARG; } RegCloseKey(propkey); buffer[39] = 0; CLSIDFromString(buffer, &key->fmtid); key->pid = atoiW(&buffer[40]); return S_OK; }
static HRESULT WINAPI MMDevPropStore_GetCount(IPropertyStore *iface, DWORD *nprops) { MMDevPropStore *This = impl_from_IPropertyStore(iface); WCHAR buffer[50]; DWORD i = 0; HKEY propkey; HRESULT hr; TRACE("(%p)->(%p)\n", iface, nprops); if (!nprops) return E_POINTER; hr = MMDevPropStore_OpenPropKey(&This->parent->devguid, This->parent->flow, &propkey); if (FAILED(hr)) return hr; *nprops = 0; do { DWORD len = sizeof(buffer)/sizeof(*buffer); if (RegEnumKeyExW(propkey, i, buffer, &len, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) break; i++; } while (0); RegCloseKey(propkey); TRACE("Returning %i\n", i); *nprops = i; return S_OK; }
static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, REFPROPVARIANT pv) { WCHAR buffer[80]; const GUID *id = &key->fmtid; HRESULT hr; HKEY regkey; LONG ret; hr = MMDevPropStore_OpenPropKey(devguid, flow, ®key); if (FAILED(hr)) return hr; wsprintfW( buffer, propkey_formatW, id->Data1, id->Data2, id->Data3, id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3], id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7], key->pid ); switch (pv->vt) { case VT_UI4: { ret = RegSetValueExW(regkey, buffer, 0, REG_DWORD, (const BYTE*)&pv->u.ulVal, sizeof(DWORD)); break; } case VT_BLOB: { ret = RegSetValueExW(regkey, buffer, 0, REG_BINARY, pv->u.blob.pBlobData, pv->u.blob.cbSize); TRACE("Blob %p %u\n", pv->u.blob.pBlobData, pv->u.blob.cbSize); break; } case VT_LPWSTR: { ret = RegSetValueExW(regkey, buffer, 0, REG_SZ, (const BYTE*)pv->u.pwszVal, sizeof(WCHAR)*(1+lstrlenW(pv->u.pwszVal))); break; } default: ret = 0; FIXME("Unhandled type %u\n", pv->vt); hr = E_INVALIDARG; break; } RegCloseKey(regkey); TRACE("Writing %s returned %u\n", debugstr_w(buffer), ret); return hr; }
static HRESULT MMDevice_GetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, PROPVARIANT *pv) { WCHAR buffer[80]; const GUID *id = &key->fmtid; DWORD type, size; HRESULT hr = S_OK; HKEY regkey; LONG ret; hr = MMDevPropStore_OpenPropKey(devguid, flow, ®key); if (FAILED(hr)) return hr; wsprintfW( buffer, propkey_formatW, id->Data1, id->Data2, id->Data3, id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3], id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7], key->pid ); ret = RegGetValueW(regkey, NULL, buffer, RRF_RT_ANY, &type, NULL, &size); if (ret != ERROR_SUCCESS) { WARN("Reading %s returned %d\n", debugstr_w(buffer), ret); RegCloseKey(regkey); PropVariantClear(pv); return S_OK; } switch (type) { case REG_SZ: { pv->vt = VT_LPWSTR; pv->u.pwszVal = CoTaskMemAlloc(size); if (!pv->u.pwszVal) hr = E_OUTOFMEMORY; else RegGetValueW(regkey, NULL, buffer, RRF_RT_REG_SZ, NULL, (BYTE*)pv->u.pwszVal, &size); break; } case REG_DWORD: { pv->vt = VT_UI4; RegGetValueW(regkey, NULL, buffer, RRF_RT_REG_DWORD, NULL, (BYTE*)&pv->u.ulVal, &size); break; } case REG_BINARY: { pv->vt = VT_BLOB; pv->u.blob.cbSize = size; pv->u.blob.pBlobData = CoTaskMemAlloc(size); if (!pv->u.blob.pBlobData) hr = E_OUTOFMEMORY; else RegGetValueW(regkey, NULL, buffer, RRF_RT_REG_BINARY, NULL, (BYTE*)pv->u.blob.pBlobData, &size); break; } default: ERR("Unknown/unhandled type: %u\n", type); PropVariantClear(pv); break; } RegCloseKey(regkey); return hr; }