mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
526 lines
12 KiB
526 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
I_logCac.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the routines to implement:
|
|
|
|
Item: Logon Cache
|
|
Area: System Access
|
|
|
|
|
|
Author:
|
|
|
|
Jim Kelly (JimK) 22-Mar-1995
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "Missyp.h"
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Local Function Prototypes //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
MissypMarkLogonCacheValueCurrent(
|
|
OUT PULONG Recommendation
|
|
);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Module-Wide variables //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
PSECMGR_AREA_DESCRIPTOR
|
|
MissypLogonCacheArea;
|
|
|
|
PSECMGR_ITEM_DESCRIPTOR
|
|
MissypLogonCacheItem;
|
|
|
|
|
|
WCHAR
|
|
MissypLogonCacheName[SECMGR_MAX_ITEM_NAME_LENGTH],
|
|
MissypLogonCacheDesc[SECMGR_MAX_ITEM_DESC_LENGTH];
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Externally callable functions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
MissypLogonCacheInitialize(
|
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|
IN PSECMGR_ITEM_DESCRIPTOR Item,
|
|
IN ULONG ItemIndex
|
|
)
|
|
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function is called to initialize this item during Missy initialization
|
|
This routine is responsible for allocating and filling in an Item control
|
|
block for this item and adding it to the array of items in the Area control
|
|
block.
|
|
|
|
|
|
Arguments
|
|
|
|
Area - points to the Area control block that this item is to
|
|
be added to.
|
|
|
|
ItemIndex - The index of this item in the Area control block.
|
|
|
|
ItemIndex - The index of the item in the array of items for this area.
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - The call completed successfully.
|
|
|
|
FALSE - Something went wrong. GetLastError() contains
|
|
details on the exact cause of the error.
|
|
|
|
--*/
|
|
{
|
|
|
|
//
|
|
// Save away pointers to the area and our item
|
|
//
|
|
|
|
MissypLogonCacheArea = Area;
|
|
MissypLogonCacheItem = Item;
|
|
|
|
//
|
|
// Get the name and description strings
|
|
//
|
|
|
|
LoadString( MissyphInstance,
|
|
MISSYP_STRING_ITEM_LOGON_CACHE_NAME,
|
|
&MissypLogonCacheName[0],
|
|
SECMGR_MAX_ITEM_NAME_LENGTH
|
|
);
|
|
LoadString( MissyphInstance,
|
|
MISSYP_STRING_ITEM_LOGON_CACHE_DESC,
|
|
&MissypLogonCacheDesc[0],
|
|
SECMGR_MAX_ITEM_DESC_LENGTH
|
|
);
|
|
|
|
//
|
|
// Set the flags as such:
|
|
//
|
|
// Item view editing is allowed.
|
|
// Area view editing IS allowed.
|
|
// The value is NOT complex - may be displayed in spreadsheet mode.
|
|
// The value is NOT current (has not be retrieved yet).
|
|
//
|
|
|
|
Item->Flags = (SECMGR_ITEM_FLAG_AREA_VIEW |
|
|
SECMGR_ITEM_FLAG_ITEM_VIEW);
|
|
|
|
|
|
//
|
|
// Now the rest of the fields.
|
|
// Value and RecommendedValue are not yet available.
|
|
//
|
|
|
|
Item->Area = Area;
|
|
Item->ItemIndex = ItemIndex;
|
|
Item->SecMgrContext = NULL; // Not for our use
|
|
Item->SmedlyContext = NULL; // We don't use this
|
|
Item->Name = &MissypLogonCacheName[0];
|
|
Item->Description = &MissypLogonCacheDesc[0];
|
|
Item->Type = SecMgrTypeUlong;
|
|
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
|
BOOL
|
|
MissypInvokeLogonCache(
|
|
IN HWND hwnd,
|
|
IN BOOL AllowChanges,
|
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|
IN PSECMGR_ITEM_DESCRIPTOR Item
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is used to obtain a view of just the legal notice
|
|
item.
|
|
|
|
|
|
Arguments
|
|
|
|
hwnd - The caller's window. We will put up a child window.
|
|
|
|
AllowChanges - If TRUE, value changes are allowed. Otherwise,
|
|
value changes are not allowed.
|
|
|
|
Area - Pointer to this Area's descriptor.
|
|
|
|
Item - Pointer to our item's descriptor. This will be filled in
|
|
with current values upon exit of this routine.
|
|
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - The dialog was displayed without error.
|
|
|
|
FALSE - we ran into trouble.
|
|
|
|
If an error is encountered, then an error popup will be
|
|
displayed by this routine.
|
|
|
|
--*/
|
|
{
|
|
|
|
DialogBoxParam(MissyphInstance,
|
|
MAKEINTRESOURCE(MISSYP_ID_DLG_ITEM_LOGON_CACHE),
|
|
hwnd,
|
|
(DLGPROC)MissypDlgProcLogonCache,
|
|
(LONG)AllowChanges
|
|
);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
MissypGetLogonCacheCount(
|
|
IN HWND hwnd,
|
|
OUT PULONG Current,
|
|
OUT PULONG Recommendation
|
|
)
|
|
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function is called to retrieve the current logon cache size.
|
|
|
|
This routine also sets the appropriate fields in our Item control
|
|
block.
|
|
|
|
|
|
Arguments
|
|
|
|
hwnd - may be used to put up a pop-up on failure.
|
|
|
|
Current - receives the current cache size.
|
|
|
|
Recommendation - Receives our recommended size.
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - The call completed successfully.
|
|
|
|
FALSE - Something went wrong. GetLastError() contains
|
|
details on the exact cause of the error.
|
|
|
|
--*/
|
|
{
|
|
|
|
//
|
|
// Query the registry key holding the cache size.
|
|
//
|
|
|
|
(*Current) = GetProfileInt(
|
|
TEXT("Winlogon"),
|
|
TEXT("CachedLogonsCount"),
|
|
MISSYP_DEFAULT_LOGON_CACHE_COUNT // Default value
|
|
);
|
|
|
|
//
|
|
// Set the value in our item control block
|
|
//
|
|
|
|
MissypLogonCacheItem->Value.ULong = (*Current);
|
|
|
|
//
|
|
// Mark the value as current (updating our recommendation in the process).
|
|
//
|
|
|
|
MissypMarkLogonCacheValueCurrent(Recommendation);
|
|
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
MissypSetLogonCacheCount(
|
|
IN HWND hwnd,
|
|
IN ULONG Value
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is used to set a new logon cache size.
|
|
As a side effect, it also sets the value in the Item control block and
|
|
resets the "recommended" flag.
|
|
|
|
If the size is different than the current logon cache
|
|
size, then indicate a reboot is necessary.
|
|
|
|
Arguments
|
|
|
|
hwnd - The caller's window. This is used if we need to put
|
|
up an error popup.
|
|
|
|
Value - The new logon cache size.
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - The call completed successfully.
|
|
|
|
FALSE - Something went wrong. GetLastError() contains
|
|
details on the exact cause of the error.
|
|
|
|
If an error is encountered, then an error popup will be
|
|
displayed by this routine.
|
|
|
|
--*/
|
|
{
|
|
BOOLEAN
|
|
Result;
|
|
|
|
UINT
|
|
CurrentSize;
|
|
|
|
ULONG
|
|
Ignore;
|
|
|
|
|
|
//
|
|
// Get the current size so we know if we are changing the
|
|
// value.
|
|
//
|
|
|
|
CurrentSize = GetProfileInt(
|
|
TEXT("Winlogon"),
|
|
TEXT("CachedLogonsCount"),
|
|
MISSYP_DEFAULT_LOGON_CACHE_COUNT // Default value
|
|
);
|
|
|
|
if (CurrentSize == Value) {
|
|
|
|
//
|
|
// Nothing to do
|
|
//
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
//
|
|
// The value is different.
|
|
// Set the new value and indicate that a reboot is necessary.
|
|
//
|
|
|
|
Result = MissypSetProfileInt(
|
|
TEXT("Winlogon"),
|
|
TEXT("CachedLogonsCount"),
|
|
(ULONG)Value
|
|
);
|
|
if (Result) {
|
|
|
|
(*MissypSecMgr->RebootRequired)( );
|
|
|
|
//
|
|
// Update our Item Control Block
|
|
//
|
|
|
|
MissypLogonCacheItem->Value.ULong = Value;
|
|
MissypMarkLogonCacheValueCurrent( &Ignore );
|
|
|
|
} else {
|
|
//
|
|
// Put up a pop-up indicating that a problem occured
|
|
//
|
|
|
|
MissypPopUp( hwnd, MISSYP_POP_UP_CANT_SET_LOGON_CACHE, MISSYP_STRING_TITLE_ERROR);
|
|
}
|
|
|
|
return(Result);
|
|
}
|
|
|
|
|
|
VOID
|
|
MissypUpdateLogonCacheRecommendation(
|
|
OUT PULONG Recommendation OPTIONAL
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function updates our recommended value field and flag.
|
|
|
|
|
|
Arguments
|
|
|
|
Recommendation - If present, receives our recommendation for a system of this type
|
|
at the current security level.
|
|
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
|
|
--*/
|
|
{
|
|
ULONG
|
|
Recommend;
|
|
|
|
|
|
//
|
|
// Set recommendations based upon security level
|
|
//
|
|
|
|
switch (MissypSecMgrControl->SecurityLevel) {
|
|
case SECMGR_LEVEL_HIGH:
|
|
case SECMGR_LEVEL_C2:
|
|
|
|
Recommend = 0;
|
|
break;
|
|
|
|
case SECMGR_LEVEL_STANDARD:
|
|
|
|
switch (MissypProductType) {
|
|
case NtProductWinNt:
|
|
Recommend = 10;
|
|
break;
|
|
|
|
case NtProductServer:
|
|
case NtProductLanManNt:
|
|
Recommend = 0;
|
|
break;
|
|
|
|
default:
|
|
Recommend = 0;
|
|
break;
|
|
} // end_switch
|
|
break;
|
|
|
|
case SECMGR_LEVEL_LOW:
|
|
Recommend = 40;
|
|
break;
|
|
|
|
default:
|
|
SetLastError( ERROR_INVALID_LEVEL );
|
|
return;
|
|
|
|
} //end_switch
|
|
|
|
|
|
MissypLogonCacheItem->RecommendedValue.ULong = Recommend;
|
|
|
|
//
|
|
// Indicate whether the current value is the recommended
|
|
// value.
|
|
//
|
|
|
|
if (MissypLogonCacheItem->Value.ULong == MissypLogonCacheItem->RecommendedValue.ULong ) {
|
|
MissypLogonCacheItem->Flags |= SECMGR_ITEM_FLAG_VALUE_RECOMMENDED; //Recommended value
|
|
} else {
|
|
MissypLogonCacheItem->Flags &= (~SECMGR_ITEM_FLAG_VALUE_RECOMMENDED); //Not recommended value
|
|
|
|
//
|
|
// Is it stronger or weaker than the recommended value (fewer entries is stronger)
|
|
//
|
|
|
|
if (MissypLogonCacheItem->Value.ULong < MissypLogonCacheItem->RecommendedValue.ULong) {
|
|
MissypLogonCacheItem->Flags |= SECMGR_ITEM_FLAG_VALUE_STRONGER;
|
|
} else {
|
|
MissypLogonCacheItem->Flags &= (~SECMGR_ITEM_FLAG_VALUE_STRONGER);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Return the recommendation if requested
|
|
//
|
|
|
|
if (ARGUMENT_PRESENT(Recommendation)) {
|
|
(*Recommendation) = Recommend;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Locally callable functions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
VOID
|
|
MissypMarkLogonCacheValueCurrent(
|
|
OUT PULONG Recommendation
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function updates our recommended value field and flag and sets
|
|
the logon cache value as CURRENT.
|
|
|
|
Arguments
|
|
|
|
Recommendation - Receives our recommendation for a system of this type
|
|
at the current security level.
|
|
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
|
|
--*/
|
|
{
|
|
ULONG
|
|
Recommend;
|
|
|
|
|
|
//
|
|
// Set recommendations based upon security level
|
|
//
|
|
|
|
MissypUpdateLogonCacheRecommendation( Recommendation );
|
|
|
|
|
|
//
|
|
// Indicate we have a value
|
|
//
|
|
|
|
MissypLogonCacheItem->Flags |= SECMGR_ITEM_FLAG_VALUE_CURRENT;
|
|
|
|
return;
|
|
}
|