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