ReactOS 0.4.16-dev-92-g0c2cdca
utils.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Applications
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/msconfig_new/utils.c
5 * PURPOSE: Memory Management, Resources, ... Utility Functions
6 * COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
7 */
8
9#include "precomp.h"
10#include "utils.h"
11#include "stringutils.h"
12
13// HANDLE g_hHeap = GetProcessHeap();
14#define g_hHeap GetProcessHeap()
15
16#if 0
17VOID
18MemInit(IN HANDLE Heap)
19{
20 /* Save the heap handle */
21 g_hHeap = Heap;
22}
23#endif
24
25BOOL
27{
28 /* Free memory back into the heap */
29 return HeapFree(g_hHeap, 0, lpMem);
30}
31
34 IN SIZE_T dwBytes)
35{
36 /* Allocate memory from the heap */
37 return HeapAlloc(g_hHeap, dwFlags, dwBytes);
38}
39
42{
43 LPWSTR lpszDateTime = NULL;
44 int iDateBufSize, iTimeBufSize;
45
46 if (pDateTime == NULL) return NULL;
47
49 /* Only for Windows 7 : DATE_AUTOLAYOUT | */ DATE_SHORTDATE,
50 pDateTime,
51 NULL,
52 NULL,
53 0);
55 0,
56 pDateTime,
57 NULL,
58 NULL,
59 0);
60
61 if ( (iDateBufSize > 0) && (iTimeBufSize > 0) )
62 {
63 lpszDateTime = (LPWSTR)MemAlloc(0, (iDateBufSize + iTimeBufSize) * sizeof(WCHAR));
64
66 /* Only for Windows 7 : DATE_AUTOLAYOUT | */ DATE_SHORTDATE,
67 pDateTime,
68 NULL,
69 lpszDateTime,
70 iDateBufSize);
71 if (iDateBufSize > 0) lpszDateTime[iDateBufSize-1] = L' ';
73 0,
74 pDateTime,
75 NULL,
76 lpszDateTime + iDateBufSize,
77 iTimeBufSize);
78 }
79
80 return lpszDateTime;
81}
82
83VOID
84FreeDateTime(IN LPWSTR lpszDateTime)
85{
86 if (lpszDateTime)
87 MemFree(lpszDateTime);
88}
89
92 IN UINT uID,
93 OUT size_t* pSize OPTIONAL)
94{
95 LPWSTR lpszDestBuf = NULL, lpszResourceString = NULL;
96 size_t iStrSize = 0;
97
98 // When passing a zero-length buffer size, LoadString(...) returns a
99 // read-only pointer buffer to the program's resource string.
100 iStrSize = LoadStringW(hInstance, uID, (LPWSTR)&lpszResourceString, 0);
101
102 if ( lpszResourceString && ( (lpszDestBuf = (LPWSTR)MemAlloc(0, (iStrSize + 1) * sizeof(WCHAR))) != NULL ) )
103 {
104 wcsncpy(lpszDestBuf, lpszResourceString, iStrSize);
105 lpszDestBuf[iStrSize] = L'\0'; // NULL-terminate the string
106
107 if (pSize)
108 *pSize = iStrSize + 1;
109 }
110 else
111 {
112 if (pSize)
113 *pSize = 0;
114 }
115
116 return lpszDestBuf;
117}
118
119LPWSTR
121 IN BOOL bCondition,
122 IN UINT uIDifTrue,
123 IN UINT uIDifFalse,
124 IN size_t* pSize OPTIONAL)
125{
127 (bCondition ? uIDifTrue : uIDifFalse),
128 pSize);
129}
130
131DWORD
133 IN LPCWSTR lpszParameters,
134 IN INT nShowCmd)
135{
136 DWORD dwRes;
137
138 DWORD dwNumOfChars;
139 LPWSTR lpszExpandedCommand;
140
141 dwNumOfChars = ExpandEnvironmentStringsW(lpszCommand, NULL, 0);
142 lpszExpandedCommand = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
143 ExpandEnvironmentStringsW(lpszCommand, lpszExpandedCommand, dwNumOfChars);
144
146 NULL /* and not L"open" !! */,
147 lpszExpandedCommand,
148 lpszParameters,
149 NULL,
150 nShowCmd);
151 MemFree(lpszExpandedCommand);
152
153 return dwRes;
154}
155
156
158// https://msdn.microsoft.com/en-us/library/windows/desktop/dd162826(v=vs.85).aspx
159//
160
161//
162// ClipOrCenterRectToMonitor
163//
164// The most common problem apps have when running on a
165// multimonitor system is that they "clip" or "pin" windows
166// based on the SM_CXSCREEN and SM_CYSCREEN system metrics.
167// Because of app compatibility reasons these system metrics
168// return the size of the primary monitor.
169//
170// This shows how you use the multi-monitor functions
171// to do the same thing.
172//
174{
175 HMONITOR hMonitor;
177 RECT rc;
178 int w = prc->right - prc->left;
179 int h = prc->bottom - prc->top;
180
181 //
182 // Get the nearest monitor to the passed rect.
183 //
184 hMonitor = MonitorFromRect(prc, MONITOR_DEFAULTTONEAREST);
185
186 //
187 // Get the work area or entire monitor rect.
188 //
189 mi.cbSize = sizeof(mi);
190 GetMonitorInfo(hMonitor, &mi);
191
193 rc = mi.rcWork;
194 else
195 rc = mi.rcMonitor;
196
197 //
198 // Center or clip the passed rect to the monitor rect.
199 //
200 if (flags & MONITOR_CENTER)
201 {
202 prc->left = rc.left + (rc.right - rc.left - w) / 2;
203 prc->top = rc.top + (rc.bottom - rc.top - h) / 2;
204 prc->right = prc->left + w;
205 prc->bottom = prc->top + h;
206 }
207 else
208 {
209 prc->left = max(rc.left, min(rc.right-w, prc->left));
210 prc->top = max(rc.top, min(rc.bottom-h, prc->top));
211 prc->right = prc->left + w;
212 prc->bottom = prc->top + h;
213 }
214}
215
217{
218 RECT rc;
219 GetWindowRect(hWnd, &rc);
222}
224
225
227{
228 BOOL bIsWindowsOS = FALSE;
229
230 OSVERSIONINFOW osvi = {0};
231 osvi.dwOSVersionInfoSize = sizeof(osvi);
232
233 if (!GetVersionExW(&osvi))
234 return FALSE;
235
237 return FALSE;
238
239 /* ReactOS reports as Windows NT 5.2 */
240
241 if ( (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 2) ||
242 (osvi.dwMajorVersion > 5) )
243 {
244 HKEY hKey = NULL;
245
247 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
249 {
250 LONG ret;
251 DWORD dwType = 0, dwBufSize = 0;
252
253 ret = RegQueryValueExW(hKey, L"ProductName", NULL, &dwType, NULL, &dwBufSize);
254 if (ret == ERROR_SUCCESS && dwType == REG_SZ)
255 {
256 LPTSTR lpszProductName = (LPTSTR)MemAlloc(0, dwBufSize);
257 RegQueryValueExW(hKey, L"ProductName", NULL, &dwType, (LPBYTE)lpszProductName, &dwBufSize);
258
259 bIsWindowsOS = (FindSubStrI(lpszProductName, _T("Windows")) != NULL);
260
261 MemFree(lpszProductName);
262 }
263
265 }
266 }
267 else
268 {
269 bIsWindowsOS = TRUE;
270 }
271
272 return bIsWindowsOS;
273}
274
276{
277 OSVERSIONINFOW osvi = {0};
278 osvi.dwOSVersionInfoSize = sizeof(osvi);
279
280 if (!GetVersionExW(&osvi))
281 return FALSE;
282
283 /* Vista+-class OSes are NT >= 6 */
285}
286
287LPWSTR
289{
290 LPWSTR lpszVendor = NULL;
291 DWORD dwHandle = 0;
292 DWORD dwLen;
293
294 LPVOID lpData;
295
297 UINT BufLen = 0;
298 WORD wCodePage = 0, wLangID = 0;
299 LPWSTR lpszStrFileInfo = NULL;
300
301 LPWSTR lpszData = NULL;
302
303 if (lpszFilename == NULL) return NULL;
304
305 dwLen = GetFileVersionInfoSizeW(lpszFilename, &dwHandle);
306 if (dwLen == 0) return NULL;
307
308 lpData = MemAlloc(0, dwLen);
309 if (!lpData) return NULL;
310
311 GetFileVersionInfoW(lpszFilename, dwHandle, dwLen, lpData);
312
313 if (VerQueryValueW(lpData, L"\\VarFileInfo\\Translation", &pvData, &BufLen))
314 {
315 wCodePage = LOWORD(*(DWORD*)pvData);
316 wLangID = HIWORD(*(DWORD*)pvData);
317
318 lpszStrFileInfo = FormatString(L"StringFileInfo\\%04X%04X\\CompanyName",
319 wCodePage,
320 wLangID);
321 }
322
323 VerQueryValueW(lpData, lpszStrFileInfo, (LPVOID*)&lpszData, &BufLen);
324 if (lpszData)
325 {
326 lpszVendor = (LPWSTR)MemAlloc(0, BufLen * sizeof(WCHAR));
327 if (lpszVendor)
328 wcscpy(lpszVendor, lpszData);
329 }
330 else
331 {
332 lpszVendor = NULL;
333 }
334
335 MemFree(lpszStrFileInfo);
336 MemFree(lpData);
337
338 return lpszVendor;
339}
HWND hWnd
Definition: settings.c:17
LPWSTR LoadConditionalResourceStringEx(IN HINSTANCE hInstance, IN BOOL bCondition, IN UINT uIDifTrue, IN UINT uIDifFalse, IN size_t *pSize OPTIONAL)
Definition: utils.c:120
LPWSTR LoadResourceStringEx(IN HINSTANCE hInstance, IN UINT uID, OUT size_t *pSize OPTIONAL)
Definition: utils.c:91
VOID ClipOrCenterWindowToMonitor(HWND hWnd, UINT flags)
Definition: utils.c:216
VOID ClipOrCenterRectToMonitor(LPRECT prc, UINT flags)
Definition: utils.c:173
DWORD RunCommand(IN LPCWSTR lpszCommand, IN LPCWSTR lpszParameters, IN INT nShowCmd)
Definition: utils.c:132
BOOL IsPreVistaOSVersion(VOID)
Definition: utils.c:275
LPWSTR FormatDateTime(IN LPSYSTEMTIME pDateTime)
Definition: utils.c:41
BOOL MemFree(IN PVOID lpMem)
Definition: utils.c:26
VOID FreeDateTime(IN LPWSTR lpszDateTime)
Definition: utils.c:84
#define g_hHeap
Definition: utils.c:14
BOOL IsWindowsOS(VOID)
Definition: utils.c:226
PVOID MemAlloc(IN DWORD dwFlags, IN SIZE_T dwBytes)
Definition: utils.c:33
LPWSTR GetExecutableVendor(IN LPCWSTR lpszFilename)
Definition: utils.c:288
#define MONITOR_CENTER
Definition: utils.h:67
#define MONITOR_WORKAREA
Definition: utils.h:69
VOID WINAPI MemInit(_In_ HANDLE Heap)
Definition: globals.c:58
#define RegCloseKey(hKey)
Definition: registry.h:49
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:3333
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
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
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
#define BufLen
Definition: fatfs.h:167
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
DWORD FormatString(DWORD dwFlags, HINSTANCE hInstance, DWORD dwStringId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, va_list *Arguments)
Definition: fontview.c:34
FxAutoRegKey hKey
GLbitfield flags
Definition: glext.h:7161
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define REG_SZ
Definition: layer.c:22
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1093
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:993
#define min(a, b)
Definition: monoChain.cc:55
HMONITOR WINAPI MonitorFromRect(LPCRECT, DWORD)
unsigned int UINT
Definition: ndis.h:50
#define VER_PLATFORM_WIN32_NT
Definition: rtltypes.h:238
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define LOCALE_USER_DEFAULT
_Out_ LPRECT prc
Definition: ntgdi.h:1658
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2482
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
LPTSTR FindSubStrI(LPCTSTR str, LPCTSTR strSearch)
Definition: stringutils.c:183
ULONG dwPlatformId
Definition: rtltypes.h:241
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:237
ULONG dwMajorVersion
Definition: rtltypes.h:238
ULONG dwMinorVersion
Definition: rtltypes.h:239
RECT rcMonitor
Definition: winuser.h:3788
DWORD cbSize
Definition: winuser.h:3787
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#define max(a, b)
Definition: svc.c:63
#define DWORD_PTR
Definition: treelist.c:76
unsigned char * LPBYTE
Definition: typedefs.h:53
ULONG_PTR SIZE_T
Definition: typedefs.h:80
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
OSVERSIONINFO osvi
Definition: ver.c:28
#define _T(x)
Definition: vfdio.h:22
int ret
static MONITORINFO mi
Definition: win.c:7338
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ ULONG _In_opt_ PVOID pvData
Definition: winddi.h:3749
#define DATE_SHORTDATE
Definition: winnls.h:196
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define GetMonitorInfo
Definition: winuser.h:5803
#define SWP_NOACTIVATE
Definition: winuser.h:1245
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOSIZE
Definition: winuser.h:1248
#define SWP_NOZORDER
Definition: winuser.h:1250
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
CHAR * LPTSTR
Definition: xmlstorage.h:192
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185