kernel32: Use uppercase name in UpdateResourceW().

Signed-off-by: Ziqing Hui <zhui@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Ziqing Hui 2020-09-16 15:20:14 +08:00 committed by Alexandre Julliard
parent a9d73e97f2
commit 2698591a19
2 changed files with 33 additions and 3 deletions

View file

@ -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;
}

View file

@ -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() );