Make IPropertBag_Read use a dynamically allocated array rather than a
static one.
This commit is contained in:
parent
d8b2109e61
commit
4a55eb5c92
|
@ -94,8 +94,8 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
|
||||||
VARIANT* pVar,
|
VARIANT* pVar,
|
||||||
IErrorLog* pErrorLog)
|
IErrorLog* pErrorLog)
|
||||||
{
|
{
|
||||||
WCHAR wszData[MAX_PATH + 1];
|
LPVOID pData = NULL;
|
||||||
LONG received = MAX_PATH + 1;
|
LONG received;
|
||||||
DWORD type = 0;
|
DWORD type = 0;
|
||||||
ICOM_THIS(RegPropBagImpl, iface);
|
ICOM_THIS(RegPropBagImpl, iface);
|
||||||
HRESULT res = S_OK;
|
HRESULT res = S_OK;
|
||||||
|
@ -106,13 +106,24 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
|
||||||
if (!pszPropName || !pVar)
|
if (!pszPropName || !pVar)
|
||||||
return E_POINTER;
|
return E_POINTER;
|
||||||
|
|
||||||
/* work around a GCC bug that occurs here unless we use the reswin32 variable as well */
|
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, NULL, NULL, &received);
|
||||||
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, &type, (LPVOID)wszData, &received);
|
|
||||||
res = HRESULT_FROM_WIN32(reswin32);
|
res = HRESULT_FROM_WIN32(reswin32);
|
||||||
|
|
||||||
if (SUCCEEDED(res))
|
if (SUCCEEDED(res))
|
||||||
{
|
{
|
||||||
TRACE("%ld, %s\n", received, debugstr_w(wszData));
|
pData = HeapAlloc(GetProcessHeap(), 0, received);
|
||||||
|
|
||||||
|
/* work around a GCC bug that occurs here unless we use the reswin32 variable as well */
|
||||||
|
reswin32 = RegQueryValueExW(This->hkey, pszPropName, NULL, &type, pData, &received);
|
||||||
|
res = HRESULT_FROM_WIN32(reswin32);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SUCCEEDED(res))
|
||||||
|
{
|
||||||
|
res = E_INVALIDARG; /* assume we cannot coerce into right type */
|
||||||
|
|
||||||
|
TRACE("Read %ld bytes (%s)\n", received, type == REG_SZ ? debugstr_w((LPWSTR)pData) : "binary data");
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case REG_SZ:
|
case REG_SZ:
|
||||||
|
@ -120,18 +131,20 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
|
||||||
{
|
{
|
||||||
case VT_LPWSTR:
|
case VT_LPWSTR:
|
||||||
V_UNION(pVar, bstrVal) = CoTaskMemAlloc(received * sizeof(WCHAR));
|
V_UNION(pVar, bstrVal) = CoTaskMemAlloc(received * sizeof(WCHAR));
|
||||||
strcpyW(V_UNION(pVar, bstrVal), wszData);
|
strcpyW(V_UNION(pVar, bstrVal), (LPWSTR)pData);
|
||||||
return S_OK;
|
res = S_OK;
|
||||||
|
break;
|
||||||
case VT_EMPTY:
|
case VT_EMPTY:
|
||||||
V_VT(pVar) = VT_BSTR;
|
V_VT(pVar) = VT_BSTR;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case VT_BSTR:
|
case VT_BSTR:
|
||||||
V_UNION(pVar, bstrVal) = SysAllocStringLen(wszData, received - 1);
|
V_UNION(pVar, bstrVal) = SysAllocStringLen((LPWSTR)pData, received - 1);
|
||||||
return S_OK;
|
res = S_OK;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REG_DWORD:
|
case REG_DWORD:
|
||||||
TRACE("REG_DWORD: %lx\n", *(DWORD *)wszData);
|
TRACE("REG_DWORD: %lx\n", *(DWORD *)pData);
|
||||||
switch (V_VT(pVar))
|
switch (V_VT(pVar))
|
||||||
{
|
{
|
||||||
case VT_EMPTY:
|
case VT_EMPTY:
|
||||||
|
@ -139,8 +152,9 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case VT_I4:
|
case VT_I4:
|
||||||
case VT_UI4:
|
case VT_UI4:
|
||||||
V_UNION(pVar, ulVal) = *(DWORD *)wszData;
|
V_UNION(pVar, ulVal) = *(DWORD *)pData;
|
||||||
return S_OK;
|
res = S_OK;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REG_BINARY:
|
case REG_BINARY:
|
||||||
|
@ -155,26 +169,30 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Read(
|
||||||
case VT_EMPTY:
|
case VT_EMPTY:
|
||||||
case VT_ARRAY | VT_UI1:
|
case VT_ARRAY | VT_UI1:
|
||||||
if (!(V_UNION(pVar, parray) = SafeArrayCreate(VT_UI1, 1, &bound)))
|
if (!(V_UNION(pVar, parray) = SafeArrayCreate(VT_UI1, 1, &bound)))
|
||||||
return E_OUTOFMEMORY;
|
res = E_OUTOFMEMORY;
|
||||||
|
res = S_OK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (res == E_INVALIDARG)
|
||||||
|
break;
|
||||||
|
|
||||||
res = SafeArrayAccessData(V_UNION(pVar, parray), &pArrayElements);
|
res = SafeArrayAccessData(V_UNION(pVar, parray), &pArrayElements);
|
||||||
if (FAILED(res))
|
if (FAILED(res))
|
||||||
{
|
break;
|
||||||
TRACE(" <- %lx\n", res);
|
|
||||||
return res;
|
CopyMemory(pArrayElements, pData, received);
|
||||||
}
|
|
||||||
CopyMemory(pArrayElements, wszData, received);
|
|
||||||
res = SafeArrayUnaccessData(V_UNION(pVar, parray));
|
res = SafeArrayUnaccessData(V_UNION(pVar, parray));
|
||||||
TRACE(" <- %lx\n", res);
|
break;
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FIXME("Variant type %x not supported for regtype %lx\n", V_VT(pVar), type);
|
if (res == E_INVALIDARG)
|
||||||
return E_FAIL;
|
FIXME("Variant type %x not supported for regtype %lx\n", V_VT(pVar), type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pData)
|
||||||
|
HeapFree(GetProcessHeap(), 0, pData);
|
||||||
|
|
||||||
TRACE("<- %lx\n", res);
|
TRACE("<- %lx\n", res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue