windows-nt/Source/XPSP1/NT/printscan/fax/admin/faxclient/cpl/faxcpl.c
2020-09-26 16:20:57 +08:00

370 lines
6.7 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
faxcpl.c
Abstract:
Implementation of the control panel applet entry point
Environment:
Windows NT fax configuration applet
Revision History:
02/27/96 -davidx-
Created it.
05/22/96 -davidx-
Share the same DLL with remote admin program.
mm/dd/yy -author-
description
--*/
#include <windows.h>
#include <commctrl.h>
#include <cpl.h>
#include <stdlib.h>
#include <tchar.h>
#include "faxcfg.h"
#include "resource.h"
#include "faxcfgrs.h"
//
// Definition of global variables
//
HINSTANCE ghInstance;
UINT_PTR UserInfoDlgProc(HWND, UINT, WPARAM, LPARAM);
UINT_PTR StatusOptionsProc(HWND, UINT, WPARAM, LPARAM);
UINT_PTR ClientCoverPageProc(HWND, UINT, WPARAM, LPARAM);
UINT_PTR AdvancedOptionsProc(HWND, UINT, WPARAM, LPARAM);
BOOL
IsPriviledgedAccount(
VOID
);
BOOL
IsUserAdmin(
VOID
);
BOOL
DllEntryPoint(
HINSTANCE hModule,
ULONG ulReason,
PCONTEXT pContext
)
/*++
Routine Description:
DLL initialization procedure.
Arguments:
hModule - DLL instance handle
ulReason - Reason for the call
pContext - Pointer to context (not used by us)
Return Value:
TRUE if DLL is initialized successfully, FALSE otherwise.
--*/
{
switch (ulReason) {
case DLL_PROCESS_ATTACH:
ghInstance = hModule;
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int
FaxConfigGetPages(
HINSTANCE hInstance,
HPROPSHEETPAGE *hPsp,
DWORD Count
)
{
PROPSHEETPAGE psp[4];
BOOL ShowAdvanced;
ZeroMemory( &psp, sizeof(psp) );
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].hInstance = hInstance;
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_USER_INFO);
psp[0].pfnDlgProc = UserInfoDlgProc;
psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].hInstance = hInstance;
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_CLIENT_COVERPG);
psp[1].pfnDlgProc = ClientCoverPageProc;
psp[2].dwSize = sizeof(PROPSHEETPAGE);
psp[2].hInstance = hInstance;
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_STATUS_OPTIONS);
psp[2].pfnDlgProc = StatusOptionsProc;
hPsp[0] = CreatePropertySheetPage( &psp[0] );
hPsp[1] = CreatePropertySheetPage( &psp[1] );
hPsp[2] = CreatePropertySheetPage( &psp[2] );
ShowAdvanced = IsPriviledgedAccount();
if (ShowAdvanced) {
psp[3].dwSize = sizeof(PROPSHEETPAGE);
psp[3].hInstance = hInstance;
psp[3].pszTemplate = MAKEINTRESOURCE(IDD_ADVANCED_OPTIONS);
psp[3].pfnDlgProc = AdvancedOptionsProc;
hPsp[3] = CreatePropertySheetPage( &psp[3] );
}
return ShowAdvanced ? 4 : 3;
}
INT
DoFaxConfiguration(
HWND hwndCPl,
LPTSTR pCmdLine
)
/*++
Routine Description:
Display fax configuration dialogs: client, server, or workstation
Arguments:
hwndCPl - Handle to the Control Panel window
Return Value:
0 if successful, -1 if there is an error
--*/
#define MAX_PAGES 16
#define MAX_TITLE_LEN 64
{
HPROPSHEETPAGE hPropSheetPages[MAX_PAGES];
PROPSHEETHEADER psh;
TCHAR dlgTitle[MAX_TITLE_LEN];
INT nPages,nStartPage;
//
// Get an array of property sheet page handles
//
nPages = FaxConfigGetPages( ghInstance, hPropSheetPages, MAX_PAGES );
//
// Fill out PROPSHEETHEADER structure
//
LoadString(ghInstance, IDS_FAX_TITLE, dlgTitle, MAX_TITLE_LEN);
nStartPage = nStartPage = pCmdLine ? _ttol(pCmdLine) : 0;
ZeroMemory( &psh, sizeof(psh) );
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_USEICONID;
psh.hwndParent = hwndCPl;
psh.hInstance = ghInstance;
psh.pszIcon = MAKEINTRESOURCE(IDI_FAX);
psh.pszCaption = dlgTitle;
psh.nPages = nPages;
psh.nStartPage = nStartPage;
psh.phpage = hPropSheetPages;
//
// Display the property sheet
//
return (PropertySheet(&psh) == -1) ? -1 : 0;
}
LONG
CPlApplet(
HWND hwndCPl,
UINT uMsg,
LPARAM lParam1,
LPARAM lParam2
)
/*++
Routine Description:
Control panel applet entry point
Arguments:
hwndCPl - Identifies the Control Panel window
uMsg - Specifies the message being sent to the Control Panel applet
lParam1 - Specifies additional message-specific information
lParam2 - Specifies additional message-specific information
Return Value:
Depends on the message
--*/
{
static BOOL Failed = FALSE;
switch (uMsg) {
case CPL_INIT:
return 1;
case CPL_GETCOUNT:
return 1;
case CPL_INQUIRE:
((CPLINFO*)lParam2)->lData = 0;
((CPLINFO*)lParam2)->idIcon = IDI_FAX;
((CPLINFO*)lParam2)->idName = IDS_FAX;
((CPLINFO*)lParam2)->idInfo = IDS_CONFIG_FAX;
return 0;
case CPL_DBLCLK:
//
// Treat this as CPL_STARTWPARMS with no parameter
//
if (Failed) {
return 1;
}
return DoFaxConfiguration(hwndCPl,NULL);
case CPL_STARTWPARMS:
//
// Display fax configuration dialog: client, server, or workstation
//
if (!DoFaxConfiguration(hwndCPl,(LPTSTR) lParam2)) {
Failed = TRUE;
return 1;
}
return 0;
case CPL_EXIT:
break;
}
return 0;
}
BOOL
IsPriviledgedAccount(
VOID
)
/*++
Routine Description:
Determines if the currently logged on account is priviledged. If it is priviledged, then
we show the advanced tab in the control panel. I'm still not sure what the priviledge
check will be.
Arguments:
NONE.
Return Value:
TRUE if account is priviledged
--*/
{
return IsUserAdmin();
}
//
// stolen from setupapi\security.c, so that we don't have to link to setupapi...
//
BOOL
IsUserAdmin(
VOID
)
/*++
Routine Description:
This routine returns TRUE if the caller's process is a
member of the Administrators local group.
Caller is NOT expected to be impersonating anyone and IS
expected to be able to open their own process and process
token.
Arguments:
None.
Return Value:
TRUE - Caller has Administrators local group.
FALSE - Caller does not have Administrators local group.
--*/
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup
);
if(b) {
if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) {
b = FALSE;
}
FreeSid(AdministratorsGroup);
}
return(b);
}