Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281/* * PROJECT: ReactOS System Control Panel Applet * LICENSE: GPL - See COPYING in the top level directory * FILE: dll/cpl/sysdm/sysdm.c * PURPOSE: dll entry file * COPYRIGHT: Copyright Thomas Weidenmueller <w3seek@reactos.org> * */
#include "precomp.h"
#include <regstr.h>
static LONG APIENTRY SystemApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam);HINSTANCE hApplet = 0;
/* Applets */APPLET Applets[NUM_APPLETS] ={ {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}};
#define MAX_SYSTEM_PAGES 32
INT __cdeclResourceMessageBox( _In_opt_ HINSTANCE hInstance, _In_opt_ HWND hwnd, _In_ UINT uType, _In_ UINT uCaption, _In_ UINT uText, ...){ va_list args; WCHAR szCaption[MAX_STR_LENGTH]; WCHAR szText[MAX_STR_LENGTH]; WCHAR szCookedText[2*MAX_STR_LENGTH];
LoadStringW(hInstance, uCaption, szCaption, _countof(szCaption)); LoadStringW(hInstance, uText, szText, _countof(szText));
va_start(args, uText); StringCchVPrintfW(szCookedText, _countof(szCookedText), szText, args); va_end(args);
return MessageBoxW(hwnd, szCookedText, szCaption, uType);}
static BOOL CALLBACKPropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam){ PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam; if (ppsh != NULL && ppsh->nPages < MAX_SYSTEM_PAGES) { ppsh->phpage[ppsh->nPages++] = hpage; return TRUE; }
return FALSE;}
static BOOLInitPropSheetPage(PROPSHEETHEADER *ppsh, WORD idDlg, DLGPROC DlgProc){ HPROPSHEETPAGE hPage; PROPSHEETPAGE psp;
if (ppsh->nPages < MAX_SYSTEM_PAGES) { ZeroMemory(&psp, sizeof(psp)); psp.dwSize = sizeof(psp); psp.dwFlags = PSP_DEFAULT; psp.hInstance = hApplet; psp.pszTemplate = MAKEINTRESOURCE(idDlg); psp.pfnDlgProc = DlgProc;
hPage = CreatePropertySheetPage(&psp); if (hPage != NULL) { return PropSheetAddPage(hPage, (LPARAM)ppsh); } }
return FALSE;}
typedef HPROPSHEETPAGE (WINAPI *PCreateNetIDPropertyPage)(VOID);
static HMODULEAddNetIdPage(PROPSHEETHEADER *ppsh){ HPROPSHEETPAGE hPage; HMODULE hMod; PCreateNetIDPropertyPage pCreateNetIdPage;
hMod = LoadLibrary(TEXT("netid.dll")); if (hMod != NULL) { pCreateNetIdPage = (PCreateNetIDPropertyPage)GetProcAddress(hMod, "CreateNetIDPropertyPage"); if (pCreateNetIdPage != NULL) { hPage = pCreateNetIdPage(); if (hPage == NULL) goto Fail;
if (!PropSheetAddPage(hPage, (LPARAM)ppsh)) { DestroyPropertySheetPage(hPage); goto Fail; } } else {Fail: FreeLibrary(hMod); hMod = NULL; } }
return hMod;}
static int CALLBACKPropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam){ // NOTE: This callback is needed to set large icon correctly. HICON hIcon; switch (uMsg) { case PSCB_INITIALIZED: { hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_CPLSYSTEM)); SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); break; } } return 0;}
/* First Applet */LONG CALLBACKSystemApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam){ HPROPSHEETPAGE hpsp[MAX_SYSTEM_PAGES]; PROPSHEETHEADER psh; HMODULE hNetIdDll; HPSXA hpsxa = NULL; INT nPage = 0; LONG Ret; static INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), ICC_LINK_CLASS};
if (!InitCommonControlsEx(&icc)) return 0;
if (uMsg == CPL_STARTWPARMSW && lParam != 0) { nPage = _wtoi((PWSTR)lParam); }
if (nPage == -1) { ShowPerformanceOptions(hwnd); return TRUE; }
ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK; psh.hwndParent = hwnd; psh.hInstance = hApplet; psh.pszIcon = MAKEINTRESOURCEW(IDI_CPLSYSTEM); psh.pszCaption = MAKEINTRESOURCE(IDS_CPLSYSTEMNAME); psh.nPages = 0; psh.nStartPage = 0; psh.phpage = hpsp; psh.pfnCallback = PropSheetProc;
InitPropSheetPage(&psh, IDD_PROPPAGEGENERAL, GeneralPageProc); hNetIdDll = AddNetIdPage(&psh); InitPropSheetPage(&psh, IDD_PROPPAGEHARDWARE, HardwarePageProc); InitPropSheetPage(&psh, IDD_PROPPAGEADVANCED, AdvancedPageProc);
/* Load additional pages provided by shell extensions */ hpsxa = SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\System"), MAX_SYSTEM_PAGES - psh.nPages); if (hpsxa != NULL) { SHAddFromPropSheetExtArray(hpsxa, PropSheetAddPage, (LPARAM)&psh); }
if (nPage != 0 && nPage <= psh.nPages) psh.nStartPage = nPage;
Ret = (LONG)(PropertySheet(&psh) != -1);
if (hpsxa != NULL) { SHDestroyPropSheetExtArray(hpsxa); }
if (hNetIdDll != NULL) FreeLibrary(hNetIdDll);
return Ret;}
/* Control Panel Callback */LONG CALLBACKCPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2){ UINT i = (UINT)lParam1;
UNREFERENCED_PARAMETER(hwndCPl);
switch (uMsg) { case CPL_INIT: return TRUE;
case CPL_GETCOUNT: return NUM_APPLETS;
case CPL_INQUIRE: if (i < NUM_APPLETS) { CPLINFO *CPlInfo = (CPLINFO*)lParam2; CPlInfo->lData = 0; CPlInfo->idIcon = Applets[i].idIcon; CPlInfo->idName = Applets[i].idName; CPlInfo->idInfo = Applets[i].idDescription; } else { return TRUE; } break;
case CPL_DBLCLK: if (i < NUM_APPLETS) Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); else return TRUE; break;
case CPL_STARTWPARMSW: if (i < NUM_APPLETS) return Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); break; }
return FALSE;}
BOOL WINAPIDllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved){ UNREFERENCED_PARAMETER(lpvReserved);
switch (dwReason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: hApplet = hinstDLL; break; }
return TRUE;}