ReactOS  0.4.15-dev-5496-g599ba9c
vista.c File Reference
#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <winreg.h>
#include <winuser.h>
#include <ndk/rtlfuncs.h>
#include <wine/debug.h>
#include <wine/unicode.h>
Include dependency graph for vista.c:

Go to the source code of this file.

Macros

#define WIN32_NO_STATUS
 
#define _INC_WINDOWS
 
#define COM_NO_WINDOWS_H
 
#define NTOS_MODE_USER
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
static int load_string (HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
 
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)
 
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)
 

Macro Definition Documentation

◆ _INC_WINDOWS

#define _INC_WINDOWS

Definition at line 17 of file vista.c.

◆ COM_NO_WINDOWS_H

#define COM_NO_WINDOWS_H

Definition at line 18 of file vista.c.

◆ NTOS_MODE_USER

#define NTOS_MODE_USER

Definition at line 24 of file vista.c.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 16 of file vista.c.

Function Documentation

◆ load_string()

static int load_string ( HINSTANCE  hModule,
UINT  resId,
LPWSTR  pwszBuffer,
INT  cMaxChars 
)
static

Definition at line 39 of file vista.c.

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 }
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
int32_t INT
Definition: typedefs.h:58
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
#define L(x)
Definition: ntvdm.h:50
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define RT_STRING
Definition: pedump.c:368
WDFMEMORY hMemory
FxString * pString
unsigned int UINT
Definition: ndis.h:50
#define HIWORD(l)
Definition: typedefs.h:247
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define LOWORD(l)
Definition: pedump.c:82
HMODULE hModule
Definition: animate.c:44

Referenced by RegLoadMUIStringW().

◆ RegLoadMUIStringA()

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 at line 180 of file vista.c.

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_SUCCESS
Definition: deptool.c:10
#define WideCharToMultiByte
Definition: compat.h:111
GLuint64EXT * result
Definition: glext.h:11304
#define CP_ACP
Definition: compat.h:109
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
long LONG
Definition: pedump.c:60
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
static const WCHAR valueW[]
Definition: object.c:48
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define GetProcessHeap()
Definition: compat.h:736
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
FxAutoRegKey hKey
#define NULL
Definition: types.h:112
char * cleanup(char *str)
Definition: wpickclick.c:99
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 HeapFree(x, y, z)
Definition: compat.h:735
_In_ DWORD _Out_writes_bytes_to_opt_ pcbData void _Inout_ DWORD * pcbData
Definition: wincrypt.h:4949

◆ RegLoadMUIStringW()

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 at line 81 of file vista.c.

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 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_SUCCESS
Definition: deptool.c:10
GLuint64EXT * result
Definition: glext.h:11304
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
#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
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define FreeLibrary(x)
Definition: compat.h:748
#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
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ERROR_BADKEY
Definition: winerror.h:589
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define wcsrchr
Definition: compat.h:16
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: vista.c:39
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
char * cleanup(char *str)
Definition: wpickclick.c:99
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:735
HMODULE hModule
Definition: animate.c:44
#define REG_SZ
Definition: layer.c:22

Referenced by CDefaultContextMenu::AddStaticContextMenusToMenu(), FileTypesDlg_InsertToLV(), HCR_GetClassNameW(), HCR_MapTypeToValueW(), LoadClassicColorSchemes(), LoadSchemeSizes(), and RegLoadMUIStringA().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )