[v2 1/2] kernel32/tests: resource: Replicate muirct.exe behavior

Zhiyi Zhang zzhang at codeweavers.com
Tue Jul 10 02:28:28 CDT 2018



On Mon 7 9 12:58, Jon Doron wrote:
> For some reason muirct.exe is aware of the opaque structure used by
> BeginUpdateResource, it access the filename field of the opaque structure
> during it's processing.
> 
> MS documentation for the muirct utility:
> https://docs.microsoft.com/en-us/windows/desktop/intl/resource-utilities
> 
> Sample execution:
> MUIRCT.EXE -c "ui.exe" -e "de-DE\ui.exe.mui"
> 
> Signed-off-by: Jon Doron <arilou at gmail.com>
> ---
>  dlls/kernel32/tests/resource.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/dlls/kernel32/tests/resource.c b/dlls/kernel32/tests/resource.c
> index 74066cfba3..6db9655833 100644
> --- a/dlls/kernel32/tests/resource.c
> +++ b/dlls/kernel32/tests/resource.c
> @@ -24,6 +24,7 @@
>  #include "wine/test.h"
>  
>  static const char filename[] = "test_.exe";
> +static const wchar_t filenameW[] = L"test_.exe";
Hi, please don't use L"" to define a wchar string.
Checkout https://wiki.winehq.org/Developer_Hints#Using_only_C89-compliant_code

>  static DWORD GLE;
>  
>  enum constants {
> @@ -463,6 +464,28 @@ static void test_find_resource(void)
>      ok( GetLastError() == ERROR_RESOURCE_LANG_NOT_FOUND, "wrong error %u\n", GetLastError() );
>  }
>  
> +static void test_muirct_compatiblity(void)
> +{
> +    HANDLE res = NULL;
The NULL initialization is not necessary.

> +    PVOID res_data;
> +    PWCHAR res_filename;
res_filenameW is more appropriate. 

Write VOID * instead of PVOID
See https://wiki.winehq.org/Submitting_Patches#Code_guidelines.
> +> +    res = BeginUpdateResourceW( (PWCHAR)filenameW, FALSE );
> +    ok( res != NULL, "BeginUpdateResourceW failed\n" );
> +    res_data = GlobalLock(res);
> +    ok( res_data != NULL, "GlobalLock failed\n" );
> +#ifdef _WIN64
> +    res_filename = (PWCHAR)GlobalLock( *(HGLOBAL*)((ULONG_PTR)res_data + 0x30) );
> +#else
> +    res_filename = (PWCHAR)GlobalLock( *(HGLOBAL*)((ULONG_PTR)res_data + 0x18) );
> +#endif
> +    ok( res_filename != NULL, "GlobalLock for res_filename failed\n" );
> +    ok( !lstrcmpW(res_filename, (PWCHAR)filenameW), "Filename fields do not match\n" );
> +    ok( GlobalUnlock( res_filename ), "GlobalUnlock res_filenamed failed\n" );
Typo res_filenamed
> +    ok( GlobalUnlock( res_data ), "GlobalUnlock res_data failed\n" );
Missing a GlobalUnlock(res)?

Thanks,
Zhiyi
> +    ok( EndUpdateResourceW( res, TRUE ), "EndUpdateResourceW failed\n");
> +}
> +
>  START_TEST(resource)
>  {
>      DWORD i;
> @@ -482,6 +505,7 @@ START_TEST(resource)
>      {
>          const struct _sec_variants *sec = &sec_variants[i];
>          build_exe( &sec->build );
> +        test_muirct_compatiblity();
>          update_resources_none();
>          check_exe( &sec->chk_none );
>          update_resources_delete();
> 



More information about the wine-devel mailing list