ReactOS  0.4.15-dev-5496-g599ba9c
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  */
39 static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
40 {
42  HRSRC hResource;
43  WCHAR *pString;
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,
86  IN DWORD Flags,
87  IN LPCWSTR pszDirectory OPTIONAL)
88 {
89  DWORD dwValueType, cbData;
90  LPWSTR pwszTempBuffer = NULL, pwszExpandedBuffer = NULL;
91  LONG result;
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 
168 cleanup:
169  HeapFree(GetProcessHeap(), 0, pwszTempBuffer);
170  HeapFree(GetProcessHeap(), 0, pwszExpandedBuffer);
171  return result;
172 }
173 
174 /************************************************************************
175  * RegLoadMUIStringA
176  *
177  * @implemented
178  */
179 LONG WINAPI
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 
212 cleanup:
213  HeapFree(GetProcessHeap(), 0, pwszBuffer);
214  RtlFreeUnicodeString(&baseDirW);
216 
217  return result;
218 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define IN
Definition: typedefs.h:39
#define ERROR_SUCCESS
Definition: deptool.c:10
#define WideCharToMultiByte
Definition: compat.h:111
GLuint64EXT * result
Definition: glext.h:11304
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define CP_ACP
Definition: compat.h:109
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
WINE_DEFAULT_DEBUG_CHANNEL(shell)
char * LPSTR
Definition: xmlstorage.h:182
int32_t INT
Definition: typedefs.h:58
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
#define lstrcpynW
Definition: compat.h:738
#define L(x)
Definition: ntvdm.h:50
unsigned char * LPBYTE
Definition: typedefs.h:53
long LONG
Definition: pedump.c:60
#define FIXME(fmt,...)
Definition: debug.h:111
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
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
static const WCHAR valueW[]
Definition: object.c:48
const char * LPCSTR
Definition: xmlstorage.h:183
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define FreeLibrary(x)
Definition: compat.h:748
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define GetProcessHeap()
Definition: compat.h:736
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4120
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define ERROR_BADKEY
Definition: winerror.h:589
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define RT_STRING
Definition: pedump.c:368
#define wcsrchr
Definition: compat.h:16
WDFMEMORY hMemory
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
FxString * pString
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: vista.c:39
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
FxAutoRegKey hKey
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
#define OUT
Definition: typedefs.h:40
uint32_t * LPDWORD
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
char * cleanup(char *str)
Definition: wpickclick.c:99
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
WCHAR * LPWSTR
Definition: xmlstorage.h:184
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
#define LOWORD(l)
Definition: pedump.c:82
#define HeapFree(x, y, z)
Definition: compat.h:735
_In_ DWORD _Out_writes_bytes_to_opt_ pcbData void _Inout_ DWORD * pcbData
Definition: wincrypt.h:4949
HMODULE hModule
Definition: animate.c:44
#define REG_SZ
Definition: layer.c:22
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68