[PATCH 2/3] kernelbase: Add SHLoadIndirectString().

Nikolay Sivov nsivov at codeweavers.com
Fri May 24 08:05:02 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/kernelbase/kernelbase.spec |  2 +-
 dlls/kernelbase/string.c        | 48 +++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 7f48169745..b721d8f8c6 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -1354,7 +1354,7 @@
 # @ stub SHCoCreateInstance
 @ stdcall SHExpandEnvironmentStringsA(str ptr long) kernel32.ExpandEnvironmentStringsA
 @ stdcall SHExpandEnvironmentStringsW(wstr ptr long) kernel32.ExpandEnvironmentStringsW
-@ stdcall SHLoadIndirectString(wstr ptr long ptr) shlwapi.SHLoadIndirectString
+@ stdcall SHLoadIndirectString(wstr ptr long ptr)
 # @ stub SHLoadIndirectStringInternal
 @ stdcall SHRegCloseUSKey(ptr) shlwapi.SHRegCloseUSKey
 @ stdcall SHRegCreateUSKeyA(str long long ptr long) shlwapi.SHRegCreateUSKeyA
diff --git a/dlls/kernelbase/string.c b/dlls/kernelbase/string.c
index 4c18acffe5..bd495bd18b 100644
--- a/dlls/kernelbase/string.c
+++ b/dlls/kernelbase/string.c
@@ -1426,3 +1426,51 @@ DWORD WINAPI SHTruncateString(char *str, DWORD size)
 
     return size;
 }
+
+HRESULT WINAPI SHLoadIndirectString(const WCHAR *src, WCHAR *dst, UINT dst_len, void **reserved)
+{
+    WCHAR *dllname = NULL;
+    HMODULE hmod = NULL;
+    HRESULT hr = E_FAIL;
+
+    TRACE("%s, %p, %#x, %p\n", debugstr_w(src), dst, dst_len, reserved);
+
+    if (src[0] == '@')
+    {
+        WCHAR *index_str;
+        int index;
+
+        dst[0] = 0;
+        dllname = StrDupW(src + 1);
+        index_str = strchrW(dllname, ',');
+
+        if(!index_str) goto end;
+
+        *index_str = 0;
+        index_str++;
+        index = atoiW(index_str);
+
+        hmod = LoadLibraryW(dllname);
+        if (!hmod) goto end;
+
+        if (index < 0)
+        {
+            if (LoadStringW(hmod, -index, dst, dst_len))
+                hr = S_OK;
+        }
+        else
+            FIXME("can't handle non-negative indices (%d)\n", index);
+    }
+    else
+    {
+        if (dst != src)
+            lstrcpynW(dst, src, dst_len);
+        hr = S_OK;
+    }
+
+    TRACE("returning %s\n", debugstr_w(dst));
+end:
+    if (hmod) FreeLibrary(hmod);
+    LocalFree(dllname);
+    return hr;
+}
-- 
2.20.1




More information about the wine-devel mailing list