|
|
/*++
Microsoft Confidential Copyright (c) 1992-1997 Microsoft Corporation All rights reserved
Module Name:
sysdm.c
Abstract:
Initialization code for System Control Panel Applet
Author:
Eric Flo (ericflo) 19-Jun-1995
Revision History:
15-Oct-1997 scotthal Complete overhaul
--*/ #include "sysdm.h"
#include <shsemip.h>
#include <regstr.h>
//
// Global Variables
//
HINSTANCE hInstance; TCHAR szShellHelp[] = TEXT("ShellHelp"); TCHAR g_szNull[] = TEXT(""); UINT uiShellHelp;
TCHAR g_szErrMem[ 200 ]; // Low memory message
TCHAR g_szSystemApplet[ 100 ]; // "System Control Panel Applet" title
//
// Function prototypes
//
void RunApplet( IN HWND hwnd, IN LPTSTR lpCmdLine ); void _GetStartingPage(IN LPTSTR lpCmdLine, IN PROPSHEETHEADER* ppsh, INT* piStartPage, LPTSTR pszStartPage, INT cchStartPage); BOOL CALLBACK _AddPropSheetPage(HPROPSHEETPAGE hpage, LPARAM lParam);
BOOL WINAPI DllInitialize( IN HINSTANCE hInstDLL, IN DWORD dwReason, IN LPVOID lpvReserved ) /*++
Routine Description:
Main entry point.
Arguments:
hInstDLL - Supplies DLL instance handle.
dwReason - Supplies the reason DllInitialize() is being called.
lpvReserved - Reserved, NULL.
Return Value:
BOOL
--*/ { if (dwReason != DLL_PROCESS_ATTACH) { return TRUE; }
hInstance = hInstDLL;
return TRUE; }
LONG APIENTRY CPlApplet( IN HWND hwnd, IN WORD wMsg, IN LPARAM lParam1, IN LPARAM lParam2 ) /*++
Routine Description:
Control Panel Applet entry point.
Arguments:
hwnd - Supplies window handle.
wMsg - Supplies message being sent.
lParam1 - Supplies parameter to message.
lParam2 - Supplies parameter to message.
Return Value:
Nonzero if message was handled. Zero if message was unhandled.
--*/ {
LPCPLINFO lpCPlInfo;
switch (wMsg) {
case CPL_INIT: uiShellHelp = RegisterWindowMessage (szShellHelp);
LoadString( hInstance, IDS_INSUFFICIENT_MEMORY, g_szErrMem, ARRAYSIZE( g_szErrMem ) ); LoadString( hInstance, IDS_SYSDM_TITLE, g_szSystemApplet, ARRAYSIZE( g_szSystemApplet ) );
return (LONG) TRUE;
case CPL_GETCOUNT: return 1;
case CPL_INQUIRE:
lpCPlInfo = (LPCPLINFO)lParam2;
lpCPlInfo->idIcon = ID_ICON; lpCPlInfo->idName = IDS_NAME; lpCPlInfo->idInfo = IDS_INFO;
return (LONG) TRUE;
case CPL_DBLCLK:
lParam2 = 0L; // fall through...
case CPL_STARTWPARMS: RunApplet(hwnd, (LPTSTR)lParam2); return (LONG) TRUE; } return (LONG)0;
}
HPROPSHEETPAGE CreatePage(int idd, DLGPROC pfnDlgProc) { PROPSHEETPAGE psp; psp.dwSize = sizeof(psp); psp.dwFlags = PSP_DEFAULT; psp.hInstance = hInstance; psp.pszTemplate = MAKEINTRESOURCE(idd); psp.pfnDlgProc = pfnDlgProc; return CreatePropertySheetPage(&psp); }
static const PSPINFO c_pspCB[] = { { CreatePage, IDD_GENERAL, GeneralDlgProc }, { CreateNetIDPage, 0, NULL }, { CreatePage, IDD_HARDWARE, HardwareDlgProc }, { CreatePage, IDD_ADVANCED, AdvancedDlgProc }, { CreateSystemRestorePage, 0, NULL }, };
void RunApplet( IN HWND hwnd, IN LPTSTR lpCmdLine ) /*++
Routine Description:
CPL_STARTWPARMS message handler. Called when the user runs the Applet.
PropSheet initialization occurs here.
Arguments:
hwnd - Supplies window handle.
lpCmdLine - Supplies the command line used to invoke the applet.
Return Value:
none
--*/ { HRESULT hrOle = CoInitialize(0);
if (!SHRestricted(REST_MYCOMPNOPROP)) { if (lpCmdLine && *lpCmdLine && !lstrcmp(lpCmdLine, TEXT("-1"))) { // -1 means Performance Options cpl
DoPerformancePS(NULL); } else { HPROPSHEETPAGE hPages[MAX_PAGES]; PROPSHEETHEADER psh; UINT iPage = 0; HPSXA hpsxa = NULL; INT i; INT iStartPage; TCHAR szStartPage[MAX_PATH];
ZeroMemory(&psh, sizeof(psh));
if (SUCCEEDED(hrOle)) { // this call is needed to allow the WMI calls to get the processor information
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0); }
LinkWindow_RegisterClass();
psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = 0; psh.hwndParent = hwnd; psh.hInstance = hInstance; psh.pszCaption = MAKEINTRESOURCE(IDS_TITLE); psh.phpage = hPages;
for (i = 0; i < ARRAYSIZE(c_pspCB); i++) { hPages[iPage] = c_pspCB[i].pfnCreatePage(c_pspCB[i].idd, c_pspCB[i].pfnDlgProc); if (hPages[iPage] != NULL) { iPage++; } }
psh.nPages = iPage;
// add any extra property pages from the shell ext hooks in the registry
// 8 extensions should be enough. Desk.cpl also does the same.
hpsxa = SHCreatePropSheetExtArray( HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\System"), 8 ); if (hpsxa != NULL ) SHAddFromPropSheetExtArray( hpsxa, _AddPropSheetPage, (LPARAM)&psh );
szStartPage[0] = 0; _GetStartingPage(lpCmdLine, &psh, &iStartPage, szStartPage, ARRAYSIZE(szStartPage)); if (szStartPage[0]) { psh.dwFlags |= PSH_USEPSTARTPAGE; psh.pStartPage = szStartPage; } else { psh.nStartPage = iStartPage; }
if (PropertySheet (&psh) == ID_PSREBOOTSYSTEM) { RestartDialogEx(hwnd, NULL, EWX_REBOOT, SHTDN_REASON_MAJOR_SYSTEM | SHTDN_REASON_MINOR_RECONFIG | SHTDN_REASON_FLAG_PLANNED); }
if (hpsxa != NULL) SHDestroyPropSheetExtArray(hpsxa); LinkWindow_UnregisterClass(hInstance); } }
if (SUCCEEDED(hrOle)) { CoUninitialize(); } }
BOOL CALLBACK _AddPropSheetPage(HPROPSHEETPAGE hpage, LPARAM lParam) { PROPSHEETHEADER FAR * ppsh = (PROPSHEETHEADER FAR *)lParam;
if( hpage && ( ppsh->nPages < MAX_PAGES ) ) { ppsh->phpage[ppsh->nPages++] = hpage; return TRUE; } return FALSE; }
void _GetStartingPage(IN LPTSTR lpCmdLine, IN PROPSHEETHEADER* ppsh, INT* piStartPage, LPTSTR pszStartPage, INT cchStartPage) { *piStartPage = 0; if (lpCmdLine && *lpCmdLine) { if (!StrToIntEx(lpCmdLine, STIF_DEFAULT, piStartPage) && (*lpCmdLine == TEXT('@'))) { LPTSTR pszComma = StrChr(lpCmdLine, TEXT(',')); if (pszComma) { HINSTANCE hInstanceDLL; *pszComma = 0; hInstanceDLL = LoadLibrary(lpCmdLine + 1); if (hInstanceDLL) { UINT idResource = StrToInt(++pszComma); LoadString(hInstanceDLL, idResource, pszStartPage, cchStartPage); FreeLibrary(hInstanceDLL); } } } } }
|