mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
160 lines
6.6 KiB
C
160 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);
|
|
}
|