Sync with trunk r62754.
[reactos.git] / base / applications / control / control.c
index f98eb13..0984e98 100644 (file)
  *                  Colin Finck (mail@colinfinck.de)
  */
 
-#include "control.h"
+#include <stdio.h>
 
-static const TCHAR szWindowClass[] = _T("DummyControlClass");
+#define WIN32_NO_STATUS
 
-HANDLE hProcessHeap;
-HINSTANCE hInst;
+#include <windef.h>
+#include <winbase.h>
+#include <winuser.h>
+#include <winreg.h>
+#include <shellapi.h>
 
-static
-INT
-OpenShellFolder(LPTSTR lpFolderCLSID)
+#include "resource.h"
+
+#define MAX_VALUE_NAME 16383
+
+/*
+ * Macro for calling "rundll32.exe"
+ * According to MSDN, ShellExecute returns a value greater than 32
+ * if the operation was successful.
+ */
+#define RUNDLL(param)   \
+    ((INT_PTR)ShellExecuteW(NULL, L"open", L"rundll32.exe", (param), NULL, SW_SHOWDEFAULT) > 32)
+
+VOID
+WINAPI
+Control_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow);
+
+static INT
+OpenShellFolder(LPWSTR lpFolderCLSID)
 {
-    TCHAR szParameters[MAX_PATH];
-
-    /* Open a shell folder using "explorer.exe".
-       The passed CLSID's are all subfolders of the "Control Panel" shell folder. */
-    _tcscpy(szParameters, _T("/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"));
-    _tcscat(szParameters, lpFolderCLSID);
-
-    return (INT_PTR)ShellExecute(NULL,
-                                 _T("open"),
-                                 _T("explorer.exe"),
-                                 szParameters,
-                                 NULL,
-                                 SW_SHOWDEFAULT) > 32;
+    WCHAR szParameters[MAX_PATH];
+
+    /*
+     * Open a shell folder using "explorer.exe". The passed CLSIDs
+     * are all subfolders of the "Control Panel" shell folder.
+     */
+    wcscpy(szParameters, L"/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}");
+    wcscat(szParameters, lpFolderCLSID);
+
+    return (INT_PTR)ShellExecuteW(NULL,
+                                  L"open",
+                                  L"explorer.exe",
+                                  szParameters,
+                                  NULL,
+                                  SW_SHOWDEFAULT) > 32;
 }
 
-static
-INT
-RunControlPanel(LPTSTR lpCmd)
+static INT
+RunControlPanel(LPCWSTR lpCmd)
 {
-    TCHAR szParameters[MAX_PATH];
-
-    _tcscpy(szParameters, _T("shell32.dll,Control_RunDLL "));
-    _tcscat(szParameters, lpCmd);
-
+    /*
+     * Old method:
+     *
+    WCHAR szParameters[MAX_PATH];
+    wcscpy(szParameters, L"shell32.dll,Control_RunDLL ");
+    wcscat(szParameters, lpCmd);
     return RUNDLL(szParameters);
+     */
+
+    /* New method: */
+    Control_RunDLLW(GetDesktopWindow(), 0, lpCmd, SW_SHOW);
+    return 1;
 }
 
-int
+INT
 WINAPI
-_tWinMain(HINSTANCE hInstance,
-          HINSTANCE hPrevInstance,
-          LPTSTR lpCmdLine,
-          int nCmdShow)
+wWinMain(HINSTANCE hInstance,
+         HINSTANCE hPrevInstance,
+         LPWSTR lpCmdLine,
+         INT nCmdShow)
 {
     HKEY hKey;
 
-    hInst = hInstance;
-    hProcessHeap = GetProcessHeap();
-
     /* Show the control panel window if no argument or "panel" was passed */
-    if(lpCmdLine[0] == 0 || !_tcsicmp(lpCmdLine, _T("panel")))
-        return OpenShellFolder(_T(""));
+    if (*lpCmdLine == 0 || !_wcsicmp(lpCmdLine, L"panel"))
+        return OpenShellFolder(L"");
 
     /* Check one of the built-in control panel handlers */
-    if (!_tcsicmp(lpCmdLine, _T("admintools")))           return OpenShellFolder(_T("\\::{D20EA4E1-3957-11d2-A40B-0C5020524153}"));
-    else if (!_tcsicmp(lpCmdLine, _T("color")))           return RunControlPanel(_T("desk.cpl"));       /* TODO: Switch to the "Apperance" tab */
-    else if (!_tcsicmp(lpCmdLine, _T("date/time")))       return RunControlPanel(_T("timedate.cpl"));
-    else if (!_tcsicmp(lpCmdLine, _T("desktop")))         return RunControlPanel(_T("desk.cpl"));
-    else if (!_tcsicmp(lpCmdLine, _T("folders")))         return RUNDLL(_T("shell32.dll,Options_RunDLL"));
-    else if (!_tcsicmp(lpCmdLine, _T("fonts")))           return OpenShellFolder(_T("\\::{D20EA4E1-3957-11d2-A40B-0C5020524152}"));
-    else if (!_tcsicmp(lpCmdLine, _T("infrared")))        return RunControlPanel(_T("irprops.cpl"));
-    else if (!_tcsicmp(lpCmdLine, _T("international")))   return RunControlPanel(_T("intl.cpl"));
-    else if (!_tcsicmp(lpCmdLine, _T("keyboard")))        return RunControlPanel(_T("main.cpl @1"));
-    else if (!_tcsicmp(lpCmdLine, _T("mouse")))           return RunControlPanel(_T("main.cpl @0"));
-    else if (!_tcsicmp(lpCmdLine, _T("netconnections")))  return OpenShellFolder(_T("\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}"));
-    else if (!_tcsicmp(lpCmdLine, _T("netware")))         return RunControlPanel(_T("nwc.cpl"));
-    else if (!_tcsicmp(lpCmdLine, _T("ports")))           return RunControlPanel(_T("sysdm.cpl"));      /* TODO: Switch to the "Computer Name" tab */
-    else if (!_tcsicmp(lpCmdLine, _T("printers")))        return OpenShellFolder(_T("\\::{2227A280-3AEA-1069-A2DE-08002B30309D}"));
-    else if (!_tcsicmp(lpCmdLine, _T("scannercamera")))   return OpenShellFolder(_T("\\::{E211B736-43FD-11D1-9EFB-0000F8757FCD}"));
-    else if (!_tcsicmp(lpCmdLine, _T("schedtasks")))      return OpenShellFolder(_T("\\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}"));
-    else if (!_tcsicmp(lpCmdLine, _T("telephony")))       return RunControlPanel(_T("telephon.cpl"));
-    else if (!_tcsicmp(lpCmdLine, _T("userpasswords")))   return RunControlPanel(_T("nusrmgr.cpl"));       /* Graphical User Account Manager */
-    else if (!_tcsicmp(lpCmdLine, _T("userpasswords2")))  return RUNDLL(_T("netplwiz.dll,UsersRunDll"));   /* Dialog based advanced User Account Manager */
+    if (!_wcsicmp(lpCmdLine, L"admintools"))           return OpenShellFolder(L"\\::{D20EA4E1-3957-11d2-A40B-0C5020524153}");
+    else if (!_wcsicmp(lpCmdLine, L"color"))           return RunControlPanel(L"desk.cpl");       /* TODO: Switch to the "Apperance" tab */
+    else if (!_wcsicmp(lpCmdLine, L"date/time"))       return RunControlPanel(L"timedate.cpl");
+    else if (!_wcsicmp(lpCmdLine, L"desktop"))         return RunControlPanel(L"desk.cpl");
+    else if (!_wcsicmp(lpCmdLine, L"folders"))         return RUNDLL(L"shell32.dll,Options_RunDLL");
+    else if (!_wcsicmp(lpCmdLine, L"fonts"))           return OpenShellFolder(L"\\::{D20EA4E1-3957-11d2-A40B-0C5020524152}");
+    else if (!_wcsicmp(lpCmdLine, L"infrared"))        return RunControlPanel(L"irprops.cpl");
+    else if (!_wcsicmp(lpCmdLine, L"international"))   return RunControlPanel(L"intl.cpl");
+    else if (!_wcsicmp(lpCmdLine, L"keyboard"))        return RunControlPanel(L"main.cpl @1");
+    else if (!_wcsicmp(lpCmdLine, L"mouse"))           return RunControlPanel(L"main.cpl @0");
+    else if (!_wcsicmp(lpCmdLine, L"netconnections"))  return OpenShellFolder(L"\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}");
+    else if (!_wcsicmp(lpCmdLine, L"netware"))         return RunControlPanel(L"nwc.cpl");
+    else if (!_wcsicmp(lpCmdLine, L"ports"))           return RunControlPanel(L"sysdm.cpl");      /* TODO: Switch to the "Computer Name" tab */
+    else if (!_wcsicmp(lpCmdLine, L"printers"))        return OpenShellFolder(L"\\::{2227A280-3AEA-1069-A2DE-08002B30309D}");
+    else if (!_wcsicmp(lpCmdLine, L"scannercamera"))   return OpenShellFolder(L"\\::{E211B736-43FD-11D1-9EFB-0000F8757FCD}");
+    else if (!_wcsicmp(lpCmdLine, L"schedtasks"))      return OpenShellFolder(L"\\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}");
+    else if (!_wcsicmp(lpCmdLine, L"telephony"))       return RunControlPanel(L"telephon.cpl");
+    else if (!_wcsicmp(lpCmdLine, L"userpasswords"))   return RunControlPanel(L"nusrmgr.cpl");       /* Graphical User Account Manager */
+    else if (!_wcsicmp(lpCmdLine, L"userpasswords2"))  return RUNDLL(L"netplwiz.dll,UsersRunDll");   /* Dialog based advanced User Account Manager */
 
     /* It is none of them, so look for a handler in the registry */
-    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                    _T("Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"),
-                    0,
-                    KEY_QUERY_VALUE,
-                    &hKey) == ERROR_SUCCESS)
+    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                      L"Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls",
+                      0,
+                      KEY_QUERY_VALUE,
+                      &hKey) == ERROR_SUCCESS)
     {
         DWORD dwIndex;
 
-        for(dwIndex = 0; ; ++dwIndex)
+        for (dwIndex = 0; ; ++dwIndex)
         {
             DWORD dwDataSize;
             DWORD dwValueSize = MAX_VALUE_NAME;
-            TCHAR szValueName[MAX_VALUE_NAME];
+            WCHAR szValueName[MAX_VALUE_NAME];
 
             /* Get the value name and data size */
-            if(RegEnumValue(hKey,
-                            dwIndex,
-                            szValueName,
-                            &dwValueSize,
-                            0,
-                            NULL,
-                            NULL,
-                            &dwDataSize) != ERROR_SUCCESS)
+            if (RegEnumValueW(hKey,
+                              dwIndex,
+                              szValueName,
+                              &dwValueSize,
+                              0,
+                              NULL,
+                              NULL,
+                              &dwDataSize) != ERROR_SUCCESS)
+            {
                 break;
+            }
 
             /* Check if the parameter is the value name */
-            if(!_tcsicmp(lpCmdLine, szValueName))
+            if (!_wcsicmp(lpCmdLine, szValueName))
             {
-                LPTSTR pszData;
-
-                /* Allocate memory for the data plus two more characters, so we can quote the file name if required */
-                pszData = (LPTSTR) HeapAlloc(hProcessHeap,
-                                             0,
-                                             dwDataSize + 2 * sizeof(TCHAR));
+                /*
+                 * Allocate memory for the data plus two more characters,
+                 * so we can quote the file name if required.
+                 */
+                LPWSTR pszData;
+                pszData = HeapAlloc(GetProcessHeap(),
+                                    0,
+                                    dwDataSize + 2 * sizeof(WCHAR));
                 ++pszData;
 
-                /* This value is the one we are looking for, so get the data. It is the path to a .cpl file */
-                if(RegQueryValueEx(hKey,
-                                   szValueName,
-                                   0,
-                                   NULL,
-                                   (LPBYTE)pszData,
-                                   &dwDataSize) == ERROR_SUCCESS)
+                /*
+                 * This value is the one we are looking for, so get the data.
+                 * It is the path to a .cpl file.
+                 */
+                if (RegQueryValueExW(hKey,
+                                     szValueName,
+                                     0,
+                                     NULL,
+                                     (LPBYTE)pszData,
+                                     &dwDataSize) == ERROR_SUCCESS)
                 {
                     INT nReturnValue;
 
                     /* Quote the file name if required */
-                    if(*pszData != '\"')
+                    if (*pszData != L'\"')
                     {
-                        *(--pszData) = '\"';
-                        pszData[dwDataSize / sizeof(TCHAR)] = '\"';
-                        pszData[(dwDataSize / sizeof(TCHAR)) + 1] = 0;
+                        *(--pszData) = L'\"';
+                        pszData[dwDataSize / sizeof(WCHAR)] = L'\"';
+                        pszData[(dwDataSize / sizeof(WCHAR)) + 1] = 0;
                     }
 
                     nReturnValue = RunControlPanel(pszData);
-                    HeapFree(hProcessHeap,
-                             0,
-                             pszData);
+                    HeapFree(GetProcessHeap(), 0, pszData);
                     RegCloseKey(hKey);
 
                     return nReturnValue;
                 }
 
-                HeapFree(hProcessHeap,
-                         0,
-                         pszData);
+                HeapFree(GetProcessHeap(), 0, pszData);
             }
         }
 
         RegCloseKey(hKey);
     }
 
-    /* It's none of the known parameters, so interpret the parameter as the file name of a control panel applet */
+    /*
+     * It's none of the known parameters, so interpret the parameter
+     * as the file name of a control panel applet.
+     */
     return RunControlPanel(lpCmdLine);
 }