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.
519 lines
12 KiB
519 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
i_name.c
|
|
|
|
Abstract:
|
|
|
|
This module performs actions related to displaying the name of
|
|
the last user to logon at the next logon.
|
|
|
|
Last Logon Name display is controlled by the value of:
|
|
|
|
Key: \Hkey_local_machine\Software\Microsoft\
|
|
Windows NT\CurrentVersion\Winlogon
|
|
Value: [REG_SZ] DontDisplayLastUsername<integer value>
|
|
|
|
Where the defined "<integer value>"'s are:
|
|
|
|
0 - Display last username at logon.
|
|
1 - Don't display the last username at logon.
|
|
|
|
All other values are undefined and will default to "0".
|
|
|
|
|
|
Author:
|
|
|
|
Jim Kelly (JimK) 22-Sep-1994
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "Missyp.h"
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Module-Private Definitions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Module-wide variables //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
PSECMGR_AREA_DESCRIPTOR
|
|
MissypLastNameArea;
|
|
|
|
PSECMGR_ITEM_DESCRIPTOR
|
|
MissypLastNameItem;
|
|
|
|
|
|
WCHAR
|
|
MissypLastNameName[SECMGR_MAX_ITEM_NAME_LENGTH],
|
|
MissypLastNameDesc[SECMGR_MAX_ITEM_DESC_LENGTH];
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Module-Private Prototypes //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
MissypMarkLastNameValueCurrent( VOID );
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Externally callable functions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
MissypLastNameInitialize(
|
|
IN PSECMGR_AREA_DESCRIPTOR Area,
|
|
IN PSECMGR_ITEM_DESCRIPTOR Item,
|
|
IN ULONG ItemIndex
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is used to initialize this module and fill in the passed Item
|
|
control block.
|
|
|
|
|
|
Arguments
|
|
|
|
Area - the security area which this item is part of.
|
|
|
|
Item - points to the item to initialize.
|
|
|
|
ItemIndex - The index of the item in the array of items for this area.
|
|
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - This item has been successfully initialized. However, the
|
|
item value is not yet valid.
|
|
|
|
FALSE - we ran into trouble initializing.
|
|
|
|
--*/
|
|
{
|
|
|
|
//
|
|
// Save away pointers to the area and our item
|
|
//
|
|
|
|
MissypLastNameArea = Area;
|
|
MissypLastNameItem = Item;
|
|
|
|
//
|
|
// Get the name and description strings
|
|
//
|
|
|
|
LoadString( MissyphInstance,
|
|
MISSYP_STRING_ITEM_LASTNAME_NAME,
|
|
&MissypLastNameName[0],
|
|
SECMGR_MAX_ITEM_NAME_LENGTH
|
|
);
|
|
LoadString( MissyphInstance,
|
|
MISSYP_STRING_ITEM_LASTNAME_DESC,
|
|
&MissypLastNameDesc[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 = &MissypLastNameName[0];
|
|
Item->Description = &MissypLastNameDesc[0];
|
|
Item->Type = SecMgrTypeBool;
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
|
BOOL
|
|
MissypInvokeLastName(
|
|
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 last name 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_LAST_USERNAME),
|
|
hwnd,
|
|
(DLGPROC)MissypDlgProcLastName,
|
|
(LONG)AllowChanges
|
|
);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
MissypGetLastNameSetting(
|
|
IN HWND hwnd,
|
|
OUT PBOOL Value
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is used to get the current workstation LastName
|
|
setting.
|
|
|
|
This routine also sets the appropriate fields in our Item control
|
|
block.
|
|
|
|
|
|
Arguments
|
|
|
|
hwnd - The caller's window. This is used if we need to put
|
|
up an error popup.
|
|
|
|
Value - Recieves either TRUE (display last username at logon) or
|
|
FALSE (don't display last username at logon). Default is FALSE.
|
|
NOTE: that this value is opposite what is stored in the registry.
|
|
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - The value has been successfully retrieved.
|
|
|
|
FALSE - we ran into trouble querying the current setting.
|
|
|
|
If an error is encountered, then an error popup will be
|
|
displayed by this routine.
|
|
|
|
--*/
|
|
{
|
|
|
|
BOOL
|
|
DontDisplayLastName;
|
|
|
|
DontDisplayLastName = (BOOL)GetProfileInt( TEXT("Winlogon"), TEXT("DontDisplayLastUsername"), 0);
|
|
|
|
if ((DontDisplayLastName) != FALSE && (DontDisplayLastName != TRUE)) {
|
|
|
|
//
|
|
// Unknown value - set it to TRUE
|
|
//
|
|
|
|
DontDisplayLastName = TRUE;
|
|
|
|
}
|
|
|
|
//
|
|
// Set the value in our item control block
|
|
//
|
|
|
|
MissypLastNameItem->Value.Bool = !DontDisplayLastName;
|
|
(*Value) = !DontDisplayLastName;
|
|
|
|
|
|
//
|
|
// Mark the value as current (updating our recommendation in the process).
|
|
//
|
|
|
|
MissypMarkLastNameValueCurrent();
|
|
|
|
|
|
return( TRUE );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
MissypSetLastNameSetting(
|
|
IN HWND hwnd,
|
|
IN BOOL Value
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is used to set a new workstation LastName value for the system.
|
|
As a side effect, it also sets the value in the Item control block and
|
|
resets the "recommended" flag.
|
|
|
|
Arguments
|
|
|
|
hwnd - The caller's window. This is used if we need to put
|
|
up an error popup.
|
|
|
|
Value - The value to apply to the system and set in the Item control block.
|
|
TRUE => Display last username. FALSE => Don't display.
|
|
|
|
|
|
Return Values:
|
|
|
|
TRUE - The value has been successfully set
|
|
|
|
FALSE - we ran into trouble setting the new setting.
|
|
|
|
If an error is encountered, then an error popup will be
|
|
displayed by this routine.
|
|
|
|
--*/
|
|
{
|
|
NTSTATUS
|
|
NtStatus;
|
|
|
|
BOOLEAN
|
|
Result;
|
|
|
|
BOOLEAN
|
|
DontDisplayLastName;
|
|
|
|
DontDisplayLastName = !((BOOLEAN)Value);
|
|
|
|
|
|
//
|
|
// Set the new value
|
|
//
|
|
|
|
Result = MissypSetProfileInt(
|
|
TEXT("Winlogon"),
|
|
TEXT("DontDisplayLastUsername"),
|
|
(ULONG)DontDisplayLastName
|
|
);
|
|
if (Result) {
|
|
|
|
//
|
|
// Update our Item Control Block
|
|
//
|
|
|
|
MissypLastNameItem->Value.Bool = Value;
|
|
MissypMarkLastNameValueCurrent();
|
|
|
|
|
|
} else {
|
|
|
|
//
|
|
// Put up a pop-up
|
|
//
|
|
|
|
MissypPopUp( hwnd, MISSYP_POP_UP_CANT_SET_LASTNAME, MISSYP_STRING_TITLE_ERROR);
|
|
|
|
}
|
|
|
|
return(Result);
|
|
}
|
|
|
|
|
|
VOID
|
|
MissypUpdateLastNameRecommendation( VOID )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function updates our recommended value field and flag and sets
|
|
the LastName value as CURRENT.
|
|
|
|
Arguments
|
|
|
|
None.
|
|
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
|
|
--*/
|
|
{
|
|
|
|
MissypLastNameItem->RecommendedValue.Bool = MissypGetLastNameRecommendation( SECMGR_LEVEL_CURRENT );
|
|
|
|
//
|
|
// Indicate whether the current value matches the recommended value
|
|
//
|
|
|
|
if (MissypLastNameItem->Value.Bool == MissypLastNameItem->RecommendedValue.Bool) {
|
|
MissypLastNameItem->Flags |= SECMGR_ITEM_FLAG_VALUE_RECOMMENDED; //Recommended value
|
|
} else {
|
|
MissypLastNameItem->Flags &= (~SECMGR_ITEM_FLAG_VALUE_RECOMMENDED); //Not recommended value
|
|
|
|
//
|
|
// We don't match our recommendation.
|
|
// If Display is TRUE, then the system is configured weaker than our recommendation.
|
|
// Otherwise, the system is configured stronger than our recommendation.
|
|
//
|
|
|
|
if (MissypLastNameItem->Value.Bool == TRUE) {
|
|
MissypLastNameItem->Flags &= (~SECMGR_ITEM_FLAG_VALUE_STRONGER);
|
|
} else {
|
|
MissypLastNameItem->Flags |= SECMGR_ITEM_FLAG_VALUE_STRONGER;
|
|
}
|
|
}
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
MissypGetLastNameRecommendation(
|
|
IN ULONG SecurityLevel
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function returns the recommended "display last name" setting for this
|
|
workstation given a specified security level.
|
|
|
|
Arguments
|
|
|
|
SecurityLevel - If this value is SECMGR_LEVEL_CURRENT, then the current
|
|
security level known to Missy will be used. Otherwise, the provided
|
|
security level will be used.
|
|
|
|
|
|
Return Values:
|
|
|
|
The recommended setting.
|
|
|
|
|
|
--*/
|
|
{
|
|
|
|
ULONG
|
|
EffectiveLevel = SecurityLevel;
|
|
|
|
if (SecurityLevel == SECMGR_LEVEL_CURRENT) {
|
|
EffectiveLevel = MissypSecMgrControl->SecurityLevel;
|
|
}
|
|
|
|
//
|
|
// Figure out what our recommendation is, set it in the item control block.
|
|
//
|
|
// WinNt running Standard or lower ==> Display
|
|
// Otherwise ==> Don't display
|
|
//
|
|
|
|
if ((MissypProductType == NtProductWinNt) &&
|
|
(MissypSecMgrControl->SecurityLevel <= SECMGR_LEVEL_STANDARD) ) {
|
|
return(TRUE);
|
|
} else {
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Locally Callable Functions //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
VOID
|
|
MissypMarkLastNameValueCurrent( VOID )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function updates our recommended value field and flag and sets
|
|
the LastName value as CURRENT.
|
|
|
|
Arguments
|
|
|
|
None.
|
|
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
|
|
--*/
|
|
{
|
|
MissypUpdateLastNameRecommendation();
|
|
|
|
//
|
|
// Indicate we have a value
|
|
//
|
|
|
|
MissypLastNameItem->Flags |= SECMGR_ITEM_FLAG_VALUE_CURRENT;
|
|
|
|
return;
|
|
}
|
|
|
|
|