ReactOS 0.4.15-dev-7934-g1dc8d80
vista.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: Copied from advapi32/reg/reg.c
5 * PURPOSE: Registry functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
7 * Thomas Weidenmueller <w3seek@reactos.com>
8 * UPDATE HISTORY:
9 * Created 01/11/98
10 * 19990309 EA Stubs
11 * 20050502 Fireball imported some stuff from WINE
12 */
13
14#include <stdarg.h>
15
16#define WIN32_NO_STATUS
17#define _INC_WINDOWS
18#define COM_NO_WINDOWS_H
19
20#include <windef.h>
21#include <winbase.h>
22#include <winreg.h>
23#include <winuser.h>
24#define NTOS_MODE_USER
25#include <ndk/rtlfuncs.h>
26
27#include <wine/debug.h>
28#include <wine/unicode.h>
29
31
32/******************************************************************************
33 * load_string [Internal]
34 *
35 * This is basically a copy of user32/resource.c's LoadStringW. Necessary to
36 * avoid importing user32, which is higher level than advapi32. Helper for
37 * RegLoadMUIString.
38 */
39static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
40{
42 HRSRC hResource;
44 int idxString;
45
46 /* Negative values have to be inverted. */
47 if (HIWORD(resId) == 0xffff)
48 resId = (UINT)(-((INT)resId));
49
50 /* Load the resource into memory and get a pointer to it. */
51 hResource = FindResourceW(hModule, MAKEINTRESOURCEW(LOWORD(resId >> 4) + 1), (LPWSTR)RT_STRING);
52 if (!hResource) return 0;
53 hMemory = LoadResource(hModule, hResource);
54 if (!hMemory) return 0;
56
57 /* Strings are length-prefixed. Lowest nibble of resId is an index. */
58 idxString = resId & 0xf;
59 while (idxString--) pString += *pString + 1;
60
61 /* If no buffer is given, return length of the string. */
62 if (!pwszBuffer) return *pString;
63
64 /* Else copy over the string, respecting the buffer size. */
65 cMaxChars = (*pString < cMaxChars) ? *pString : (cMaxChars - 1);
66 if (cMaxChars >= 0)
67 {
68 memcpy(pwszBuffer, pString+1, cMaxChars * sizeof(WCHAR));
69 pwszBuffer[cMaxChars] = L'\0';
70 }
71
72 return cMaxChars;
73}
74
75/************************************************************************
76 * RegLoadMUIStringW
77 *
78 * @implemented
79 */
82 IN LPCWSTR pszValue OPTIONAL,
83 OUT LPWSTR pszOutBuf,
84 IN DWORD cbOutBuf,
87 IN LPCWSTR pszDirectory OPTIONAL)
88{
89 DWORD dwValueType, cbData;
90 LPWSTR pwszTempBuffer = NULL, pwszExpandedBuffer = NULL;
92
93 /* Parameter sanity checks. */
94 if (!hKey || !pszOutBuf)
96
97 if (pszDirectory && *pszDirectory)
98 {
99 FIXME("BaseDir parameter not yet supported!\n");
101 }
102
103 /* Check for value existence and correctness of it's type, allocate a buffer and load it. */
104 result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, NULL, &cbData);
105 if (result != ERROR_SUCCESS) goto cleanup;
106 if (!(dwValueType == REG_SZ || dwValueType == REG_EXPAND_SZ) || !cbData)
107 {
109 goto cleanup;
110 }
111 pwszTempBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
112 if (!pwszTempBuffer)
113 {
115 goto cleanup;
116 }
117 result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, (LPBYTE)pwszTempBuffer, &cbData);
118 if (result != ERROR_SUCCESS) goto cleanup;
119
120 /* Expand environment variables, if appropriate, or copy the original string over. */
121 if (dwValueType == REG_EXPAND_SZ)
122 {
123 cbData = ExpandEnvironmentStringsW(pwszTempBuffer, NULL, 0) * sizeof(WCHAR);
124 if (!cbData) goto cleanup;
125 pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
126 if (!pwszExpandedBuffer)
127 {
129 goto cleanup;
130 }
131 ExpandEnvironmentStringsW(pwszTempBuffer, pwszExpandedBuffer, cbData);
132 }
133 else
134 {
135 pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
136 memcpy(pwszExpandedBuffer, pwszTempBuffer, cbData);
137 }
138
139 /* If the value references a resource based string, parse the value and load the string.
140 * Else just copy over the original value. */
142 if (*pwszExpandedBuffer != L'@') /* '@' is the prefix for resource based string entries. */
143 {
144 lstrcpynW(pszOutBuf, pwszExpandedBuffer, cbOutBuf / sizeof(WCHAR));
145 }
146 else
147 {
148 WCHAR *pComma = wcsrchr(pwszExpandedBuffer, L',');
149 UINT uiStringId;
151
152 /* Format of the expanded value is 'path_to_dll,-resId' */
153 if (!pComma || pComma[1] != L'-')
154 {
156 goto cleanup;
157 }
158
159 uiStringId = _wtoi(pComma+2);
160 *pComma = L'\0';
161
162 hModule = LoadLibraryExW(pwszExpandedBuffer + 1, NULL, LOAD_LIBRARY_AS_DATAFILE);
163 if (!hModule || !load_string(hModule, uiStringId, pszOutBuf, cbOutBuf / sizeof(WCHAR)))
166 }
167
168cleanup:
169 HeapFree(GetProcessHeap(), 0, pwszTempBuffer);
170 HeapFree(GetProcessHeap(), 0, pwszExpandedBuffer);
171 return result;
172}
173
174/************************************************************************
175 * RegLoadMUIStringA
176 *
177 * @implemented
178 */
181 IN LPCSTR pszValue OPTIONAL,
182 OUT LPSTR pszOutBuf,
183 IN DWORD cbOutBuf,
185 IN DWORD Flags,
186 IN LPCSTR pszDirectory OPTIONAL)
187{
188 UNICODE_STRING valueW, baseDirW;
189 WCHAR *pwszBuffer;
190 DWORD cbData = cbOutBuf * sizeof(WCHAR);
191 LONG result;
192
193 valueW.Buffer = baseDirW.Buffer = pwszBuffer = NULL;
194 if (!RtlCreateUnicodeStringFromAsciiz(&valueW, pszValue) ||
195 !RtlCreateUnicodeStringFromAsciiz(&baseDirW, pszDirectory) ||
196 !(pwszBuffer = HeapAlloc(GetProcessHeap(), 0, cbData)))
197 {
199 goto cleanup;
200 }
201
202 result = RegLoadMUIStringW(hKey, valueW.Buffer, pwszBuffer, cbData, NULL, Flags,
203 baseDirW.Buffer);
204
205 if (result == ERROR_SUCCESS)
206 {
207 cbData = WideCharToMultiByte(CP_ACP, 0, pwszBuffer, -1, pszOutBuf, cbOutBuf, NULL, NULL);
208 if (pcbData)
209 *pcbData = cbData;
210 }
211
212cleanup:
213 HeapFree(GetProcessHeap(), 0, pwszBuffer);
214 RtlFreeUnicodeString(&baseDirW);
216
217 return result;
218}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define FIXME(fmt,...)
Definition: debug.h:111
#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 CP_ACP
Definition: compat.h:109
#define HeapAlloc
Definition: compat.h:733
#define FreeLibrary(x)
Definition: compat.h:748
#define HeapFree(x, y, z)
Definition: compat.h:735
#define WideCharToMultiByte
Definition: compat.h:111
#define lstrcpynW
Definition: compat.h:738
static void cleanup(void)
Definition: main.c:1335
static const WCHAR valueW[]
Definition: object.c:48
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
unsigned int UINT
Definition: ndis.h:50
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#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
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: vista.c:39
LONG WINAPI 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: vista.c:81
LONG WINAPI RegLoadMUIStringA(IN HKEY hKey, IN LPCSTR pszValue OPTIONAL, OUT LPSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCSTR pszDirectory OPTIONAL)
Definition: vista.c:180
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 WINAPI
Definition: msvc.h:6
#define ERROR_BADKEY
Definition: winerror.h:589
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185