=?UTF-8?Q?Bernhard=20=C3=9Cbelacker=20?=: dwrite: Call RegEnumValueW with value and val_count parameters.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 8 09:51:23 CDT 2015


Module: wine
Branch: master
Commit: 119501fee8bffcab6ced16282ed12ca7d0f564ec
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=119501fee8bffcab6ced16282ed12ca7d0f564ec

Author: Bernhard Übelacker <bernhardu at vr-web.de>
Date:   Sun Jul  5 19:04:42 2015 +0200

dwrite: Call RegEnumValueW with value and val_count parameters.

---

 dlls/dwrite/font.c | 35 ++++++++++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index d9b6521..a0539ca 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -1853,8 +1853,8 @@ static ULONG WINAPI systemfontfileenumerator_Release(IDWriteFontFileEnumerator *
 static HRESULT WINAPI systemfontfileenumerator_GetCurrentFontFile(IDWriteFontFileEnumerator *iface, IDWriteFontFile **file)
 {
     struct system_fontfile_enumerator *enumerator = impl_from_IDWriteFontFileEnumerator(iface);
-    DWORD ret, type, count;
-    WCHAR *filename;
+    DWORD ret, type, val_count, count;
+    WCHAR *value, *filename;
     HRESULT hr;
 
     *file = NULL;
@@ -1862,14 +1862,22 @@ static HRESULT WINAPI systemfontfileenumerator_GetCurrentFontFile(IDWriteFontFil
     if (enumerator->index < 0)
         return E_FAIL;
 
-    if (RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, NULL, &count))
+    ret = RegQueryInfoKeyW(enumerator->hkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &val_count, &count, NULL, NULL);
+    if (ret != ERROR_SUCCESS)
         return E_FAIL;
 
-    if (!(filename = heap_alloc(count)))
+    val_count++;
+    value = heap_alloc( val_count * sizeof(value[0]) );
+    filename = heap_alloc(count);
+    if (!value || !filename) {
+        heap_free(value);
+        heap_free(filename);
         return E_OUTOFMEMORY;
+    }
 
-    ret = RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, (BYTE*)filename, &count);
+    ret = RegEnumValueW(enumerator->hkey, enumerator->index, value, &val_count, NULL, &type, (BYTE*)filename, &count);
     if (ret) {
+        heap_free(value);
         heap_free(filename);
         return E_FAIL;
     }
@@ -1888,6 +1896,7 @@ static HRESULT WINAPI systemfontfileenumerator_GetCurrentFontFile(IDWriteFontFil
     else
         hr = IDWriteFactory2_CreateFontFileReference(enumerator->factory, filename, NULL, file);
 
+    heap_free(value);
     heap_free(filename);
     return hr;
 }
@@ -1895,14 +1904,25 @@ static HRESULT WINAPI systemfontfileenumerator_GetCurrentFontFile(IDWriteFontFil
 static HRESULT WINAPI systemfontfileenumerator_MoveNext(IDWriteFontFileEnumerator *iface, BOOL *current)
 {
     struct system_fontfile_enumerator *enumerator = impl_from_IDWriteFontFileEnumerator(iface);
+    DWORD ret, max_val_count;
+    WCHAR *value;
 
     *current = FALSE;
     enumerator->index++;
 
+    ret = RegQueryInfoKeyW(enumerator->hkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &max_val_count, NULL, NULL, NULL);
+    if (ret != ERROR_SUCCESS)
+        return E_FAIL;
+
+    max_val_count++;
+    if (!(value = heap_alloc( max_val_count * sizeof(value[0]) )))
+        return E_OUTOFMEMORY;
+
     /* iterate until we find next string value */
     while (1) {
-        DWORD type = 0, count;
-        if (RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, NULL, &count))
+        DWORD type = 0, count, val_count;
+        val_count = max_val_count;
+        if (RegEnumValueW(enumerator->hkey, enumerator->index, value, &val_count, NULL, &type, NULL, &count))
             break;
         if (type == REG_SZ) {
             *current = TRUE;
@@ -1912,6 +1932,7 @@ static HRESULT WINAPI systemfontfileenumerator_MoveNext(IDWriteFontFileEnumerato
     }
 
     TRACE("index = %d, current = %d\n", enumerator->index, *current);
+    heap_free(value);
     return S_OK;
 }
 




More information about the wine-cvs mailing list