mirror of
https://github.com/reactos/reactos.git
synced 2025-08-07 00:43:09 +00:00
Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers into modules, and delete rossubsys.
This commit is contained in:
parent
b94e2d8ca0
commit
c2c66aff7d
24198 changed files with 0 additions and 37285 deletions
337
base/applications/msconfig_new/utils.c
Normal file
337
base/applications/msconfig_new/utils.c
Normal file
|
@ -0,0 +1,337 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/utils.c
|
||||
* PURPOSE: Memory Management, Resources, ... Utility Functions
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
#include "utils.h"
|
||||
#include "stringutils.h"
|
||||
|
||||
// HANDLE g_hHeap = GetProcessHeap();
|
||||
#define g_hHeap GetProcessHeap()
|
||||
|
||||
#if 0
|
||||
VOID
|
||||
MemInit(IN HANDLE Heap)
|
||||
{
|
||||
/* Save the heap handle */
|
||||
g_hHeap = Heap;
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOL
|
||||
MemFree(IN PVOID lpMem)
|
||||
{
|
||||
/* Free memory back into the heap */
|
||||
return HeapFree(g_hHeap, 0, lpMem);
|
||||
}
|
||||
|
||||
PVOID
|
||||
MemAlloc(IN DWORD dwFlags,
|
||||
IN DWORD dwBytes)
|
||||
{
|
||||
/* Allocate memory from the heap */
|
||||
return HeapAlloc(g_hHeap, dwFlags, dwBytes);
|
||||
}
|
||||
|
||||
LPWSTR
|
||||
FormatDateTime(IN LPSYSTEMTIME pDateTime)
|
||||
{
|
||||
LPWSTR lpszDateTime = NULL;
|
||||
int iDateBufSize, iTimeBufSize;
|
||||
|
||||
if (pDateTime == NULL) return NULL;
|
||||
|
||||
iDateBufSize = GetDateFormatW(LOCALE_USER_DEFAULT,
|
||||
/* Only for Windows 7 : DATE_AUTOLAYOUT | */ DATE_SHORTDATE,
|
||||
pDateTime,
|
||||
NULL,
|
||||
NULL,
|
||||
0);
|
||||
iTimeBufSize = GetTimeFormatW(LOCALE_USER_DEFAULT,
|
||||
0,
|
||||
pDateTime,
|
||||
NULL,
|
||||
NULL,
|
||||
0);
|
||||
|
||||
if ( (iDateBufSize > 0) && (iTimeBufSize > 0) )
|
||||
{
|
||||
lpszDateTime = (LPWSTR)MemAlloc(0, (iDateBufSize + iTimeBufSize) * sizeof(WCHAR));
|
||||
|
||||
GetDateFormatW(LOCALE_USER_DEFAULT,
|
||||
/* Only for Windows 7 : DATE_AUTOLAYOUT | */ DATE_SHORTDATE,
|
||||
pDateTime,
|
||||
NULL,
|
||||
lpszDateTime,
|
||||
iDateBufSize);
|
||||
if (iDateBufSize > 0) lpszDateTime[iDateBufSize-1] = L' ';
|
||||
GetTimeFormatW(LOCALE_USER_DEFAULT,
|
||||
0,
|
||||
pDateTime,
|
||||
NULL,
|
||||
lpszDateTime + iDateBufSize,
|
||||
iTimeBufSize);
|
||||
}
|
||||
|
||||
return lpszDateTime;
|
||||
}
|
||||
|
||||
VOID
|
||||
FreeDateTime(IN LPWSTR lpszDateTime)
|
||||
{
|
||||
if (lpszDateTime)
|
||||
MemFree(lpszDateTime);
|
||||
}
|
||||
|
||||
LPWSTR
|
||||
LoadResourceStringEx(IN HINSTANCE hInstance,
|
||||
IN UINT uID,
|
||||
OUT size_t* pSize OPTIONAL)
|
||||
{
|
||||
LPWSTR lpszDestBuf = NULL, lpszResourceString = NULL;
|
||||
size_t iStrSize = 0;
|
||||
|
||||
// When passing a zero-length buffer size, LoadString(...) returns a
|
||||
// read-only pointer buffer to the program's resource string.
|
||||
iStrSize = LoadStringW(hInstance, uID, (LPWSTR)&lpszResourceString, 0);
|
||||
|
||||
if ( lpszResourceString && ( (lpszDestBuf = (LPWSTR)MemAlloc(0, (iStrSize + 1) * sizeof(WCHAR))) != NULL ) )
|
||||
{
|
||||
wcsncpy(lpszDestBuf, lpszResourceString, iStrSize);
|
||||
lpszDestBuf[iStrSize] = L'\0'; // NULL-terminate the string
|
||||
|
||||
if (pSize)
|
||||
*pSize = iStrSize + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pSize)
|
||||
*pSize = 0;
|
||||
}
|
||||
|
||||
return lpszDestBuf;
|
||||
}
|
||||
|
||||
LPWSTR
|
||||
LoadConditionalResourceStringEx(IN HINSTANCE hInstance,
|
||||
IN BOOL bCondition,
|
||||
IN UINT uIDifTrue,
|
||||
IN UINT uIDifFalse,
|
||||
IN size_t* pSize OPTIONAL)
|
||||
{
|
||||
return LoadResourceStringEx(hInstance,
|
||||
(bCondition ? uIDifTrue : uIDifFalse),
|
||||
pSize);
|
||||
}
|
||||
|
||||
DWORD
|
||||
RunCommand(IN LPCWSTR lpszCommand,
|
||||
IN LPCWSTR lpszParameters,
|
||||
IN INT nShowCmd)
|
||||
{
|
||||
DWORD dwRes;
|
||||
|
||||
DWORD dwNumOfChars;
|
||||
LPWSTR lpszExpandedCommand;
|
||||
|
||||
dwNumOfChars = ExpandEnvironmentStringsW(lpszCommand, NULL, 0);
|
||||
lpszExpandedCommand = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
||||
ExpandEnvironmentStringsW(lpszCommand, lpszExpandedCommand, dwNumOfChars);
|
||||
|
||||
dwRes = (DWORD)ShellExecuteW(NULL, NULL /* and not L"open" !! */,
|
||||
lpszExpandedCommand,
|
||||
lpszParameters,
|
||||
NULL, nShowCmd);
|
||||
MemFree(lpszExpandedCommand);
|
||||
|
||||
return dwRes;
|
||||
}
|
||||
|
||||
|
||||
//////////////////// The following comes from MSDN samples ///////////////////
|
||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/dd162826(v=vs.85).aspx
|
||||
//
|
||||
|
||||
//
|
||||
// ClipOrCenterRectToMonitor
|
||||
//
|
||||
// The most common problem apps have when running on a
|
||||
// multimonitor system is that they "clip" or "pin" windows
|
||||
// based on the SM_CXSCREEN and SM_CYSCREEN system metrics.
|
||||
// Because of app compatibility reasons these system metrics
|
||||
// return the size of the primary monitor.
|
||||
//
|
||||
// This shows how you use the multi-monitor functions
|
||||
// to do the same thing.
|
||||
//
|
||||
VOID ClipOrCenterRectToMonitor(LPRECT prc, UINT flags)
|
||||
{
|
||||
HMONITOR hMonitor;
|
||||
MONITORINFO mi;
|
||||
RECT rc;
|
||||
int w = prc->right - prc->left;
|
||||
int h = prc->bottom - prc->top;
|
||||
|
||||
//
|
||||
// Get the nearest monitor to the passed rect.
|
||||
//
|
||||
hMonitor = MonitorFromRect(prc, MONITOR_DEFAULTTONEAREST);
|
||||
|
||||
//
|
||||
// Get the work area or entire monitor rect.
|
||||
//
|
||||
mi.cbSize = sizeof(mi);
|
||||
GetMonitorInfo(hMonitor, &mi);
|
||||
|
||||
if (flags & MONITOR_WORKAREA)
|
||||
rc = mi.rcWork;
|
||||
else
|
||||
rc = mi.rcMonitor;
|
||||
|
||||
//
|
||||
// Center or clip the passed rect to the monitor rect.
|
||||
//
|
||||
if (flags & MONITOR_CENTER)
|
||||
{
|
||||
prc->left = rc.left + (rc.right - rc.left - w) / 2;
|
||||
prc->top = rc.top + (rc.bottom - rc.top - h) / 2;
|
||||
prc->right = prc->left + w;
|
||||
prc->bottom = prc->top + h;
|
||||
}
|
||||
else
|
||||
{
|
||||
prc->left = max(rc.left, min(rc.right-w, prc->left));
|
||||
prc->top = max(rc.top, min(rc.bottom-h, prc->top));
|
||||
prc->right = prc->left + w;
|
||||
prc->bottom = prc->top + h;
|
||||
}
|
||||
}
|
||||
|
||||
VOID ClipOrCenterWindowToMonitor(HWND hWnd, UINT flags)
|
||||
{
|
||||
RECT rc;
|
||||
GetWindowRect(hWnd, &rc);
|
||||
ClipOrCenterRectToMonitor(&rc, flags);
|
||||
SetWindowPos(hWnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
BOOL IsWindowsOS(VOID)
|
||||
{
|
||||
BOOL bIsWindowsOS = FALSE;
|
||||
|
||||
OSVERSIONINFOW osvi = {0};
|
||||
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
||||
|
||||
if (!GetVersionExW(&osvi))
|
||||
return FALSE;
|
||||
|
||||
if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)
|
||||
return FALSE;
|
||||
|
||||
/* ReactOS reports as Windows NT 5.2 */
|
||||
|
||||
if ( (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 2) ||
|
||||
(osvi.dwMajorVersion > 5) )
|
||||
{
|
||||
HKEY hKey = NULL;
|
||||
|
||||
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
|
||||
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
|
||||
0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
LONG ret;
|
||||
DWORD dwType = 0, dwBufSize = 0;
|
||||
|
||||
ret = RegQueryValueExW(hKey, L"ProductName", NULL, &dwType, NULL, &dwBufSize);
|
||||
if (ret == ERROR_SUCCESS && dwType == REG_SZ)
|
||||
{
|
||||
LPTSTR lpszProductName = (LPTSTR)MemAlloc(0, dwBufSize);
|
||||
RegQueryValueExW(hKey, L"ProductName", NULL, &dwType, (LPBYTE)lpszProductName, &dwBufSize);
|
||||
|
||||
bIsWindowsOS = (FindSubStrI(lpszProductName, _T("Windows")) != NULL);
|
||||
|
||||
MemFree(lpszProductName);
|
||||
}
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bIsWindowsOS = TRUE;
|
||||
}
|
||||
|
||||
return bIsWindowsOS;
|
||||
}
|
||||
|
||||
BOOL IsPreVistaOSVersion(VOID)
|
||||
{
|
||||
OSVERSIONINFOW osvi = {0};
|
||||
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
||||
|
||||
if (!GetVersionExW(&osvi))
|
||||
return FALSE;
|
||||
|
||||
/* Vista+-class OSes are NT >= 6 */
|
||||
return ( (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) ? (osvi.dwMajorVersion < 6) : FALSE );
|
||||
}
|
||||
|
||||
LPWSTR
|
||||
GetExecutableVendor(IN LPCWSTR lpszFilename)
|
||||
{
|
||||
LPWSTR lpszVendor = NULL;
|
||||
DWORD dwHandle = 0;
|
||||
DWORD dwLen;
|
||||
|
||||
LPVOID lpData;
|
||||
|
||||
LPVOID pvData = NULL;
|
||||
UINT BufLen = 0;
|
||||
WORD wCodePage = 0, wLangID = 0;
|
||||
LPWSTR lpszStrFileInfo = NULL;
|
||||
|
||||
LPWSTR lpszData = NULL;
|
||||
|
||||
if (lpszFilename == NULL) return NULL;
|
||||
|
||||
dwLen = GetFileVersionInfoSizeW(lpszFilename, &dwHandle);
|
||||
if (dwLen == 0) return NULL;
|
||||
|
||||
lpData = MemAlloc(0, dwLen);
|
||||
if (!lpData) return NULL;
|
||||
|
||||
GetFileVersionInfoW(lpszFilename, dwHandle, dwLen, lpData);
|
||||
|
||||
if (VerQueryValueW(lpData, L"\\VarFileInfo\\Translation", &pvData, &BufLen))
|
||||
{
|
||||
wCodePage = LOWORD(*(DWORD*)pvData);
|
||||
wLangID = HIWORD(*(DWORD*)pvData);
|
||||
|
||||
lpszStrFileInfo = FormatString(L"StringFileInfo\\%04X%04X\\CompanyName",
|
||||
wCodePage,
|
||||
wLangID);
|
||||
}
|
||||
|
||||
VerQueryValueW(lpData, lpszStrFileInfo, (LPVOID*)&lpszData, &BufLen);
|
||||
if (lpszData)
|
||||
{
|
||||
lpszVendor = (LPWSTR)MemAlloc(0, BufLen * sizeof(WCHAR));
|
||||
if (lpszVendor)
|
||||
wcscpy(lpszVendor, lpszData);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpszVendor = NULL;
|
||||
}
|
||||
|
||||
MemFree(lpszStrFileInfo);
|
||||
MemFree(lpData);
|
||||
|
||||
return lpszVendor;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue