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.
547 lines
11 KiB
547 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Environp.c
|
|
|
|
Abstract:
|
|
|
|
This module contains support for the Environment dialog.
|
|
|
|
Author:
|
|
|
|
Scott B. Suhy (ScottSu) 6/1/93
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
|
|
#include "dialogsp.h"
|
|
#include "environp.h"
|
|
#include "regp.h"
|
|
#include "winmsdp.h"
|
|
|
|
#include "printp.h"
|
|
|
|
#include <string.h>
|
|
#include <tchar.h>
|
|
|
|
//
|
|
// System environment variables.
|
|
//
|
|
|
|
MakeKey(
|
|
_SystemEnvironKey,
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT( "System\\CurrentControlSet\\Control\\Session Manager\\Environment" ),
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
//
|
|
// Per user environment variables.
|
|
//
|
|
|
|
MakeKey(
|
|
_UserEnvironKey,
|
|
HKEY_CURRENT_USER,
|
|
TEXT( "Environment" ),
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
//
|
|
// Environment value and variable.
|
|
//
|
|
|
|
typedef
|
|
struct
|
|
_ENV_VAR {
|
|
|
|
LPWSTR Variable;
|
|
LPWSTR Value;
|
|
|
|
} ENV_VAR, *LPENV_VAR;
|
|
|
|
//
|
|
// CurrentEnvVar is the current environment variable in the enumeration
|
|
// supported by FindFirstEnvironmentVariable and FindNextEnvironmentVariable.
|
|
//
|
|
|
|
LPTSTR
|
|
CurrentEnvVar;
|
|
|
|
//
|
|
// hRegEnvironKey is the Registry key handle that is used to support the
|
|
// enumeration of environment variables in the Registry.
|
|
//
|
|
|
|
HREGKEY
|
|
hRegEnvironKey;
|
|
|
|
//
|
|
// Internal function prototypes.
|
|
//
|
|
|
|
BOOL
|
|
FillEnvironmentListBox(
|
|
IN INT ListBoxId,
|
|
IN LPKEY Key
|
|
);
|
|
|
|
LPENV_VAR
|
|
FindFirstEnvironmentVariableW(
|
|
);
|
|
|
|
LPENV_VAR
|
|
FindFirstRegistryEnvironmentVariableW(
|
|
);
|
|
|
|
LPENV_VAR
|
|
FindNextEnvironmentVariableW(
|
|
);
|
|
|
|
LPENV_VAR
|
|
FindNextRegistryEnvironmentVariableW(
|
|
);
|
|
|
|
BOOL
|
|
FillEnvironmentListBox(
|
|
IN INT ListBoxId,
|
|
IN LPKEY Key
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
FillEnvironmentListBox fills the list box referred to by the supplied
|
|
window handle and control id with enviornment variables and values. The
|
|
environment comes from either the location specified by the supplied key or
|
|
from the process if the key is NULL.
|
|
|
|
Arguments:
|
|
|
|
ListBoxId - Supplies the control id for the list box to fill.
|
|
Key - Supplies a pointer to a registry KEY object that describes
|
|
the location of the environment.
|
|
|
|
Return Value:
|
|
|
|
BOOL - Returns TRUE if the list box was succesfully filled with the
|
|
environment, FALSE otherwise.
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL Success;
|
|
LPENV_VAR EnvVar;
|
|
LPENV_VAR ( *NextEnvVarFunc )( );
|
|
|
|
|
|
//
|
|
// If the supplied Key is NULL get the environment variables from the
|
|
// current process, otherwise get them from the supplied Registry key.
|
|
//
|
|
|
|
if( Key == NULL ) {
|
|
|
|
EnvVar = FindFirstEnvironmentVariableW( );
|
|
NextEnvVarFunc = FindNextEnvironmentVariableW;
|
|
|
|
} else {
|
|
|
|
EnvVar = FindFirstRegistryEnvironmentVariableW( Key );
|
|
NextEnvVarFunc = FindNextRegistryEnvironmentVariableW;
|
|
}
|
|
|
|
//
|
|
// For each environment variable, initialize the CLB_ROW and CLB_STRING
|
|
// object and add each row's column data.
|
|
//
|
|
|
|
while( EnvVar ) {
|
|
|
|
PrintToFile((LPCTSTR)EnvVar->Variable,ListBoxId,TRUE);
|
|
|
|
PrintToFile((LPCTSTR)EnvVar->Value,ListBoxId,TRUE);
|
|
|
|
//
|
|
// Get the next environment variable.
|
|
//
|
|
|
|
EnvVar = NextEnvVarFunc( );
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LPENV_VAR
|
|
FindFirstEnvironmentVariableW(
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine starts the enumeration of this process' environment variables
|
|
by initializing the CurrentEnvVar variable. It then returns the first
|
|
environment varaiable in the enumeration.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
LPENV_VAR - Returns a pointer to a static ENV_VAR object containing the
|
|
first environment variable in the list, NULL if there is none.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Initialize the current environment variable.
|
|
//
|
|
|
|
CurrentEnvVar = GetEnvironmentStrings( );
|
|
DbgPointerAssert( CurrentEnvVar );
|
|
if( CurrentEnvVar == NULL ) {
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// Return the first environment variable.
|
|
//
|
|
|
|
return FindNextEnvironmentVariableW( );
|
|
}
|
|
|
|
LPENV_VAR
|
|
FindFirstRegistryEnvironmentVariableW(
|
|
IN LPKEY Key
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine starts the enumeration of the environment variables at the
|
|
location specified by the supplied Registry KEY object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
LPENV_VAR - Returns a pointer to a static ENV_VAR object containing the
|
|
first environment variable in the list, NULL if there is none.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Initialize the current environment variable.
|
|
//
|
|
|
|
hRegEnvironKey = OpenRegistryKey( Key );
|
|
DbgHandleAssert( hRegEnvironKey );
|
|
if( hRegEnvironKey == NULL ) {
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// Return the first environmenr variable.
|
|
//
|
|
|
|
return FindNextRegistryEnvironmentVariableW( );
|
|
}
|
|
|
|
LPENV_VAR
|
|
FindNextEnvironmentVariableW(
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
FindNextEnvironmentVariable continues an enumeration that has been
|
|
initialized by a previous call to FindFirstEnvironmentVariable. Since the
|
|
environment strings are only available in ANSI, this routine converts them
|
|
to Unicode before returning. Further it sets up for the next iteratuion by
|
|
adjusting the currency pointer.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
LPENV_VAR - Returns a pointer to a static ENV_VAR object containing the next
|
|
environment variable in the list, NULL if there are none.
|
|
|
|
--*/
|
|
|
|
{
|
|
int rc;
|
|
static
|
|
WCHAR Buffer[ MAX_PATH ];
|
|
static
|
|
ENV_VAR EnvVar;
|
|
|
|
//
|
|
// If the current environment variable pointer points to an empty string
|
|
// return NULL.
|
|
//
|
|
|
|
if( *CurrentEnvVar == TEXT('\0') ) {
|
|
return NULL;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
wcscpy(Buffer, CurrentEnvVar);
|
|
#else /* not UNICODE */
|
|
//
|
|
// Convert the environment variable to Unicode.
|
|
//
|
|
|
|
rc = MultiByteToWideChar(
|
|
CP_ACP,
|
|
0,
|
|
( LPCSTR ) CurrentEnvVar,
|
|
-1,
|
|
Buffer,
|
|
sizeof( Buffer )
|
|
);
|
|
DbgAssert( rc != 0 );
|
|
if( rc == 0 ) {
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// Update the current environment variable pointer to point to the
|
|
// variable.
|
|
//
|
|
|
|
CurrentEnvVar += _tcslen( CurrentEnvVar ) + 1;
|
|
|
|
//
|
|
// Parse the buffer into an ENV_VAR object. The first '=' sign seen from
|
|
// the end of the buffer is the seperator. The search is done in reverse
|
|
// because of the special current directory environment variablles
|
|
// (e.g. =c:).
|
|
//
|
|
|
|
EnvVar.Variable = Buffer;
|
|
EnvVar.Value = wcsrchr( Buffer, '=' ) + 1;
|
|
EnvVar.Variable[ EnvVar.Value - EnvVar.Variable - 1 ] = L'\0';
|
|
|
|
return &EnvVar;
|
|
}
|
|
|
|
LPENV_VAR
|
|
FindNextRegistryEnvironmentVariableW(
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
FindNextRegistryEnvironmentVariable continues an enumeration that has been
|
|
initialized by a previous call to FindFirstRegistryEnvironmentVariable. For
|
|
each environment variable that it finds it converts it to two simple
|
|
strings, the variable and the value.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
LPENV_VAR - Returns a pointer to a static ENV_VAR object containing the next
|
|
environment variable in the list, NULL if there are none.
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL Success;
|
|
DWORD Length;
|
|
static
|
|
WCHAR Buffer[ MAX_PATH ];
|
|
static
|
|
ENV_VAR EnvVar;
|
|
|
|
//
|
|
// If there is another environment variable...
|
|
//
|
|
|
|
if( QueryNextValue( hRegEnvironKey )) {
|
|
|
|
//
|
|
// Remember the environment variable's name.
|
|
//
|
|
|
|
EnvVar.Variable = hRegEnvironKey->ValueName;
|
|
|
|
switch( hRegEnvironKey->Type ) {
|
|
|
|
case REG_SZ:
|
|
|
|
//
|
|
// Remember the environment variable's value.
|
|
//
|
|
|
|
EnvVar.Value = ( LPWSTR ) hRegEnvironKey->Data;
|
|
break;
|
|
|
|
case REG_EXPAND_SZ:
|
|
|
|
//
|
|
// Replace the variable portion of the environment variable by
|
|
// expanding into the static buffer.
|
|
//
|
|
|
|
EnvVar.Value = Buffer;
|
|
Length = ExpandEnvironmentStrings(
|
|
( LPTSTR ) hRegEnvironKey->Data,
|
|
Buffer,
|
|
sizeof( Buffer )
|
|
);
|
|
DbgAssert( Length <= sizeof( Buffer ));
|
|
break;
|
|
|
|
default:
|
|
|
|
DbgAssert( FALSE );
|
|
}
|
|
|
|
//
|
|
// Return the curent environment variable.
|
|
//
|
|
|
|
return &EnvVar;
|
|
|
|
} else {
|
|
|
|
//
|
|
// There are no more environment variables so close the key and
|
|
// return NULL.
|
|
//
|
|
|
|
Success = CloseRegistryKey( hRegEnvironKey );
|
|
DbgAssert( Success );
|
|
return NULL;
|
|
|
|
}
|
|
DbgAssert( FALSE );
|
|
}
|
|
|
|
BOOL
|
|
EnvironmentProc()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Display the three (system, user and process) environment variable lists.
|
|
|
|
Arguments:
|
|
|
|
Standard PROC entry.
|
|
|
|
Return Value:
|
|
|
|
BOOL - Depending on input message and processing options.
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL Success;
|
|
|
|
TCHAR UserName[ MAX_PATH ];
|
|
DWORD UserNameLength;
|
|
KEY SystemEnvironKey;
|
|
KEY UserEnvironKey;
|
|
|
|
//
|
|
// Restore the initial state of the KEYs.
|
|
//
|
|
|
|
CopyMemory(
|
|
&SystemEnvironKey,
|
|
&_SystemEnvironKey,
|
|
sizeof( SystemEnvironKey )
|
|
);
|
|
|
|
CopyMemory(
|
|
&UserEnvironKey,
|
|
&_UserEnvironKey,
|
|
sizeof( UserEnvironKey )
|
|
);
|
|
|
|
//
|
|
// Fill the system environment variable list box.
|
|
//
|
|
|
|
Success = FillEnvironmentListBox(
|
|
IDC_LIST_SYSTEM_ENVIRONMENT,
|
|
&SystemEnvironKey
|
|
);
|
|
DbgAssert( Success );
|
|
if( Success == FALSE ) {
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Fill the per user environment variable list box.
|
|
//
|
|
|
|
Success = FillEnvironmentListBox(
|
|
IDC_LIST_USER_ENVIRONMENT,
|
|
&UserEnvironKey
|
|
);
|
|
DbgAssert( Success );
|
|
if( Success == FALSE ) {
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Fill the process' environment variable list box.
|
|
//
|
|
|
|
Success = FillEnvironmentListBox(
|
|
IDC_LIST_PROCESS_ENVIRONMENT,
|
|
NULL
|
|
);
|
|
DbgAssert( Success );
|
|
if( Success == FALSE ) {
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Display the name of the user that user environment variable list
|
|
// belongs to.
|
|
//
|
|
|
|
UserNameLength = sizeof( UserName );
|
|
Success = GetUserName(
|
|
UserName,
|
|
&UserNameLength
|
|
);
|
|
DbgAssert( Success );
|
|
if( Success == FALSE ) {
|
|
return TRUE;
|
|
}
|
|
|
|
PrintToFile((LPCTSTR)UserName,IDC_EDIT_USER_NAME,TRUE);
|
|
PrintToFile((LPCTSTR)TEXT("\n"),IDC_SPACE,TRUE);
|
|
|
|
|
|
return TRUE;
|
|
}
|