Ziqing Hui : kernel32: Use uppercase name in UpdateResourceW().

Alexandre Julliard julliard at winehq.org
Fri Sep 25 14:52:54 CDT 2020


Module: wine
Branch: master
Commit: 2698591a19b21a3e0869bc7c37664eefb36158e4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2698591a19b21a3e0869bc7c37664eefb36158e4

Author: Ziqing Hui <zhui at codeweavers.com>
Date:   Wed Sep 16 15:20:14 2020 +0800

kernel32: Use uppercase name in UpdateResourceW().

Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/resource.c       | 35 +++++++++++++++++++++++++++++++++--
 dlls/kernel32/tests/resource.c |  1 -
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/resource.c b/dlls/kernel32/resource.c
index b81ab3de5a..944f78efa9 100644
--- a/dlls/kernel32/resource.c
+++ b/dlls/kernel32/resource.c
@@ -36,6 +36,7 @@
 #include "wine/exception.h"
 #include "wine/unicode.h"
 #include "wine/list.h"
+#include "kernel_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(resource);
 
@@ -62,6 +63,26 @@ static NTSTATUS get_res_nameA( LPCSTR name, UNICODE_STRING *str )
     return STATUS_SUCCESS;
 }
 
+static NTSTATUS get_res_nameW( LPCWSTR name, UNICODE_STRING *str )
+{
+    if (IS_INTRESOURCE(name))
+    {
+        str->Buffer = ULongToPtr( LOWORD(name) );
+        return STATUS_SUCCESS;
+    }
+    if (name[0] == '#')
+    {
+        ULONG value;
+        RtlInitUnicodeString( str, name + 1 );
+        if (RtlUnicodeStringToInteger( str, 10, &value ) != STATUS_SUCCESS || HIWORD(value))
+            return STATUS_INVALID_PARAMETER;
+        str->Buffer = ULongToPtr(value);
+        return STATUS_SUCCESS;
+    }
+    RtlCreateUnicodeString( str, name );
+    RtlUpcaseUnicodeString( str, str, FALSE );
+    return STATUS_SUCCESS;
+}
 
 /**********************************************************************
  *	    FindResourceExA  (KERNEL32.@)
@@ -1290,27 +1311,37 @@ BOOL WINAPI UpdateResourceW( HANDLE hUpdate, LPCWSTR lpType, LPCWSTR lpName,
                              WORD wLanguage, LPVOID lpData, DWORD cbData)
 {
     QUEUEDUPDATES *updates;
+    UNICODE_STRING nameW, typeW;
     BOOL ret = FALSE;
 
     TRACE("%p %s %s %08x %p %d\n", hUpdate,
           debugstr_w(lpType), debugstr_w(lpName), wLanguage, lpData, cbData);
 
+    nameW.Buffer = typeW.Buffer = NULL;
     updates = GlobalLock(hUpdate);
     if (updates)
     {
+        if (!set_ntstatus( get_res_nameW( lpName, &nameW ))) goto done;
+        if (!set_ntstatus( get_res_nameW( lpType, &typeW ))) goto done;
+
         if (lpData == NULL && cbData == 0)  /* remove resource */
         {
-            ret = update_add_resource( updates, lpType, lpName, wLanguage, NULL, TRUE );
+            ret = update_add_resource( updates, typeW.Buffer, nameW.Buffer, wLanguage, NULL, TRUE );
         }
         else
         {
             struct resource_data *data;
             data = allocate_resource_data( wLanguage, 0, lpData, cbData, TRUE );
             if (data)
-                ret = update_add_resource( updates, lpType, lpName, wLanguage, data, TRUE );
+                ret = update_add_resource( updates, typeW.Buffer, nameW.Buffer, wLanguage, data, TRUE );
         }
+
+    done:
         GlobalUnlock(hUpdate);
     }
+
+    if (!IS_INTRESOURCE(nameW.Buffer)) HeapFree( GetProcessHeap(), 0, nameW.Buffer );
+    if (!IS_INTRESOURCE(typeW.Buffer)) HeapFree( GetProcessHeap(), 0, typeW.Buffer );
     return ret;
 }
 
diff --git a/dlls/kernel32/tests/resource.c b/dlls/kernel32/tests/resource.c
index acb95249d8..bca0298044 100644
--- a/dlls/kernel32/tests/resource.c
+++ b/dlls/kernel32/tests/resource.c
@@ -382,7 +382,6 @@ static void update_resources_name( void )
     if ( !module ) return;
 
     rsrc = FindResourceA( module, res_name, res_type );
-    todo_wine
     ok( rsrc != NULL ||
         broken( GetLastError() == ERROR_RESOURCE_TYPE_NOT_FOUND ) /* win2008 */,
         "FindResource failed: %u\n", GetLastError() );




More information about the wine-cvs mailing list