[MSCONFIG_NEW]

- Associate a temporary VS project (will be removed later on); change the name of the target for now...
- Allow only one instance of MSConfig running on the system (we use a semaphore, compatible with MS' msconfig, so that if you try to run ROS msconfig on windows, you cannot run also windows' msconfig, and vice versa).
- Introduce some utility functions (for strings and other stuff), will be used later on.
CORE-9333

svn path=/trunk/; revision=69024
This commit is contained in:
Hermès Bélusca-Maïto 2015-09-05 13:03:04 +00:00
parent 83400d8fc7
commit c1228347b5
35 changed files with 818 additions and 49 deletions

View file

@ -1,4 +1,6 @@
PROJECT(msconfig_new)
list(APPEND SOURCE
toolspage.c
srvpage.c
@ -7,11 +9,13 @@ list(APPEND SOURCE
freeldrpage.c
generalpage.c
msconfig.c
stringutils.c
utils.c
precomp.h)
add_rc_deps(msconfig.rc ${CMAKE_CURRENT_SOURCE_DIR}/res/msconfig.ico)
add_executable(msconfig ${SOURCE} msconfig.rc)
set_module_type(msconfig win32gui UNICODE)
add_importlibs(msconfig user32 advapi32 version comctl32 shell32 shlwapi msvcrt kernel32)
add_pch(msconfig precomp.h SOURCE)
add_cd_file(TARGET msconfig DESTINATION reactos/system32 FOR all)
add_executable(msconfig_new ${SOURCE} msconfig.rc)
set_module_type(msconfig_new win32gui UNICODE)
add_importlibs(msconfig_new user32 advapi32 version comctl32 shell32 shlwapi msvcrt kernel32)
add_pch(msconfig_new precomp.h SOURCE)
add_cd_file(TARGET msconfig_new DESTINATION reactos/system32 FOR all)

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Приложение за настройка на системата"
IDS_MSCONFIG "Приложение за настройка на системата"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Общи"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Programa de configuracio de sistema"
IDS_MSCONFIG "Programa de configuracio de sistema"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "General"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -129,7 +129,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Nástroj pro konfiguraci systému"
IDS_MSCONFIG "Nástroj pro konfiguraci systému"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Obecné"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Systemkonfiguration"
IDS_MSCONFIG "Systemkonfiguration"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Allgemein"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Πρόγραμμα παραμετροποίησης συστήματος"
IDS_MSCONFIG "Πρόγραμμα παραμετροποίησης συστήματος"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Γενικά"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "System configuration program"
IDS_MSCONFIG "System configuration program"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "General"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -126,7 +126,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Utilidad de configuración del sistema"
IDS_MSCONFIG "Utilidad de configuración del sistema"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "General"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Utilitaire de configuration système"
IDS_MSCONFIG "Utilitaire de configuration système"
IDS_MSCONFIG_2 "Configuration du système"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Général"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "כלי שירות לקביעת תצורת המערכת"
IDS_MSCONFIG "כלי שירות לקביעת תצורת המערכת"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "כללי"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Rendszerkonfiguráciüs segédprogram"
IDS_MSCONFIG "Rendszerkonfiguráciüs segédprogram"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Általános"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Program konfigurasi sistem"
IDS_MSCONFIG "Program konfigurasi sistem"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Umum"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Utilità di configurazione del sistema"
IDS_MSCONFIG "Utilità di configurazione del sistema"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Generale"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "System 설정 프로그램"
IDS_MSCONFIG "System 설정 프로그램"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "일반"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Hulpprogramma voor systeemconfiguratie"
IDS_MSCONFIG "Hulpprogramma voor systeemconfiguratie"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Algemeen"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -123,7 +123,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Systemkonfigurasjon"
IDS_MSCONFIG "Systemkonfigurasjon"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Generelt"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -131,7 +131,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Program konfiguracji systemu"
IDS_MSCONFIG "Program konfiguracji systemu"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Ogólne"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Programa de configuração do sistema"
IDS_MSCONFIG "Programa de configuração do sistema"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Geral"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Configuratorul de sistem"
IDS_MSCONFIG "Configuratorul de sistem"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Generale"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Настройка системы"
IDS_MSCONFIG "Настройка системы"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Общие"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -127,7 +127,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Program na konfiguráciu systému"
IDS_MSCONFIG "Program na konfiguráciu systému"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Všeobecné"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -127,7 +127,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Programi i konfigurimit te sistemit"
IDS_MSCONFIG "Programi i konfigurimit te sistemit"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "General"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -130,7 +130,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Systemkonfiguration"
IDS_MSCONFIG "Systemkonfiguration"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Generellt"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "โปรแกรมโครงแบบระบบ"
IDS_MSCONFIG "โปรแกรมโครงแบบระบบ"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "ทั่วไป"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Dizge Yapılandırma İzlencesi"
IDS_MSCONFIG "Dizge Yapılandırma İzlencesi"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Umûmî"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -131,7 +131,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "Програма налаштування системи"
IDS_MSCONFIG "Програма налаштування системи"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "Загальні"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "系统配置实用程序"
IDS_MSCONFIG "系统配置实用程序"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "一般"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -125,7 +125,12 @@ END
STRINGTABLE
BEGIN
IDS_MSCONFIG "系統設定"
IDS_MSCONFIG "系統設定"
IDS_MSCONFIG_2 "System Configuration"
END
STRINGTABLE
BEGIN
IDS_TAB_GENERAL "一般"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"

View file

@ -8,6 +8,7 @@
*/
#include "precomp.h"
#include "utils.h"
#include "toolspage.h"
#include "srvpage.h"
@ -16,9 +17,24 @@
#include "systempage.h"
#include "generalpage.h"
HINSTANCE hInst = 0;
/* Allow only for a single instance of MSConfig */
#ifdef _MSC_VER
#pragma data_seg("MSConfigInstance")
HWND hSingleWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:MSConfigInstance,RWS")
#else
HWND hSingleWnd __attribute__((section ("MSConfigInstance"), shared)) = NULL;
#endif
/* Defaults for ReactOS */
BOOL bIsWindows = FALSE;
BOOL bIsOSVersionLessThanVista = TRUE;
HINSTANCE hInst = NULL;
LPWSTR szAppName = NULL;
HWND hMainWnd; /* Main Window */
HWND hTabWnd; /* Tab Control Window */
UINT uXIcon = 0, uYIcon = 0; /* Icon sizes */
HICON hDialogIcon = NULL;
@ -32,7 +48,7 @@ void MsConfig_OnTabWndSelChange(void);
//
//
// Copied from uxtheme.h
// Copied from uxtheme.h
// If you have this new header, then delete these and
// #include <uxtheme.h> instead!
//
@ -45,7 +61,7 @@ void MsConfig_OnTabWndSelChange(void);
typedef HRESULT (WINAPI * ETDTProc) (HWND, DWORD);
//
// Try to call EnableThemeDialogTexture, if uxtheme.dll is present
// Try to call EnableThemeDialogTexture, if uxtheme.dll is present
//
BOOL EnableDialogTheme(HWND hwnd)
{
@ -300,26 +316,95 @@ MsConfigWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
return 0;
}
BOOL Initialize(HINSTANCE hInstance)
{
BOOL Success = TRUE;
LPWSTR lpszVistaAppName = NULL;
HANDLE hSemaphore;
INITCOMMONCONTROLSEX InitControls;
/* Initialize our global version flags */
bIsWindows = TRUE; /* IsWindowsOS(); */ // TODO: Commented for testing purposes...
bIsOSVersionLessThanVista = TRUE; /* IsOSVersionLessThanVista(); */ // TODO: Commented for testing purposes...
/* Initialize global strings */
szAppName = LoadResourceString(hInstance, IDS_MSCONFIG);
if (!bIsOSVersionLessThanVista)
lpszVistaAppName = LoadResourceString(hInstance, IDS_MSCONFIG_2);
/* We use a semaphore in order to have a single-instance application */
hSemaphore = CreateSemaphoreW(NULL, 0, 1, L"MSConfigRunning");
if (!hSemaphore || GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hSemaphore);
/*
* A semaphore with the same name already exist. It should have been
* created by another instance of MSConfig. Try to find its window
* and bring it to front.
*/
if ( (hSingleWnd && IsWindow(hSingleWnd)) ||
( (hSingleWnd = FindWindowW(L"#32770", szAppName)) != NULL ) ||
(!bIsOSVersionLessThanVista ? ( (hSingleWnd = FindWindowW(L"#32770", lpszVistaAppName)) != NULL ) : FALSE) )
{
/* Found it. Show the window. */
ShowWindow(hSingleWnd, SW_SHOWNORMAL);
SetForegroundWindow(hSingleWnd);
}
/* Quit this instance of MSConfig */
Success = FALSE;
}
if (!bIsOSVersionLessThanVista) MemFree(lpszVistaAppName);
/* Quit now if we failed */
if (!Success)
{
MemFree(szAppName);
return FALSE;
}
/* Initialize the common controls */
InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitControls.dwICC = ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES | ICC_UPDOWN_CLASS /* | ICC_PROGRESS_CLASS | ICC_HOTKEY_CLASS*/;
InitCommonControlsEx(&InitControls);
hInst = hInstance;
return Success;
}
VOID Cleanup(VOID)
{
MemFree(szAppName);
// // Close the sentry semaphore.
// CloseHandle(hSemaphore);
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
INITCOMMONCONTROLSEX InitControls;
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitControls.dwICC = ICC_TAB_CLASSES | ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&InitControls);
/*
* Initialize this instance of MSConfig. Quit if we have
* another instance already running.
*/
if (!Initialize(hInstance))
return -1;
hInst = hInstance;
DialogBox(hInst, (LPCTSTR)IDD_MSCONFIG_DIALOG, NULL, MsConfigWndProc);
// hInst = hInstance;
DialogBox(hInst, (LPCTSTR)IDD_MSCONFIG_DIALOG, NULL, MsConfigWndProc);
/* Finish cleanup and return */
Cleanup();
return 0;
}

View file

@ -1,8 +1,17 @@
#ifndef _MSCONFIG_PCH_
#define _MSCONFIG_PCH_
// NOTE: It is completely idiotic to need those defines defined
// for having the *_s string functions. In the MS CRT they are
// directly available without further tricks.
#define MINGW_HAS_SECURE_API 1
#include <stdarg.h>
#include <stdio.h>
#include <string.h> // FIXME: Should be normally useless in a proper CRT...
#include <tchar.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H
@ -10,9 +19,11 @@
#include <windef.h>
#include <winbase.h>
#include <winnls.h>
#include <winreg.h>
#include <tchar.h>
#include <stdio.h>
#include <winuser.h>
#include <winver.h>
#include <shlobj.h>
#include <strsafe.h>

View file

@ -111,6 +111,7 @@
#define IDS_SERVICES_YES 2202
#define IDS_SERVICES_UNKNOWN 2203
#define IDS_MSCONFIG 3000
#define IDS_MSCONFIG 3000
#define IDS_MSCONFIG_2 3001
#define IDI_APPICON 3001
#define IDI_APPICON 3010

View file

@ -0,0 +1,238 @@
/*
* PROJECT: ReactOS Applications
* LICENSE: LGPL - See COPYING in the top level directory
* FILE: base/applications/msconfig/stringutils.c
* PURPOSE: ANSI & UNICODE String Utility Functions
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
*/
#include "precomp.h"
#include "utils.h"
#include "stringutils.h"
//
// String formatting
//
LPTSTR FormatStringV(LPCTSTR str, va_list args)
{
LPTSTR lpszString = NULL;
if (str)
{
size_t strLenPlusNull = _vsctprintf(str, args) + 1;
lpszString = (LPTSTR)MemAlloc(0, strLenPlusNull * sizeof(TCHAR));
if (lpszString)
StringCchVPrintf(lpszString, strLenPlusNull, str, args);
}
return lpszString;
}
LPTSTR FormatString(LPCTSTR str, ...)
{
LPTSTR lpszString;
va_list args;
va_start(args, str);
lpszString = FormatStringV(str, args);
va_end(args);
return lpszString;
}
//
// String handling (ANSI <-> Unicode UTF16)
//
LPSTR UnicodeToAnsi(LPCWSTR strW)
{
LPSTR strA = NULL;
if (strW)
{
int iNeededChars = WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK /* | WC_NO_BEST_FIT_CHARS */,
strW, -1, NULL, 0, NULL, NULL);
strA = (LPSTR)MemAlloc(0, iNeededChars * sizeof(CHAR));
if (strA)
{
WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK /* | WC_NO_BEST_FIT_CHARS */,
strW, -1, strA, iNeededChars, NULL, NULL);
}
}
return strA;
}
LPWSTR AnsiToUnicode(LPCSTR strA)
{
LPWSTR strW = NULL;
if (strA)
{
int iNeededChars = MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
strA, -1, NULL, 0);
strW = (LPWSTR)MemAlloc(0, iNeededChars * sizeof(WCHAR));
if (strW)
{
MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
strA, -1, strW, iNeededChars);
}
}
return strW;
}
LPSTR DuplicateStringA(LPCSTR str)
{
LPSTR dupStr = NULL;
if (str)
{
size_t strSizePlusNull = strlen(str) + 1;
dupStr = (LPSTR)MemAlloc(0, strSizePlusNull * sizeof(CHAR));
if (dupStr)
StringCchCopyA(dupStr, strSizePlusNull, str);
}
return dupStr;
}
LPWSTR DuplicateStringW(LPCWSTR str)
{
LPWSTR dupStr = NULL;
if (str)
{
size_t strSizePlusNull = wcslen(str) + 1;
dupStr = (LPWSTR)MemAlloc(0, strSizePlusNull * sizeof(WCHAR));
if (dupStr)
StringCchCopyW(dupStr, strSizePlusNull, str);
}
return dupStr;
}
LPSTR DuplicateStringAEx(LPCSTR str, size_t numOfChars)
{
LPSTR dupStr = NULL;
if (str)
{
size_t strSize = min(strlen(str), numOfChars);
dupStr = (LPSTR)MemAlloc(0, (strSize + 1) * sizeof(CHAR));
if (dupStr)
{
StringCchCopyNA(dupStr, strSize + 1, str, strSize);
dupStr[strSize] = '\0';
}
}
return dupStr;
}
LPWSTR DuplicateStringWEx(LPCWSTR str, size_t numOfChars)
{
LPWSTR dupStr = NULL;
if (str)
{
size_t strSize = min(wcslen(str), numOfChars);
dupStr = (LPWSTR)MemAlloc(0, (strSize + 1) * sizeof(WCHAR));
if (dupStr)
{
StringCchCopyNW(dupStr, strSize + 1, str, strSize);
dupStr[strSize] = L'\0';
}
}
return dupStr;
}
//
// String search functions
//
/***
*wchar_t *wcsstr(string1, string2) - search for string2 in string1
* (wide strings)
*
*Purpose:
* finds the first occurrence of string2 in string1 (wide strings)
*
*Entry:
* wchar_t *string1 - string to search in
* wchar_t *string2 - string to search for
*
*Exit:
* returns a pointer to the first occurrence of string2 in
* string1, or NULL if string2 does not occur in string1
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/
LPTSTR FindSubStrI(LPCTSTR str, LPCTSTR strSearch)
{
LPTSTR cp = (LPTSTR)str;
LPTSTR s1, s2;
if (!*strSearch)
return (LPTSTR)str;
while (*cp)
{
s1 = cp;
s2 = (LPTSTR)strSearch;
while (*s1 && *s2 && (_totupper(*s1) == _totupper(*s2)))
++s1, ++s2;
if (!*s2)
return cp;
++cp;
}
return NULL;
}
/*************************************************************************
* AppendPathSeparator
*
* Append a backslash ('\') to a path if one doesn't exist.
*
* PARAMS
* lpszPath [I/O] The path to append a backslash to.
*
* RETURNS
* Success: The position of the last backslash in the path.
* Failure: NULL, if lpszPath is NULL or the path is too large.
*/
LPTSTR AppendPathSeparator(LPTSTR lpszPath)
{
size_t iLen = 0;
if (!lpszPath || (iLen = _tcslen(lpszPath)) >= MAX_PATH)
return NULL;
if (iLen >= 1)
{
lpszPath += iLen - 1;
if (*lpszPath++ != _T('\\'))
{
*lpszPath++ = _T('\\');
*lpszPath = _T('\0');
}
}
return lpszPath;
}

View file

@ -0,0 +1,63 @@
/*
* PROJECT: ReactOS Applications
* LICENSE: LGPL - See COPYING in the top level directory
* FILE: base/applications/msconfig/stringutils.h
* PURPOSE: ANSI & UNICODE String Utility Functions
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
*/
#ifndef __STRINGUTILS_H__
#define __STRINGUTILS_H__
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
//
// String formatting
//
LPTSTR FormatStringV(LPCTSTR str, va_list args);
LPTSTR FormatString(LPCTSTR str, ...);
//
// String handling (ANSI <-> Unicode UTF16)
//
LPSTR UnicodeToAnsi(LPCWSTR strW);
LPWSTR AnsiToUnicode(LPCSTR strA);
LPSTR DuplicateStringA(LPCSTR str);
LPWSTR DuplicateStringW(LPCWSTR str);
LPSTR DuplicateStringAEx(LPCSTR str, size_t numOfChars);
LPWSTR DuplicateStringWEx(LPCWSTR str, size_t numOfChars);
//
// Conversion macros ANSI <-> Unicode
//
#ifdef UNICODE
#define NewAnsiString(x) UnicodeToAnsi(x)
#define NewPortableString(x) AnsiToUnicode(x)
#define DuplicateString(x) DuplicateStringW(x)
#define DuplicateStringEx(x, y) DuplicateStringWEx((x), (y))
#else
#define NewAnsiString(x) DuplicateStringA(x)
#define NewPortableString(x) DuplicateString(x)
#define DuplicateString(x) DuplicateStringA(x)
#define DuplicateStringEx(x, y) DuplicateStringAEx((x), (y))
#endif
//
// String search functions
//
#define FindSubStr(str, strSearch) _tcsstr((str), (strSearch))
LPTSTR FindSubStrI(LPCTSTR str, LPCTSTR strSearch);
LPTSTR AppendPathSeparator(LPTSTR lpszPath);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // __STRINGUTILS_H__
/* EOF */

View file

@ -0,0 +1,177 @@
#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;
if (pDateTime)
{
int iDateBufSize = 0, iTimeBufSize = 0;
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(TCHAR));
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 = LoadString(hInstance, uID, (LPTSTR)&lpszResourceString, 0);
if ( lpszResourceString && ( (lpszDestBuf = (LPWSTR)MemAlloc(0, (iStrSize + 1) * sizeof(WCHAR))) != NULL ) )
{
_tcsncpy(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);
}
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;
LPTSTR 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;
}

View file

@ -0,0 +1,55 @@
#ifndef __UTILS_H__
#define __UTILS_H__
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#if 0
VOID
MemInit(IN HANDLE Heap);
#endif
BOOL
MemFree(IN PVOID lpMem);
PVOID
MemAlloc(IN DWORD dwFlags,
IN DWORD dwBytes);
LPWSTR
FormatDateTime(IN LPSYSTEMTIME pDateTime);
VOID
FreeDateTime(IN LPWSTR lpszDateTime);
LPWSTR
LoadResourceStringEx(IN HINSTANCE hInstance,
IN UINT uID,
OUT size_t* pSize OPTIONAL);
LPWSTR
LoadConditionalResourceStringEx(IN HINSTANCE hInstance,
IN BOOL bCondition,
IN UINT uIDifTrue,
IN UINT uIDifFalse,
IN size_t* pSize OPTIONAL);
#define LoadResourceString(hInst, uID) \
LoadResourceStringEx((hInst), (uID), NULL)
#define LoadConditionalResourceString(hInst, bCond, uIDifT, uIDifF) \
LoadConditionalResourceStringEx((hInst), (bCond), (uIDifT), (uIDifF), NULL)
LPWSTR
GetExecutableVendor(IN LPCWSTR lpszFilename);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // __UTILS_H__
/* EOF */