ReactOS 0.4.15-dev-7958-gcd0bb1a
muireg.c
Go to the documentation of this file.
1#include "desk.h"
2
3/******************************************************************************
4 * load_string [Internal]
5 *
6 * This is basically a copy of user32/resource.c's LoadStringW. Necessary to
7 * avoid importing user32, which is higher level than advapi32. Helper for
8 * RegLoadMUIString.
9 */
10static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
11{
13 HRSRC hResource;
15 int idxString;
16
17 /* Negative values have to be inverted. */
18 if (HIWORD(resId) == 0xffff)
19 resId = (UINT)(-((INT)resId));
20
21 /* Load the resource into memory and get a pointer to it. */
22 hResource = FindResourceW(hModule, MAKEINTRESOURCEW(LOWORD(resId >> 4) + 1), (LPWSTR)RT_STRING);
23 if (!hResource) return 0;
24 hMemory = LoadResource(hModule, hResource);
25 if (!hMemory) return 0;
27
28 /* Strings are length-prefixed. Lowest nibble of resId is an index. */
29 idxString = resId & 0xf;
30 while (idxString--) pString += *pString + 1;
31
32 /* If no buffer is given, return length of the string. */
33 if (!pwszBuffer) return *pString;
34
35 /* Else copy over the string, respecting the buffer size. */
36 cMaxChars = (*pString < cMaxChars) ? *pString : (cMaxChars - 1);
37 if (cMaxChars >= 0)
38 {
39 memcpy(pwszBuffer, pString+1, cMaxChars * sizeof(WCHAR));
40 pwszBuffer[cMaxChars] = L'\0';
41 }
42
43 return cMaxChars;
44}
45
46
47/************************************************************************
48 * RegLoadMUIStringW
49 *
50 * @implemented
51 */
52LONG
54 IN LPCWSTR pszValue OPTIONAL,
55 OUT LPWSTR pszOutBuf,
56 IN DWORD cbOutBuf,
59 IN LPCWSTR pszDirectory OPTIONAL)
60{
61 DWORD dwValueType, cbData;
62 LPWSTR pwszTempBuffer = NULL, pwszExpandedBuffer = NULL;
64
65 /* Parameter sanity checks. */
66 if (!hKey || !pszOutBuf)
68
69 if (pszDirectory && *pszDirectory)
70 {
71 //FIXME("BaseDir parameter not yet supported!\n");
73 }
74
75 /* Check for value existence and correctness of it's type, allocate a buffer and load it. */
76 result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, NULL, &cbData);
77 if (result != ERROR_SUCCESS) goto cleanup;
78 if (!(dwValueType == REG_SZ || dwValueType == REG_EXPAND_SZ) || !cbData)
79 {
81 goto cleanup;
82 }
83 pwszTempBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
84 if (!pwszTempBuffer)
85 {
87 goto cleanup;
88 }
89 result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, (LPBYTE)pwszTempBuffer, &cbData);
90 if (result != ERROR_SUCCESS) goto cleanup;
91
92 /* Expand environment variables, if appropriate, or copy the original string over. */
93 if (dwValueType == REG_EXPAND_SZ)
94 {
95 cbData = ExpandEnvironmentStringsW(pwszTempBuffer, NULL, 0) * sizeof(WCHAR);
96 if (!cbData) goto cleanup;
97 pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
98 if (!pwszExpandedBuffer)
99 {
101 goto cleanup;
102 }
103 ExpandEnvironmentStringsW(pwszTempBuffer, pwszExpandedBuffer, cbData);
104 }
105 else
106 {
107 pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
108 memcpy(pwszExpandedBuffer, pwszTempBuffer, cbData);
109 }
110
111 /* If the value references a resource based string, parse the value and load the string.
112 * Else just copy over the original value. */
114 if (*pwszExpandedBuffer != L'@') /* '@' is the prefix for resource based string entries. */
115 {
116 lstrcpynW(pszOutBuf, pwszExpandedBuffer, cbOutBuf / sizeof(WCHAR));
117 }
118 else
119 {
120 WCHAR *pComma = wcsrchr(pwszExpandedBuffer, L',');
121 UINT uiStringId;
123
124 /* Format of the expanded value is 'path_to_dll,-resId' */
125 if (!pComma || pComma[1] != L'-')
126 {
128 goto cleanup;
129 }
130
131 uiStringId = _wtoi(pComma+2);
132 *pComma = L'\0';
133
134 hModule = LoadLibraryExW(pwszExpandedBuffer + 1, NULL, LOAD_LIBRARY_AS_DATAFILE);
135 if (!hModule || !load_string(hModule, uiStringId, pszOutBuf, cbOutBuf / sizeof(WCHAR)))
138 }
139
140cleanup:
141 HeapFree(GetProcessHeap(), 0, pwszTempBuffer);
142 HeapFree(GetProcessHeap(), 0, pwszExpandedBuffer);
143 return result;
144}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
HMODULE hModule
Definition: animate.c:44
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define wcsrchr
Definition: compat.h:16
#define HeapAlloc
Definition: compat.h:733
#define FreeLibrary(x)
Definition: compat.h:748
#define HeapFree(x, y, z)
Definition: compat.h:735
#define lstrcpynW
Definition: compat.h:738
static void cleanup(void)
Definition: main.c:1335
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
unsigned long DWORD
Definition: ntddk_ex.h:95
FxString * pString
FxAutoRegKey hKey
WDFMEMORY hMemory
GLuint64EXT * result
Definition: glext.h:11304
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
unsigned int UINT
Definition: ndis.h:50
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
#define RT_STRING
Definition: pedump.c:368
long LONG
Definition: pedump.c:60
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
#define HIWORD(l)
Definition: typedefs.h:247
#define OUT
Definition: typedefs.h:40
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
_In_ DWORD _Out_writes_bytes_to_opt_ pcbData void _Inout_ DWORD * pcbData
Definition: wincrypt.h:4950
#define ERROR_BADKEY
Definition: winerror.h:589
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185