reactos/base/applications/control/control.c
Amine Khaldi 527f2f9057 [SHELL/EXPERIMENTS]
* Create a branch for some evul shell experiments.

svn path=/branches/shell-experiments/; revision=61927
2014-02-02 19:37:27 +00:00

159 lines
6.6 KiB
C

/*
* PROJECT: ReactOS System Control Panel
* FILE: base/applications/control/control.c
* PURPOSE: ReactOS System Control Panel
* PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
* Colin Finck (mail@colinfinck.de)
*/
#include "control.h"
static const TCHAR szWindowClass[] = _T("DummyControlClass");
HANDLE hProcessHeap;
HINSTANCE hInst;
static
INT
OpenShellFolder(LPTSTR 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;
}
static
INT
RunControlPanel(LPTSTR lpCmd)
{
TCHAR szParameters[MAX_PATH];
_tcscpy(szParameters, _T("shell32.dll,Control_RunDLL "));
_tcscat(szParameters, lpCmd);
return RUNDLL(szParameters);
}
int
WINAPI
_tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR 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(""));
/* 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 */
/* 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)
{
DWORD dwIndex;
for(dwIndex = 0; ; ++dwIndex)
{
DWORD dwDataSize;
DWORD dwValueSize = MAX_VALUE_NAME;
TCHAR szValueName[MAX_VALUE_NAME];
/* Get the value name and data size */
if(RegEnumValue(hKey,
dwIndex,
szValueName,
&dwValueSize,
0,
NULL,
NULL,
&dwDataSize) != ERROR_SUCCESS)
break;
/* Check if the parameter is the value name */
if(!_tcsicmp(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));
++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)
{
INT nReturnValue;
/* Quote the file name if required */
if(*pszData != '\"')
{
*(--pszData) = '\"';
pszData[dwDataSize / sizeof(TCHAR)] = '\"';
pszData[(dwDataSize / sizeof(TCHAR)) + 1] = 0;
}
nReturnValue = RunControlPanel(pszData);
HeapFree(hProcessHeap,
0,
pszData);
RegCloseKey(hKey);
return nReturnValue;
}
HeapFree(hProcessHeap,
0,
pszData);
}
}
RegCloseKey(hKey);
}
/* It's none of the known parameters, so interpret the parameter as the file name of a control panel applet */
return RunControlPanel(lpCmdLine);
}