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