1253 lines
29 KiB
C
1253 lines
29 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
itemlist.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains routines related to the [List All...] dialog
|
|||
|
of the [CONFIGURE...] dialog.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Kelly (JimK) 22-Mar-1995
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#include <secmgrp.h>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Local definitions //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#define SECMGRP_ITEM_LIST_TAB_COUNT (5)
|
|||
|
|
|||
|
//
|
|||
|
// List Box font description
|
|||
|
//
|
|||
|
|
|||
|
#define SECMGRP_LB_FONT_FACE (TEXT("Helv"))
|
|||
|
#define SECMGRP_LB_FONT_HEIGHT 12
|
|||
|
#define SECMGRP_LB_FONT_WIDTH 0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Local Function Prototypes //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
LONG
|
|||
|
SecMgrpDlgProcListAll(
|
|||
|
IN HWND hwnd,
|
|||
|
IN UINT wMsg,
|
|||
|
IN DWORD wParam,
|
|||
|
IN LONG lParam
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpDoubleClickProc(
|
|||
|
IN HWND hwnd
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpButtonViewDetailsProc(
|
|||
|
IN HWND hwnd
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpGetListBoxEntryByIndex(
|
|||
|
IN WORD Index,
|
|||
|
OUT PVOID *Entry,
|
|||
|
OUT PBOOL EntryIsItem
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpInvokeItem(
|
|||
|
IN HWND hwnd,
|
|||
|
IN PSECMGR_ITEM_DESCRIPTOR Item
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpExpandAreaInItemList(
|
|||
|
IN HWND hwnd,
|
|||
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|||
|
IN WORD Index
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpAddItemToListBox(
|
|||
|
IN BOOL ReportOnly,
|
|||
|
IN PSECMGR_ITEM_DESCRIPTOR Item,
|
|||
|
IN WORD Index
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpShrinkAreaInItemList(
|
|||
|
IN HWND hwnd,
|
|||
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|||
|
IN WORD Index
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Module-wide variables //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
HWND
|
|||
|
SecMgrpListBoxHandle;
|
|||
|
|
|||
|
int
|
|||
|
SecMgrpListBoxTabs[SECMGRP_ITEM_LIST_TAB_COUNT] = {32, 250, 254, 258, 260};
|
|||
|
|
|||
|
HFONT
|
|||
|
SecMgrpListBoxFont;
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Externally callable functions //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpButtonListAll(
|
|||
|
IN HWND hwnd
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is used to display the Configure System Security dialog.
|
|||
|
This is tricky because there are actually several such dialogs. We
|
|||
|
must choose the right one based upon the number of areas that we have
|
|||
|
to present. Then we must set the names of the buttons in the dialog
|
|||
|
to match the names of the areas.
|
|||
|
|
|||
|
Arguments
|
|||
|
|
|||
|
hwnd - window handle.
|
|||
|
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
DialogBoxParam(SecMgrphInstance,
|
|||
|
MAKEINTRESOURCE(SECMGR_ID_DLG_SECURITY_ITEMS),
|
|||
|
hwnd,
|
|||
|
(DLGPROC)SecMgrpDlgProcListAll,
|
|||
|
(LPARAM)0);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpFillInItemList(
|
|||
|
IN BOOL ReportOnly,
|
|||
|
IN HWND hwnd
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is used to either:
|
|||
|
|
|||
|
1) fill in the item list-box and set the cursor to the first
|
|||
|
entry in the list.
|
|||
|
or
|
|||
|
2) Write the item-list entries to the report file.
|
|||
|
|
|||
|
If we are to fill in the item list box, then SecMgrpListBoxHandle is
|
|||
|
expected to be a valid handle to the list box.
|
|||
|
|
|||
|
|
|||
|
WARNING - Care should be taken that this routine is NOT called
|
|||
|
upon to report values when the list box is already
|
|||
|
visible.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ReportOnly - If TRUE indicates that this routine is being called
|
|||
|
to place a summary in the report file rather than in a list
|
|||
|
window. Othwerwise (FALSE), present the information to the
|
|||
|
list box.
|
|||
|
|
|||
|
hwnd - window handle of parent window.
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
TCHAR
|
|||
|
Buffer[500];
|
|||
|
|
|||
|
WORD
|
|||
|
Index,
|
|||
|
i,
|
|||
|
j;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Fill in the list box
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
if (!ReportOnly) {
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, FALSE, 0L);
|
|||
|
}
|
|||
|
Index = 0;
|
|||
|
for (i=0; i<SecMgrpAreaCount; i++) {
|
|||
|
|
|||
|
wsprintf( Buffer, L"%s - %s", SecMgrpAreas[i]->Name, SecMgrpAreas[i]->Description );
|
|||
|
//SecMgrpAreas[i]->Flags |= SECMGRP_AREA_FLAG_AREA_EXPANDED; // Area is initially displayed in Expanded form
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// If this area has not yet had an opportunity to initialize its values, then provide
|
|||
|
// that opportunity now.
|
|||
|
//
|
|||
|
|
|||
|
if (!(SecMgrpAreas[i]->Flags & SECMGRP_AREA_FLAG_AREA_INITIALIZED)) {
|
|||
|
SecMgrpInvokeArea( hwnd, SecMgrpAreas[i]->AreaIndex, FALSE ); // Non-interactive
|
|||
|
SecMgrpAreas[i]->Flags |= SECMGRP_AREA_FLAG_AREA_INITIALIZED;
|
|||
|
}
|
|||
|
|
|||
|
if (ReportOnly) {
|
|||
|
SecMgrPrintReportLine( Buffer );
|
|||
|
SecMgrPrintReportLine( L"\n" );
|
|||
|
} else {
|
|||
|
SendMessage( SecMgrpListBoxHandle, LB_INSERTSTRING, Index, (LONG)(LPSTR)Buffer );
|
|||
|
}
|
|||
|
Index++;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// If the area is currently expanded, or we are generating a report,
|
|||
|
// then list its items.
|
|||
|
//
|
|||
|
|
|||
|
if ((SecMgrpAreas[i]->Flags & SECMGRP_AREA_FLAG_AREA_EXPANDED) ||
|
|||
|
(ReportOnly) ) {
|
|||
|
|
|||
|
for (j=0; j<SecMgrpAreas[i]->ItemCount; j++) {
|
|||
|
|
|||
|
SecMgrpAddItemToListBox( ReportOnly, &SecMgrpAreas[i]->Items[j], Index );
|
|||
|
Index++;
|
|||
|
}
|
|||
|
if (ReportOnly) {
|
|||
|
SecMgrPrintReportLine( L"\n" );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (!ReportOnly) {
|
|||
|
|
|||
|
//
|
|||
|
// Set the cursor
|
|||
|
//
|
|||
|
|
|||
|
SendMessage( SecMgrpListBoxHandle, LB_SETCURSEL, 0, 0);
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, TRUE, 0L);
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Module-wide functions //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
LONG
|
|||
|
SecMgrpDlgProcListAll(
|
|||
|
IN HWND hwnd,
|
|||
|
IN UINT wMsg,
|
|||
|
IN DWORD wParam,
|
|||
|
IN LONG lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is the dialog process for the [List All...] button of the
|
|||
|
[CONFIGURE...] dialog
|
|||
|
|
|||
|
Arguments
|
|||
|
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
TRUE - the message was handled.
|
|||
|
|
|||
|
FALSE - the message was not handled.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HWND
|
|||
|
Control,
|
|||
|
Button;
|
|||
|
|
|||
|
LOGFONT
|
|||
|
FontDescription;
|
|||
|
|
|||
|
|
|||
|
WORD
|
|||
|
NotificationCode,
|
|||
|
ControlId;
|
|||
|
|
|||
|
switch (wMsg) {
|
|||
|
|
|||
|
case WM_INITDIALOG:
|
|||
|
|
|||
|
//
|
|||
|
// Set the security level
|
|||
|
//
|
|||
|
|
|||
|
SecMgrpSetSecurityLevel( hwnd, FALSE, SECMGR_ID_ICON_SECURITY_LEVEL);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Get the list-box's handle
|
|||
|
//
|
|||
|
|
|||
|
SecMgrpListBoxHandle = GetDlgItem(hwnd, SECMGR_ID_LISTBOX_ITEM_LIST);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Set the list box font
|
|||
|
//
|
|||
|
|
|||
|
memset (&FontDescription, 0, sizeof(FontDescription));
|
|||
|
FontDescription.lfHeight = SECMGRP_LB_FONT_HEIGHT;
|
|||
|
FontDescription.lfWidth = SECMGRP_LB_FONT_WIDTH;
|
|||
|
lstrcpy (FontDescription.lfFaceName, SECMGRP_LB_FONT_FACE);
|
|||
|
|
|||
|
SecMgrpListBoxFont = CreateFontIndirect (&FontDescription);
|
|||
|
|
|||
|
SendMessage(SecMgrpListBoxHandle,
|
|||
|
WM_SETFONT,
|
|||
|
(WPARAM)SecMgrpListBoxFont,
|
|||
|
(LPARAM)0 // don't redraw right now
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Set the list box tab-stops
|
|||
|
//
|
|||
|
|
|||
|
SendMessage(SecMgrpListBoxHandle,
|
|||
|
LB_SETTABSTOPS,
|
|||
|
(WPARAM)SECMGRP_ITEM_LIST_TAB_COUNT, // Number of tab stops
|
|||
|
(LPARAM)SecMgrpListBoxTabs // Tab stop pixel locations
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
SecMgrpFillInItemList( FALSE, hwnd );
|
|||
|
|
|||
|
SetForegroundWindow(hwnd);
|
|||
|
ShowWindow(hwnd, SW_NORMAL);
|
|||
|
|
|||
|
|
|||
|
return(TRUE);
|
|||
|
|
|||
|
case WM_SYSCOMMAND:
|
|||
|
switch (wParam & 0xfff0) {
|
|||
|
case SC_CLOSE:
|
|||
|
EndDialog(hwnd, 0);
|
|||
|
DeleteObject( SecMgrpListBoxFont );
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
return(FALSE);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
|
|||
|
//
|
|||
|
// wParam WIN32- HIWORD = notification code,
|
|||
|
// LOWORD = ID of control
|
|||
|
// WIN16- ID of control
|
|||
|
//
|
|||
|
// lParam WIN32- hWnd of Control
|
|||
|
// WIN16- HIWORD = notification code
|
|||
|
// LOWORD = hWnd of control
|
|||
|
//
|
|||
|
|
|||
|
//NotificationCode = GET_NOTIFY_MSG(wParam, lParam);
|
|||
|
//ControlId = GET_CONTROL_ID(wParam);
|
|||
|
NotificationCode = HIWORD(wParam);
|
|||
|
ControlId = LOWORD(wParam);
|
|||
|
|
|||
|
//
|
|||
|
// See if the command is related to our list box...
|
|||
|
// If so, wParam is the Child window ID and HIWORD(lParam)
|
|||
|
// contains the notification code.
|
|||
|
//
|
|||
|
|
|||
|
if (ControlId == SECMGR_ID_LISTBOX_ITEM_LIST) {
|
|||
|
|
|||
|
//
|
|||
|
// If it is a double-click, process it.
|
|||
|
// Otherwise, don't process it.
|
|||
|
//
|
|||
|
|
|||
|
if (NotificationCode == LBN_DBLCLK) {
|
|||
|
|
|||
|
SecMgrpDoubleClickProc( hwnd );
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Not a list-box command that we process
|
|||
|
//
|
|||
|
|
|||
|
return(FALSE);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// not a list box command
|
|||
|
//
|
|||
|
|
|||
|
switch(ControlId) {
|
|||
|
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
case IDOK:
|
|||
|
EndDialog(hwnd, 0);
|
|||
|
DeleteObject( SecMgrpListBoxFont );
|
|||
|
return(TRUE);
|
|||
|
|
|||
|
|
|||
|
case SECMGR_ID_BUTTON_VIEW_DETAILS:
|
|||
|
|
|||
|
SecMgrpButtonViewDetailsProc( hwnd );
|
|||
|
return(TRUE);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpDoubleClickProc(
|
|||
|
IN HWND hwnd
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function implements the double-click function for the list box.
|
|||
|
|
|||
|
A double-click means one of two things:
|
|||
|
|
|||
|
1) If an Area is selected, then it collapses the area (so no items are
|
|||
|
displayed) or expands the area (so items are displayed).
|
|||
|
|
|||
|
2) If an item is selected, then that item is activated. If the item can't
|
|||
|
be activated, then a popup is presented indicating this situation.
|
|||
|
|
|||
|
|
|||
|
Arguments
|
|||
|
|
|||
|
hwnd - Handle to the dialog box.
|
|||
|
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
WORD
|
|||
|
Index;
|
|||
|
|
|||
|
PVOID
|
|||
|
Entry;
|
|||
|
|
|||
|
BOOL
|
|||
|
EntryIsItem;
|
|||
|
|
|||
|
PSECMGR_AREA_DESCRIPTOR
|
|||
|
Area;
|
|||
|
|
|||
|
PSECMGR_ITEM_DESCRIPTOR
|
|||
|
Item;
|
|||
|
|
|||
|
//
|
|||
|
// Get the index of the selected line
|
|||
|
//
|
|||
|
|
|||
|
Index = (WORD) SendMessage( SecMgrpListBoxHandle, LB_GETCURSEL, 0, 0L);
|
|||
|
DbgPrint("Double Click on line %d\n", Index);
|
|||
|
|
|||
|
//
|
|||
|
// Make sure something is actually selected
|
|||
|
// (not sure how this would happen, but let's cover it anyway.
|
|||
|
//
|
|||
|
|
|||
|
if (Index == LB_ERR) {
|
|||
|
//
|
|||
|
// Nothing selected - use index 0
|
|||
|
//
|
|||
|
|
|||
|
Index = 0;
|
|||
|
}
|
|||
|
|
|||
|
SecMgrpGetListBoxEntryByIndex( Index, &Entry, &EntryIsItem );
|
|||
|
|
|||
|
if (Entry == NULL) {
|
|||
|
|
|||
|
//
|
|||
|
// Not sure how this can happen, but there is no such entry.
|
|||
|
// Well, don't do anything then.
|
|||
|
//
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Caste the passed entry appropriately
|
|||
|
//
|
|||
|
|
|||
|
if (EntryIsItem) {
|
|||
|
Item = (PSECMGR_ITEM_DESCRIPTOR)Entry;
|
|||
|
DbgPrint(" Line is an Item\n");
|
|||
|
} else {
|
|||
|
Area = (PSECMGR_AREA_DESCRIPTOR)Entry;
|
|||
|
DbgPrint(" Line is an Area\n");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// If the entry is an item, invoke it.
|
|||
|
// Otherwise, change the expanded state of the area
|
|||
|
// and repaint our list box.
|
|||
|
|
|||
|
if (EntryIsItem) {
|
|||
|
|
|||
|
SecMgrpInvokeItem( hwnd, Item );
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
Area->Flags ^= SECMGRP_AREA_FLAG_AREA_EXPANDED; // Flip the Expanded flag
|
|||
|
if (Area->Flags & SECMGRP_AREA_FLAG_AREA_EXPANDED) {
|
|||
|
DbgPrint(" Expanding area ...\n");
|
|||
|
SecMgrpExpandAreaInItemList( hwnd, Area, Index);
|
|||
|
} else {
|
|||
|
SecMgrpShrinkAreaInItemList( hwnd, Area, Index);
|
|||
|
DbgPrint(" Shrinking area ...\n");
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpButtonViewDetailsProc(
|
|||
|
IN HWND hwnd
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function implements the [View Details...] button for the Item List dialog.
|
|||
|
|
|||
|
This button means one of two things:
|
|||
|
|
|||
|
1) If an Area is selected, then it invokes that area in Area View mode.
|
|||
|
|
|||
|
2) If an item is selected, then only that item is activated. If the item can't
|
|||
|
be activated, then a popup is presented indicating this situation.
|
|||
|
|
|||
|
|
|||
|
Arguments
|
|||
|
|
|||
|
hwnd - Handle to the dialog box.
|
|||
|
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
WORD
|
|||
|
Index;
|
|||
|
|
|||
|
PVOID
|
|||
|
Entry;
|
|||
|
|
|||
|
BOOL
|
|||
|
EntryIsItem;
|
|||
|
|
|||
|
PSECMGR_AREA_DESCRIPTOR
|
|||
|
Area;
|
|||
|
|
|||
|
PSECMGR_ITEM_DESCRIPTOR
|
|||
|
Item;
|
|||
|
|
|||
|
//
|
|||
|
// Get the index of the selected line
|
|||
|
//
|
|||
|
|
|||
|
Index = (WORD) SendMessage( SecMgrpListBoxHandle, LB_GETCURSEL, 0, 0L);
|
|||
|
|
|||
|
//
|
|||
|
// Make sure something is actually selected
|
|||
|
// (not sure how this would happen, but let's cover it anyway.
|
|||
|
//
|
|||
|
|
|||
|
if (Index == LB_ERR) {
|
|||
|
//
|
|||
|
// Nothing selected - use index 0
|
|||
|
//
|
|||
|
|
|||
|
Index = 0;
|
|||
|
}
|
|||
|
|
|||
|
SecMgrpGetListBoxEntryByIndex( Index, &Entry, &EntryIsItem );
|
|||
|
|
|||
|
if (Entry == NULL) {
|
|||
|
|
|||
|
//
|
|||
|
// Not sure how this can happen, but there is no such entry.
|
|||
|
// Well, don't do anything then.
|
|||
|
//
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Caste the passed entry appropriately
|
|||
|
//
|
|||
|
|
|||
|
if (EntryIsItem) {
|
|||
|
Item = (PSECMGR_ITEM_DESCRIPTOR)Entry;
|
|||
|
} else {
|
|||
|
Area = (PSECMGR_AREA_DESCRIPTOR)Entry;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (EntryIsItem) {
|
|||
|
SecMgrpInvokeItem( hwnd, Item );
|
|||
|
|
|||
|
} else {
|
|||
|
SecMgrpInvokeArea( hwnd, Area->AreaIndex, TRUE );
|
|||
|
|
|||
|
//
|
|||
|
// Now cause the list box values to be updated (if they are displayed)
|
|||
|
//
|
|||
|
|
|||
|
if (Area->Flags & SECMGRP_AREA_FLAG_AREA_EXPANDED) {
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, FALSE, 0L);
|
|||
|
SecMgrpShrinkAreaInItemList( hwnd, Area, Index );
|
|||
|
SecMgrpExpandAreaInItemList( hwnd, Area, Index );
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, TRUE, 0L);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpGetListBoxEntryByIndex(
|
|||
|
IN WORD Index,
|
|||
|
OUT PVOID *Entry,
|
|||
|
OUT PBOOL EntryIsItem
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function gets a pointer to an SECMGR_AREA_DESCRIPTOR or SECMGR_ITEM_DESCRIPTOR
|
|||
|
of the item in the item list whose index is specified by Index.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Index - the index of the entry to get. This corresponds to the line
|
|||
|
number of the entry in the list box.
|
|||
|
|
|||
|
Entry - receives a pointer to the area or item descriptor.
|
|||
|
|
|||
|
EntryIsItem - receives TRUE if the returned pointer is to an Item.
|
|||
|
Otherwise (pointer is to an Area) the value will be returned as
|
|||
|
FALSE.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
DWORD
|
|||
|
CurrentIndex,
|
|||
|
i,
|
|||
|
j;
|
|||
|
|
|||
|
PSECMGR_AREA_DESCRIPTOR
|
|||
|
NextArea;
|
|||
|
|
|||
|
PSECMGR_ITEM_DESCRIPTOR
|
|||
|
NextItem;
|
|||
|
|
|||
|
CurrentIndex = 0;
|
|||
|
NextArea = SecMgrpAreas[CurrentIndex];
|
|||
|
for (i=0; ((i<SecMgrpAreaCount) && (CurrentIndex < Index)); i++, CurrentIndex++) {
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// If the area is currently expanded, then check its items.
|
|||
|
// Otherwise, go on to the next area.
|
|||
|
//
|
|||
|
|
|||
|
if (SecMgrpAreas[i]->Flags & SECMGRP_AREA_FLAG_AREA_EXPANDED) {
|
|||
|
DbgPrint("Get entry by index: line %d is an expanded area\n");
|
|||
|
|
|||
|
//
|
|||
|
// If this area has items, add them to the current index or select the one that
|
|||
|
// matches the specified index (if it is in this area).
|
|||
|
//
|
|||
|
|
|||
|
if (CurrentIndex + SecMgrpAreas[i]->ItemCount >= Index) {
|
|||
|
|
|||
|
//
|
|||
|
// Item is in this area
|
|||
|
// Return it
|
|||
|
//
|
|||
|
|
|||
|
(*Entry) = (PVOID)(&SecMgrpAreas[i]->Items[Index - CurrentIndex - 1]);
|
|||
|
(*EntryIsItem) = TRUE;
|
|||
|
return;
|
|||
|
|
|||
|
} else {
|
|||
|
DbgPrint("Get entry by index: line %d is a contracted area\n");
|
|||
|
|
|||
|
//
|
|||
|
// not in this area
|
|||
|
// Increase the CurrentIndex by the number of entries in this area.
|
|||
|
//
|
|||
|
|
|||
|
CurrentIndex += SecMgrpAreas[i]->ItemCount;
|
|||
|
|
|||
|
} // end_if (item in area)
|
|||
|
} // end_if (expanded)
|
|||
|
} // end_for
|
|||
|
|
|||
|
//
|
|||
|
// selected line isn't an item
|
|||
|
//
|
|||
|
|
|||
|
(*EntryIsItem) = FALSE;
|
|||
|
|
|||
|
//
|
|||
|
// CurrentIndex is expected to be equal to Index
|
|||
|
// Not sure how this could be different, but cover it just in case.
|
|||
|
//
|
|||
|
|
|||
|
if (CurrentIndex == Index) {
|
|||
|
(*Entry) = (PVOID)(SecMgrpAreas[i]);
|
|||
|
} else {
|
|||
|
(*Entry) = (PVOID)(SecMgrpAreas[0]);
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpExpandAreaInItemList(
|
|||
|
IN HWND hwnd,
|
|||
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|||
|
IN WORD Index
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function adds the items of a specified area to the item list-box.
|
|||
|
It also sets the cursor to the entry specified by Index.
|
|||
|
|
|||
|
SecMgrpListBoxHandle is expected to be a valid handle to the list box.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hwnd - window handle of parent window.
|
|||
|
|
|||
|
Area - The area whose items are to be added to the list box.
|
|||
|
|
|||
|
Index - The index of the area in the current list-box. This will be where
|
|||
|
the cursor is set upon completion of this call.
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
WORD
|
|||
|
TargetLine;
|
|||
|
|
|||
|
DWORD
|
|||
|
i;
|
|||
|
|
|||
|
if (Area->ItemCount == 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, FALSE, 0L);
|
|||
|
|
|||
|
|
|||
|
TargetLine = Index +1;
|
|||
|
for (i=Area->ItemCount; i>0; i--) {
|
|||
|
SecMgrpAddItemToListBox( FALSE, &Area->Items[i-1], TargetLine );
|
|||
|
}
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, TRUE, 0L);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpAddItemToListBox(
|
|||
|
IN BOOL ReportOnly,
|
|||
|
IN PSECMGR_ITEM_DESCRIPTOR Item,
|
|||
|
IN WORD Index
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function places one item's information in the list box at the specified
|
|||
|
index or in the report file.
|
|||
|
|
|||
|
Arguments
|
|||
|
|
|||
|
ReportOnly - When TRUE, indicate the line is to be placed in the Report File,
|
|||
|
not the list box. Othwerwise, (FALSE) the line gets inserted into the
|
|||
|
list box.
|
|||
|
|
|||
|
Item - Points to the item to add.
|
|||
|
|
|||
|
Index - the index of the list box line to add the item to.
|
|||
|
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
TCHAR
|
|||
|
Buffer[600],
|
|||
|
ValueBuffer[124],
|
|||
|
WhoBuffer[60],
|
|||
|
Status[20];
|
|||
|
|
|||
|
Buffer[0] = 0;
|
|||
|
Buffer[1] = 0;
|
|||
|
|
|||
|
//
|
|||
|
// Build up a buffer with all the right information.
|
|||
|
//
|
|||
|
if (!(Item->Flags & SECMGR_ITEM_FLAG_VALUE_CURRENT) ||
|
|||
|
(Item->Flags & SECMGR_ITEM_FLAG_VALUE_COMPLEX) ) {
|
|||
|
|
|||
|
//
|
|||
|
// Value not current or it is complex and can not be summarized
|
|||
|
//
|
|||
|
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_STATUS_UNKNOWN,
|
|||
|
&Status[0],
|
|||
|
20);
|
|||
|
|
|||
|
if (!(Item->Flags & SECMGR_ITEM_FLAG_VALUE_CURRENT)) {
|
|||
|
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_VALUE_NOT_CURRENT,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
|
|||
|
wsprintf(&Buffer[0],
|
|||
|
L"%s\t%s\t%s",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
ValueBuffer
|
|||
|
);
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// Complex value
|
|||
|
//
|
|||
|
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_VALUE_COMPLEX,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
|
|||
|
wsprintf(&Buffer[0],
|
|||
|
L"%s\t%s\t%s",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
ValueBuffer
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// is it the recommended value?
|
|||
|
//
|
|||
|
|
|||
|
if (Item->Flags & SECMGR_ITEM_FLAG_VALUE_RECOMMENDED) {
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_STATUS_RECOMMENDED,
|
|||
|
&Status[0],
|
|||
|
20);
|
|||
|
} else {
|
|||
|
if (Item->Flags & SECMGR_ITEM_FLAG_VALUE_STRONGER) {
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_STATUS_STRONGER,
|
|||
|
Status,
|
|||
|
20);
|
|||
|
} else {
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_STATUS_NOT_RECOMMENDED,
|
|||
|
Status,
|
|||
|
20);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Current setting value
|
|||
|
//
|
|||
|
|
|||
|
switch (Item->Type) {
|
|||
|
case SecMgrTypeComplex:
|
|||
|
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_VALUE_COMPLEX,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
|
|||
|
wsprintf(&Buffer[0],
|
|||
|
L"%s\t%-50s\t%s",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
ValueBuffer
|
|||
|
);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrTypeUlong:
|
|||
|
wsprintf(&Buffer[0],
|
|||
|
L"%s\t%-50s\t%d",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
Item->Value.ULong
|
|||
|
);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrTypeLong:
|
|||
|
wsprintf(Buffer,
|
|||
|
L"%s\t%-50s\t%d",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
Item->Value.Long
|
|||
|
);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrTypeString:
|
|||
|
wsprintf(Buffer,
|
|||
|
L"%s\t%-50s\t%s",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
Item->Value.String
|
|||
|
);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrTypeWho:
|
|||
|
switch (Item->Value.Who) {
|
|||
|
case SecMgrAnyone:
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_WHO_ANYONE,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrAnyoneLoggedOn:
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_WHO_LOGGED_ON,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrOpersAndAdmins:
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_WHO_OPERS_AND_ADMINS,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrAdminsOnly:
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_WHO_ADMINS,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
break;
|
|||
|
|
|||
|
} // end_switch
|
|||
|
|
|||
|
wsprintf(Buffer,
|
|||
|
L"%s\t%-50s\t%s",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
ValueBuffer
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case SecMgrTypeBool:
|
|||
|
switch (Item->Value.Bool) {
|
|||
|
case TRUE:
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_BOOL_ENABLED,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
break;
|
|||
|
|
|||
|
case FALSE:
|
|||
|
LoadString( SecMgrphInstance,
|
|||
|
SECMGRP_STRING_BOOL_DISABLED,
|
|||
|
ValueBuffer,
|
|||
|
124);
|
|||
|
break;
|
|||
|
} // end_switch
|
|||
|
|
|||
|
wsprintf(Buffer,
|
|||
|
L"%s\t%-50s\t%s",
|
|||
|
Status,
|
|||
|
Item->Description,
|
|||
|
ValueBuffer
|
|||
|
);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
|
|||
|
} // end_switch
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Now put the line in the list box or report file
|
|||
|
//
|
|||
|
|
|||
|
if (ReportOnly) {
|
|||
|
SecMgrPrintReportLine( Buffer );
|
|||
|
SecMgrPrintReportLine( L"\n" );
|
|||
|
} else {
|
|||
|
SendMessage( SecMgrpListBoxHandle, LB_INSERTSTRING, Index, (LONG)(LPSTR)Buffer );
|
|||
|
}
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpShrinkAreaInItemList(
|
|||
|
IN HWND hwnd,
|
|||
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|||
|
IN WORD Index
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function removes the items of a specified area from the item list-box.
|
|||
|
It also sets the cursor to the entry specified by Index.
|
|||
|
|
|||
|
SecMgrpListBoxHandle is expected to be a valid handle to the list box.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hwnd - window handle of parent window.
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DWORD
|
|||
|
i,
|
|||
|
TargetLine;
|
|||
|
|
|||
|
if (Area->ItemCount == 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, FALSE, 0L);
|
|||
|
TargetLine = Index + 1;
|
|||
|
for (i=0; i<Area->ItemCount; i++) {
|
|||
|
SendMessage( SecMgrpListBoxHandle, LB_DELETESTRING, TargetLine, 0L );
|
|||
|
}
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, TRUE, 0L);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SecMgrpInvokeItem(
|
|||
|
IN HWND hwnd,
|
|||
|
IN PSECMGR_ITEM_DESCRIPTOR Item
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hwnd - window handle of parent window.
|
|||
|
|
|||
|
Item - Points to the Item descriptor to invoke.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
BOOL
|
|||
|
Result;
|
|||
|
|
|||
|
WORD
|
|||
|
Index;
|
|||
|
|
|||
|
//
|
|||
|
// See if the item is invokable
|
|||
|
//
|
|||
|
|
|||
|
if (Item->Flags & SECMGR_ITEM_FLAG_ITEM_VIEW) {
|
|||
|
|
|||
|
//
|
|||
|
// Yup - invoke it
|
|||
|
//
|
|||
|
|
|||
|
Result = (*(Item->Area->SmedlyControl->Api->InvokeItem))(
|
|||
|
hwnd,
|
|||
|
SecMgrpAllowChanges,
|
|||
|
Item->Area,
|
|||
|
Item
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Update our display to reflect any new values that might have
|
|||
|
// been assigned or discovered. Remove the line and re-add it
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Get the index of the selected line
|
|||
|
//
|
|||
|
|
|||
|
Index = (WORD) SendMessage( SecMgrpListBoxHandle, LB_GETCURSEL, 0, 0L);
|
|||
|
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, FALSE, 0L);
|
|||
|
SendMessage( SecMgrpListBoxHandle, LB_DELETESTRING, Index, 0L );
|
|||
|
SecMgrpAddItemToListBox( FALSE, Item, Index );
|
|||
|
SendMessage( SecMgrpListBoxHandle, LB_SETCURSEL, Index, 0L);
|
|||
|
SendMessage( SecMgrpListBoxHandle, WM_SETREDRAW, TRUE, 0L);
|
|||
|
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// Nope - put up a popup
|
|||
|
//
|
|||
|
|
|||
|
if (SecMgrpAllowChanges) {
|
|||
|
SecMgrpPopUp( hwnd, SECMGRP_POPUP_USE_AREA_VIEW_1, SECMGRP_POPUP_TITLE_USE_AREA_VIEW_1 );
|
|||
|
} else {
|
|||
|
SecMgrpPopUp( hwnd, SECMGRP_POPUP_USE_AREA_VIEW_2, SECMGRP_POPUP_TITLE_USE_AREA_VIEW_2 );
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
|
|||
|
}
|