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>
11 #include "stringutils.h"
13 // HANDLE g_hHeap = GetProcessHeap();
14 #define g_hHeap GetProcessHeap()
18 MemInit(IN HANDLE Heap
)
20 /* Save the heap handle */
26 MemFree(IN PVOID lpMem
)
28 /* Free memory back into the heap */
29 return HeapFree(g_hHeap
, 0, lpMem
);
33 MemAlloc(IN DWORD dwFlags
,
36 /* Allocate memory from the heap */
37 return HeapAlloc(g_hHeap
, dwFlags
, dwBytes
);
41 FormatDateTime(IN LPSYSTEMTIME pDateTime
)
43 LPWSTR lpszDateTime
= NULL
;
44 int iDateBufSize
, iTimeBufSize
;
46 if (pDateTime
== NULL
) return NULL
;
48 iDateBufSize
= GetDateFormatW(LOCALE_USER_DEFAULT
,
49 /* Only for Windows 7 : DATE_AUTOLAYOUT | */ DATE_SHORTDATE
,
54 iTimeBufSize
= GetTimeFormatW(LOCALE_USER_DEFAULT
,
61 if ( (iDateBufSize
> 0) && (iTimeBufSize
> 0) )
63 lpszDateTime
= (LPWSTR
)MemAlloc(0, (iDateBufSize
+ iTimeBufSize
) * sizeof(WCHAR
));
65 GetDateFormatW(LOCALE_USER_DEFAULT
,
66 /* Only for Windows 7 : DATE_AUTOLAYOUT | */ DATE_SHORTDATE
,
71 if (iDateBufSize
> 0) lpszDateTime
[iDateBufSize
-1] = L
' ';
72 GetTimeFormatW(LOCALE_USER_DEFAULT
,
76 lpszDateTime
+ iDateBufSize
,
84 FreeDateTime(IN LPWSTR lpszDateTime
)
87 MemFree(lpszDateTime
);
91 LoadResourceStringEx(IN HINSTANCE hInstance
,
93 OUT
size_t* pSize OPTIONAL
)
95 LPWSTR lpszDestBuf
= NULL
, lpszResourceString
= NULL
;
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);
102 if ( lpszResourceString
&& ( (lpszDestBuf
= (LPWSTR
)MemAlloc(0, (iStrSize
+ 1) * sizeof(WCHAR
))) != NULL
) )
104 wcsncpy(lpszDestBuf
, lpszResourceString
, iStrSize
);
105 lpszDestBuf
[iStrSize
] = L
'\0'; // NULL-terminate the string
108 *pSize
= iStrSize
+ 1;
120 LoadConditionalResourceStringEx(IN HINSTANCE hInstance
,
124 IN
size_t* pSize OPTIONAL
)
126 return LoadResourceStringEx(hInstance
,
127 (bCondition
? uIDifTrue
: uIDifFalse
),
132 RunCommand(IN LPCWSTR lpszCommand
,
133 IN LPCWSTR lpszParameters
,
139 LPWSTR lpszExpandedCommand
;
141 dwNumOfChars
= ExpandEnvironmentStringsW(lpszCommand
, NULL
, 0);
142 lpszExpandedCommand
= (LPWSTR
)MemAlloc(0, dwNumOfChars
* sizeof(WCHAR
));
143 ExpandEnvironmentStringsW(lpszCommand
, lpszExpandedCommand
, dwNumOfChars
);
145 dwRes
= (DWORD_PTR
)ShellExecuteW(NULL
,
146 NULL
/* and not L"open" !! */,
151 MemFree(lpszExpandedCommand
);
157 //////////////////// The following comes from MSDN samples ///////////////////
158 // https://msdn.microsoft.com/en-us/library/windows/desktop/dd162826(v=vs.85).aspx
162 // ClipOrCenterRectToMonitor
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.
170 // This shows how you use the multi-monitor functions
171 // to do the same thing.
173 VOID
ClipOrCenterRectToMonitor(LPRECT prc
, UINT flags
)
178 int w
= prc
->right
- prc
->left
;
179 int h
= prc
->bottom
- prc
->top
;
182 // Get the nearest monitor to the passed rect.
184 hMonitor
= MonitorFromRect(prc
, MONITOR_DEFAULTTONEAREST
);
187 // Get the work area or entire monitor rect.
189 mi
.cbSize
= sizeof(mi
);
190 GetMonitorInfo(hMonitor
, &mi
);
192 if (flags
& MONITOR_WORKAREA
)
198 // Center or clip the passed rect to the monitor rect.
200 if (flags
& MONITOR_CENTER
)
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
;
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
;
216 VOID
ClipOrCenterWindowToMonitor(HWND hWnd
, UINT flags
)
219 GetWindowRect(hWnd
, &rc
);
220 ClipOrCenterRectToMonitor(&rc
, flags
);
221 SetWindowPos(hWnd
, NULL
, rc
.left
, rc
.top
, 0, 0, SWP_NOSIZE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
223 ////////////////////////////////////////////////////////////////////////////////
226 BOOL
IsWindowsOS(VOID
)
228 BOOL bIsWindowsOS
= FALSE
;
230 OSVERSIONINFOW osvi
= {0};
231 osvi
.dwOSVersionInfoSize
= sizeof(osvi
);
233 if (!GetVersionExW(&osvi
))
236 if (osvi
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
)
239 /* ReactOS reports as Windows NT 5.2 */
241 if ( (osvi
.dwMajorVersion
== 5 && osvi
.dwMinorVersion
>= 2) ||
242 (osvi
.dwMajorVersion
> 5) )
246 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
247 L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
248 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
251 DWORD dwType
= 0, dwBufSize
= 0;
253 ret
= RegQueryValueExW(hKey
, L
"ProductName", NULL
, &dwType
, NULL
, &dwBufSize
);
254 if (ret
== ERROR_SUCCESS
&& dwType
== REG_SZ
)
256 LPTSTR lpszProductName
= (LPTSTR
)MemAlloc(0, dwBufSize
);
257 RegQueryValueExW(hKey
, L
"ProductName", NULL
, &dwType
, (LPBYTE
)lpszProductName
, &dwBufSize
);
259 bIsWindowsOS
= (FindSubStrI(lpszProductName
, _T("Windows")) != NULL
);
261 MemFree(lpszProductName
);
275 BOOL
IsPreVistaOSVersion(VOID
)
277 OSVERSIONINFOW osvi
= {0};
278 osvi
.dwOSVersionInfoSize
= sizeof(osvi
);
280 if (!GetVersionExW(&osvi
))
283 /* Vista+-class OSes are NT >= 6 */
284 return ( (osvi
.dwPlatformId
== VER_PLATFORM_WIN32_NT
) ? (osvi
.dwMajorVersion
< 6) : FALSE
);
288 GetExecutableVendor(IN LPCWSTR lpszFilename
)
290 LPWSTR lpszVendor
= NULL
;
296 LPVOID pvData
= NULL
;
298 WORD wCodePage
= 0, wLangID
= 0;
299 LPWSTR lpszStrFileInfo
= NULL
;
301 LPWSTR lpszData
= NULL
;
303 if (lpszFilename
== NULL
) return NULL
;
305 dwLen
= GetFileVersionInfoSizeW(lpszFilename
, &dwHandle
);
306 if (dwLen
== 0) return NULL
;
308 lpData
= MemAlloc(0, dwLen
);
309 if (!lpData
) return NULL
;
311 GetFileVersionInfoW(lpszFilename
, dwHandle
, dwLen
, lpData
);
313 if (VerQueryValueW(lpData
, L
"\\VarFileInfo\\Translation", &pvData
, &BufLen
))
315 wCodePage
= LOWORD(*(DWORD
*)pvData
);
316 wLangID
= HIWORD(*(DWORD
*)pvData
);
318 lpszStrFileInfo
= FormatString(L
"StringFileInfo\\%04X%04X\\CompanyName",
323 VerQueryValueW(lpData
, lpszStrFileInfo
, (LPVOID
*)&lpszData
, &BufLen
);
326 lpszVendor
= (LPWSTR
)MemAlloc(0, BufLen
* sizeof(WCHAR
));
328 wcscpy(lpszVendor
, lpszData
);
335 MemFree(lpszStrFileInfo
);