ReactOS 0.4.15-dev-6068-g8061a6f
util.cpp
Go to the documentation of this file.
1#include "precomp.h"
2#include <winver.h>
3
4typedef struct _LANGCODEPAGE
5{
9
12{
13 HRESULT hRet;
14
15 hRet = punk1->QueryInterface(IID_PPV_ARG(IUnknown, &punk1));
16 if (!SUCCEEDED(hRet))
17 return hRet;
18
19 hRet = punk2->QueryInterface(IID_PPV_ARG(IUnknown, &punk2));
20
21 punk1->Release();
22
23 if (!SUCCEEDED(hRet))
24 return hRet;
25
26 punk2->Release();
27
28 /* We're dealing with the same object if the IUnknown pointers are equal */
29 return (punk1 == punk2) ? S_OK : S_FALSE;
30}
31
34 IN LPCWSTR lpMenuName)
35{
36 HMENU hMenu, hSubMenu = NULL;
37
38 hMenu = LoadMenuW(hInstance, lpMenuName);
39 if (hMenu != NULL)
40 {
41 hSubMenu = GetSubMenu(hMenu, 0);
42 if ((hSubMenu != NULL) &&
43 !RemoveMenu(hMenu, 0, MF_BYPOSITION))
44 {
45 hSubMenu = NULL;
46 }
47
48 DestroyMenu(hMenu);
49 }
50
51 return hSubMenu;
52}
53
56 IN UINT uItem,
57 IN BOOL fByPosition)
58{
59 MENUITEMINFOW mii;
60
61 mii.cbSize = sizeof(mii);
62 mii.fMask = MIIM_SUBMENU;
63
64 if (GetMenuItemInfoW(hMenu, uItem, fByPosition, &mii))
65 {
66 return mii.hSubMenu;
67 }
68
69 return NULL;
70}
71
72BOOL
74 IN DWORD dwBufferSize)
75{
76 DWORD dwType;
78
79 /* Query the user name from the registry */
80 dwSize = (dwBufferSize * sizeof(WCHAR)) - 1;
82 L"Logon User Name",
83 0,
84 &dwType,
85 (LPBYTE)szBuffer,
86 &dwSize) == ERROR_SUCCESS &&
87 (dwSize / sizeof(WCHAR)) > 1 &&
88 szBuffer[0] != L'\0')
89 {
90 szBuffer[dwSize / sizeof(WCHAR)] = L'\0';
91 return TRUE;
92 }
93
94 /* Fall back to GetUserName() */
95 dwSize = dwBufferSize;
96 if (!GetUserNameW(szBuffer, &dwSize))
97 {
98 szBuffer[0] = L'\0';
99 return FALSE;
100 }
101
102 return TRUE;
103}
104
105BOOL
107 IN UINT uPosition,
108 IN UINT uFlags,
109 ...)
110{
111 va_list vl;
112 MENUITEMINFOW mii;
113 WCHAR szBuf[128];
114 WCHAR szBufFmt[128];
115
116 /* Find the menu item and read the formatting string */
117 mii.cbSize = sizeof(mii);
118 mii.fMask = MIIM_STRING;
119 mii.dwTypeData = szBufFmt;
120 mii.cch = _countof(szBufFmt);
121 if (GetMenuItemInfoW(hMenu, uPosition, uFlags, &mii))
122 {
123 /* Format the string */
124 va_start(vl, uFlags);
125 _vsntprintf(szBuf,
126 _countof(szBuf) - 1,
127 szBufFmt,
128 vl);
129 va_end(vl);
130 szBuf[_countof(szBuf) - 1] = L'\0';
131
132 /* Update the menu item */
133 mii.dwTypeData = szBuf;
134 if (SetMenuItemInfo(hMenu, uPosition, uFlags, &mii))
135 {
136 return TRUE;
137 }
138 }
139
140 return FALSE;
141}
142
143BOOL
145 IN LPCWSTR lpSubKey,
146 IN LPCWSTR lpValue)
147{
148 WCHAR szBuffer[MAX_PATH];
149 HKEY hkSubKey;
150 DWORD dwType, dwSize;
151 BOOL Ret = FALSE;
152
153 StringCbCopyW(szBuffer, sizeof(szBuffer),
154 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer");
155 if (FAILED_UNEXPECTEDLY(StringCbCatW(szBuffer, sizeof(szBuffer), L"\\")))
156 return FALSE;
157 if (FAILED_UNEXPECTEDLY(StringCbCatW(szBuffer, sizeof(szBuffer), lpSubKey)))
158 return FALSE;
159
160 dwSize = sizeof(szBuffer);
162 szBuffer,
163 0,
165 &hkSubKey) == ERROR_SUCCESS)
166 {
167 ZeroMemory(szBuffer, sizeof(szBuffer));
168
169 if (RegQueryValueExW(hkSubKey,
170 lpValue,
171 0,
172 &dwType,
173 (LPBYTE)szBuffer,
175 {
176 if ((dwType == REG_DWORD) && (dwSize == sizeof(DWORD)))
177 Ret = *((PDWORD)szBuffer) != 0;
178 else if (dwSize > 0)
179 Ret = *((PWCHAR)szBuffer) != 0;
180 }
181
182 RegCloseKey(hkSubKey);
183 }
184 return Ret;
185}
186
187BOOL
189 IN LPCWSTR szVersionInfo,
190 OUT LPWSTR szBuffer,
191 IN UINT cbBufLen)
192{
193 LPVOID lpData = NULL;
194 WCHAR szSubBlock[128];
195 WCHAR *lpszLocalBuf = NULL;
196 LANGID UserLangId;
197 PLANGCODEPAGE lpTranslate = NULL;
198 DWORD dwLen;
199 DWORD dwHandle;
200 UINT cbTranslate;
201 UINT cbLen;
202 BOOL bRet = FALSE;
203 UINT i;
204
205 dwLen = GetFileVersionInfoSizeW(szFileName, &dwHandle);
206
207 if (dwLen > 0)
208 {
209 lpData = HeapAlloc(hProcessHeap, 0, dwLen);
210
211 if (lpData != NULL)
212 {
213 if (GetFileVersionInfoW(szFileName,
214 0,
215 dwLen,
216 lpData) != 0)
217 {
218 UserLangId = GetUserDefaultLangID();
219
220 VerQueryValueW(lpData,
221 L"\\VarFileInfo\\Translation",
222 (LPVOID*)&lpTranslate,
223 &cbTranslate);
224
225 for (i = 0; i < cbTranslate / sizeof(LANGCODEPAGE); i++)
226 {
227 /* If the bottom eight bits of the language id's
228 match, use this version information (since this
229 means that the version information and the users
230 default language are the same). */
231 if (LOBYTE(lpTranslate[i].wLanguage) == LOBYTE(UserLangId))
232 {
233 wnsprintf(szSubBlock,
234 _countof(szSubBlock),
235 L"\\StringFileInfo\\%04X%04X\\%s",
236 lpTranslate[i].wLanguage,
237 lpTranslate[i].wCodePage,
238 szVersionInfo);
239
240 if (VerQueryValueW(lpData,
241 szSubBlock,
242 (LPVOID*)&lpszLocalBuf,
243 &cbLen) != 0)
244 {
245 wcsncpy(szBuffer, lpszLocalBuf, cbBufLen / sizeof(*szBuffer));
246
247 bRet = TRUE;
248 break;
249 }
250 }
251 }
252 }
253
254 HeapFree(hProcessHeap, 0, lpData);
255 lpData = NULL;
256 }
257 }
258
259 return bRet;
260}
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
HKEY hkExplorer
Definition: explorer.cpp:26
#define RegCloseKey(hKey)
Definition: registry.h:47
HINSTANCE hInstance
Definition: charmap.c:19
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3353
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4118
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
UINT uFlags
Definition: api.c:59
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
BOOL WINAPI GetFileVersionInfoW(LPCWSTR filename, DWORD handle, DWORD datasize, LPVOID data)
Definition: version.c:845
BOOL WINAPI VerQueryValueW(LPCVOID pBlock, LPCWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen)
Definition: version.c:1049
DWORD WINAPI GetFileVersionInfoSizeW(LPCWSTR filename, LPDWORD handle)
Definition: version.c:611
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
FxAutoRegKey hKey
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define LOBYTE(W)
Definition: jmemdos.c:487
HANDLE hProcessHeap
Definition: kbswitch.c:43
LANGID WINAPI GetUserDefaultLangID(void)
Definition: lang.c:738
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
unsigned int UINT
Definition: ndis.h:50
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define L(x)
Definition: ntvdm.h:50
DWORD * PDWORD
Definition: pedump.c:68
#define REG_DWORD
Definition: sdbapi.c:596
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
#define wnsprintf
Definition: shlwapi.h:1701
#define _countof(array)
Definition: sndvol32.h:68
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
WORD wCodePage
Definition: util.cpp:7
WORD wLanguage
Definition: util.cpp:6
LPWSTR dwTypeData
Definition: winuser.h:3259
WORD LANGID
Definition: typedefs.h:81
unsigned char * LPBYTE
Definition: typedefs.h:53
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
#define OUT
Definition: typedefs.h:40
HMENU FindSubMenu(IN HMENU hMenu, IN UINT uItem, IN BOOL fByPosition)
Definition: util.cpp:55
BOOL FormatMenuString(IN HMENU hMenu, IN UINT uPosition, IN UINT uFlags,...)
Definition: util.cpp:106
struct _LANGCODEPAGE * PLANGCODEPAGE
BOOL GetVersionInfoString(IN LPCWSTR szFileName, IN LPCWSTR szVersionInfo, OUT LPWSTR szBuffer, IN UINT cbBufLen)
Definition: util.cpp:188
HMENU LoadPopupMenu(IN HINSTANCE hInstance, IN LPCWSTR lpMenuName)
Definition: util.cpp:33
BOOL GetCurrentLoggedOnUserName(OUT LPWSTR szBuffer, IN DWORD dwBufferSize)
Definition: util.cpp:73
HRESULT IsSameObject(IN IUnknown *punk1, IN IUnknown *punk2)
Definition: util.cpp:11
struct _LANGCODEPAGE LANGCODEPAGE
BOOL GetExplorerRegValueSet(IN HKEY hKey, IN LPCWSTR lpSubKey, IN LPCWSTR lpValue)
Definition: util.cpp:144
#define ZeroMemory
Definition: winbase.h:1670
#define S_FALSE
Definition: winerror.h:2357
#define MIIM_STRING
Definition: winuser.h:722
#define SetMenuItemInfo
Definition: winuser.h:5840
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define MIIM_SUBMENU
Definition: winuser.h:718
#define MF_BYPOSITION
Definition: winuser.h:203
BOOL WINAPI RemoveMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define _vsntprintf
Definition: xmlstorage.h:203
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185