From: Daniel Scharrer Subject: kernel32: Add stub implementation for EnumResourceLanguagesEx. Message-Id: <54C25EFC.3090303@constexpr.org> Date: Fri, 23 Jan 2015 15:47:24 +0100 This patch exposes the functionality already implemented in EnumResourceLanguages via EnumResourceLanguagesEx: Resources in PE files are enumerated, but enumerating resources in external .mui files and validation remains unimplemented. According to MSDN says flags == 0 and language == 0 match the behavior of EnumResourceLanguages. Fixes abort in mt.exe from the Windows 8.1 SDK due to a call to an unimplemented function. --- .../api-ms-win-core-libraryloader-l1-1-1.spec | 4 +- dlls/kernel32/kernel32.spec | 2 + dlls/kernel32/resource.c | 54 ++++++++++++++++++---- include/winbase.h | 8 ++++ 4 files changed, 58 insertions(+), 10 deletions(-) From 2197abecade0fa9b7232e365ee16fd9ff2539754 Mon Sep 17 00:00:00 2001 From: Daniel Scharrer Date: Fri, 23 Jan 2015 14:58:30 +0100 Subject: kernel32: Add stub implementation for EnumResourceLanguagesEx. --- .../api-ms-win-core-libraryloader-l1-1-1.spec | 4 +- dlls/kernel32/kernel32.spec | 2 + dlls/kernel32/resource.c | 54 ++++++++++++++++++---- include/winbase.h | 8 ++++ 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec b/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec index 3a8e3d9..afd1407 100644 --- a/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec +++ b/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec @@ -1,7 +1,7 @@ @ stub AddDllDirectory @ stdcall DisableThreadLibraryCalls(long) kernel32.DisableThreadLibraryCalls -@ stub EnumResourceLanguagesExA -@ stub EnumResourceLanguagesExW +@ stdcall EnumResourceLanguagesExA(long str str ptr long long long) kernel32.EnumResourceLanguagesExA +@ stdcall EnumResourceLanguagesExW(long wstr wstr ptr long long long) kernel32.EnumResourceLanguagesExW @ stub EnumResourceNamesExA @ stub EnumResourceNamesExW @ stub EnumResourceTypesExA diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index bd6d644..f756637 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -324,6 +324,8 @@ @ stdcall EnumLanguageGroupLocalesW(ptr long long ptr) @ stdcall EnumResourceLanguagesA(long str str ptr long) @ stdcall EnumResourceLanguagesW(long wstr wstr ptr long) +@ stdcall EnumResourceLanguagesExA(long str str ptr long long long) +@ stdcall EnumResourceLanguagesExW(long wstr wstr ptr long long long) @ stdcall EnumResourceNamesA(long str ptr long) @ stdcall EnumResourceNamesW(long wstr ptr long) @ stdcall EnumResourceTypesA(long ptr long) diff --git a/dlls/kernel32/resource.c b/dlls/kernel32/resource.c index 06b93db..4439280 100644 --- a/dlls/kernel32/resource.c +++ b/dlls/kernel32/resource.c @@ -437,10 +437,11 @@ done: /********************************************************************** - * EnumResourceLanguagesA (KERNEL32.@) + * EnumResourceLanguagesExA (KERNEL32.@) */ -BOOL WINAPI EnumResourceLanguagesA( HMODULE hmod, LPCSTR type, LPCSTR name, - ENUMRESLANGPROCA lpfun, LONG_PTR lparam ) +BOOL WINAPI EnumResourceLanguagesExA( HMODULE hmod, LPCSTR type, LPCSTR name, + ENUMRESLANGPROCA lpfun, LONG_PTR lparam, + DWORD flags, LANGID lang ) { int i; BOOL ret = FALSE; @@ -450,7 +451,15 @@ BOOL WINAPI EnumResourceLanguagesA( HMODULE hmod, LPCSTR type, LPCSTR name, const IMAGE_RESOURCE_DIRECTORY *basedir, *resdir; const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; - TRACE( "%p %s %s %p %lx\n", hmod, debugstr_a(type), debugstr_a(name), lpfun, lparam ); + TRACE( "%p %s %s %p %lx %lx %d\n", hmod, debugstr_a(type), debugstr_a(name), + lpfun, lparam, flags, lang ); + + if(flags & (RESOURCE_ENUM_MUI | RESOURCE_ENUM_MUI_SYSTEM | RESOURCE_ENUM_VALIDATE)) + FIXME( "unimplemented flags: %lx\n", flags ); + + if (!flags) flags = RESOURCE_ENUM_LN | RESOURCE_ENUM_MUI; + + if (!(flags & RESOURCE_ENUM_LN)) return ret; if (!hmod) hmod = GetModuleHandleA( NULL ); typeW.Buffer = nameW.Buffer = NULL; @@ -489,10 +498,21 @@ done: /********************************************************************** - * EnumResourceLanguagesW (KERNEL32.@) + * EnumResourceLanguagesA (KERNEL32.@) */ -BOOL WINAPI EnumResourceLanguagesW( HMODULE hmod, LPCWSTR type, LPCWSTR name, - ENUMRESLANGPROCW lpfun, LONG_PTR lparam ) +BOOL WINAPI EnumResourceLanguagesA( HMODULE hmod, LPCSTR type, LPCSTR name, + ENUMRESLANGPROCA lpfun, LONG_PTR lparam ) +{ + return EnumResourceLanguagesExA( hmod, type, name, lpfun, lparam, 0, 0 ); +} + + +/********************************************************************** + * EnumResourceLanguagesExW (KERNEL32.@) + */ +BOOL WINAPI EnumResourceLanguagesExW( HMODULE hmod, LPCWSTR type, LPCWSTR name, + ENUMRESLANGPROCW lpfun, LONG_PTR lparam, + DWORD flags, LANGID lang ) { int i; BOOL ret = FALSE; @@ -502,7 +522,15 @@ BOOL WINAPI EnumResourceLanguagesW( HMODULE hmod, LPCWSTR type, LPCWSTR name, const IMAGE_RESOURCE_DIRECTORY *basedir, *resdir; const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; - TRACE( "%p %s %s %p %lx\n", hmod, debugstr_w(type), debugstr_w(name), lpfun, lparam ); + TRACE( "%p %s %s %p %lx %lx %d\n", hmod, debugstr_w(type), debugstr_w(name), + lpfun, lparam, flags, lang ); + + if(flags & (RESOURCE_ENUM_MUI | RESOURCE_ENUM_MUI_SYSTEM | RESOURCE_ENUM_VALIDATE)) + FIXME( "unimplemented flags: %lx\n", flags ); + + if (!flags) flags = RESOURCE_ENUM_LN | RESOURCE_ENUM_MUI; + + if (!(flags & RESOURCE_ENUM_LN)) return ret; if (!hmod) hmod = GetModuleHandleW( NULL ); typeW.Buffer = nameW.Buffer = NULL; @@ -541,6 +569,16 @@ done: /********************************************************************** + * EnumResourceLanguagesW (KERNEL32.@) + */ +BOOL WINAPI EnumResourceLanguagesW( HMODULE hmod, LPCWSTR type, LPCWSTR name, + ENUMRESLANGPROCW lpfun, LONG_PTR lparam ) +{ + return EnumResourceLanguagesExW( hmod, type, name, lpfun, lparam, 0, 0 ); +} + + +/********************************************************************** * LoadResource (KERNEL32.@) */ HGLOBAL WINAPI LoadResource( HINSTANCE hModule, HRSRC hRsrc ) diff --git a/include/winbase.h b/include/winbase.h index 5ac55b7..52f6c8a 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1542,6 +1542,11 @@ typedef struct _REASON_CONTEXT } Reason; } REASON_CONTEXT, *PREASON_CONTEXT; +#define RESOURCE_ENUM_LN 0x0001 +#define RESOURCE_ENUM_MUI 0x0002 +#define RESOURCE_ENUM_MUI_SYSTEM 0x0004 +#define RESOURCE_ENUM_VALIDATE 0x0008 + WINBASEAPI BOOL WINAPI ActivateActCtx(HANDLE,ULONG_PTR *); WINADVAPI BOOL WINAPI AddAccessAllowedAce(PACL,DWORD,DWORD,PSID); WINADVAPI BOOL WINAPI AddAccessAllowedAceEx(PACL,DWORD,DWORD,DWORD,PSID); @@ -1749,6 +1754,9 @@ WINBASEAPI void WINAPI EnterCriticalSection(CRITICAL_SECTION *lpCrit); WINBASEAPI BOOL WINAPI EnumResourceLanguagesA(HMODULE,LPCSTR,LPCSTR,ENUMRESLANGPROCA,LONG_PTR); WINBASEAPI BOOL WINAPI EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROCW,LONG_PTR); #define EnumResourceLanguages WINELIB_NAME_AW(EnumResourceLanguages) +WINBASEAPI BOOL WINAPI EnumResourceLanguagesExA(HMODULE,LPCSTR,LPCSTR,ENUMRESLANGPROCA,LONG_PTR,DWORD,LANGID); +WINBASEAPI BOOL WINAPI EnumResourceLanguagesExW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROCW,LONG_PTR,DWORD,LANGID); +#define EnumResourceLanguagesEx WINELIB_NAME_AW(EnumResourceLanguagesEx) WINBASEAPI BOOL WINAPI EnumResourceNamesA(HMODULE,LPCSTR,ENUMRESNAMEPROCA,LONG_PTR); WINBASEAPI BOOL WINAPI EnumResourceNamesW(HMODULE,LPCWSTR,ENUMRESNAMEPROCW,LONG_PTR); #define EnumResourceNames WINELIB_NAME_AW(EnumResourceNames) -- 2.2.1