- 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
+PROJECT(msconfig_new)
+
list(APPEND SOURCE
toolspage.c
srvpage.c
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)
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
*/
#include "precomp.h"
+#include "utils.h"
#include "toolspage.h"
#include "srvpage.h"
#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;
//
//
-// Copied from uxtheme.h
+// Copied from uxtheme.h
// If you have this new header, then delete these and
// #include <uxtheme.h> instead!
//
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)
{
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;
}
#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
#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>
#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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+#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;
+}
--- /dev/null
+#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 */