kernel32: Add stub implementation for EnumResourceLanguagesEx.

Daniel Scharrer daniel at constexpr.org
Fri Jan 23 08:47:24 CST 2015


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


-------------- next part --------------
From 2197abecade0fa9b7232e365ee16fd9ff2539754 Mon Sep 17 00:00:00 2001
From: Daniel Scharrer <daniel at constexpr.org>
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



More information about the wine-patches mailing list