windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/nt_env.c

338 lines
6.7 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
#pragma hdrstop
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
nt_env.c
Abstract:
1. Contains routines to get and set NVRAM variables.
Author:
Sunil Pai (sunilp) 20-Nov-1991
--*/
#define MAX_ENV_VAR_LEN 4096
// Detect Command: (transfer to detect1.c)
//
// Get value of a MIPS environment variable. Returns the value in list form.
// If the value is a path (semicolon-separated components) each component
// is an element of the list.
//
CB
GetNVRAMVar(
IN RGSZ Args,
IN USHORT cArgs,
OUT SZ ReturnBuffer,
IN CB cbReturnBuffer
)
{
CHAR EnvValue[ MAX_ENV_VAR_LEN ];
SZ sz;
Unused( cbReturnBuffer );
ReturnBuffer[0] = '\0';
if (cArgs > 0) {
if ( !GetEnvironmentString( Args[0], EnvValue, MAX_ENV_VAR_LEN ) ) {
//
// Env. Variable not defined, return empty list
//
#define UNDEF_VAR_VALUE "{}"
lstrcpy( ReturnBuffer, UNDEF_VAR_VALUE );
return lstrlen( ReturnBuffer )+1;
} else if ( sz = SzListValueFromPath( EnvValue ) ) {
lstrcpy( ReturnBuffer, sz );
SFree( sz );
return lstrlen( ReturnBuffer)+1;
}
}
return 0;
}
BOOL
GetEnvironmentString(
IN LPSTR lpVar,
OUT LPSTR lpValue,
IN USHORT MaxLengthValue
)
{
PWSTR wBuffer;
USHORT ReturnLength;
UNICODE_STRING VarString_U, ValueString_U;
ANSI_STRING VarString_A, ValueString_A;
NTSTATUS Status;
LONG Privilege = SE_SYSTEM_ENVIRONMENT_PRIVILEGE;
TOKEN_PRIVILEGES PrevState;
ULONG PrevLength = sizeof( TOKEN_PRIVILEGES );
//
// Initialise the wide char buffer which will receive the env value
//
if ((wBuffer = SAlloc((MAX_ENV_VAR_LEN) * sizeof(WCHAR))) == NULL) {
SetErrorText(IDS_ERROR_RTLOOM);
return FALSE;
}
//
// get the environment variable
//
RtlInitAnsiString(&VarString_A, lpVar);
Status = RtlAnsiStringToUnicodeString(
&VarString_U,
&VarString_A,
TRUE
);
if(!NT_SUCCESS(Status)) {
SetErrorText(IDS_ERROR_RTLOOM);
SFree(wBuffer);
return(FALSE);
}
//
// Enable the SE_SYSTEM_ENVIRONMENT_PRIVILEGE, if this fails we
// cannot query the environment string
//
if( !AdjustPrivilege(
Privilege,
ENABLE_PRIVILEGE,
&PrevState,
&PrevLength
)
) {
SFree( wBuffer );
return( FALSE );
}
//
// Query the system environment value
//
Status = NtQuerySystemEnvironmentValue(
&VarString_U,
wBuffer,
MAX_ENV_VAR_LEN * sizeof(WCHAR),
&ReturnLength
);
//
// Restore the SE_SYSTEM_ENVIRONMENT_PRIVILEGE to its previous state
//
RestorePrivilege( &PrevState );
//
// Examine the query system environment value operation
if(!NT_SUCCESS(Status)) {
//
// first free the resources involved
//
SFree(wBuffer);
RtlFreeUnicodeString(&VarString_U);
//
// special handling for var not found
//
if (Status == STATUS_UNSUCCESSFUL) {
lpValue[0] = 0; //Null terminate
return(TRUE);
}
else {
SetErrorText(IDS_ERROR_ENVVARREAD);
return(FALSE);
}
}
//
// Free the Unicode var string, no longer needed
//
RtlFreeUnicodeString(&VarString_U);
//
// Convert the value to an Ansi string
//
RtlInitUnicodeString(&ValueString_U, wBuffer);
Status = RtlUnicodeStringToAnsiString(
&ValueString_A,
&ValueString_U,
TRUE
);
if (!NT_SUCCESS(Status)) {
SetErrorText(IDS_ERROR_RTLOOM);
SFree(wBuffer);
return (FALSE);
}
//
// Move it to the buffer passed in
//
if (ValueString_A.Length >= MaxLengthValue) {
SetErrorText(IDS_ERROR_ENVVAROVF);
RtlFreeAnsiString(&ValueString_A);
SFree(wBuffer);
return FALSE;
}
//
// move the ansi string to the buffer passed in
//
RtlMoveMemory(lpValue, ValueString_A.Buffer, ValueString_A.Length);
lpValue[ValueString_A.Length]=0; //Null terminate
//
// free the value ansi string
//
RtlFreeAnsiString(&ValueString_A);
//
// return success
//
return TRUE;
}
BOOL
SetEnvironmentString(
IN LPSTR lpVar,
IN LPSTR lpValue
)
{
UNICODE_STRING VarString_U, ValueString_U;
ANSI_STRING VarString_A, ValueString_A;
NTSTATUS Status;
LONG Privilege = SE_SYSTEM_ENVIRONMENT_PRIVILEGE;
TOKEN_PRIVILEGES PrevState;
ULONG PrevLength = sizeof( TOKEN_PRIVILEGES );
//
// Initialise the unicode strings for the environment variable
//
RtlInitAnsiString(&VarString_A, lpVar);
Status = RtlAnsiStringToUnicodeString(
&VarString_U,
&VarString_A,
TRUE
);
if(!NT_SUCCESS(Status)) {
SetErrorText(IDS_ERROR_RTLOOM);
return(FALSE);
}
//
// Initialise the unicode string for the environment value
//
RtlInitAnsiString(&ValueString_A, lpValue);
Status = RtlAnsiStringToUnicodeString(
&ValueString_U,
&ValueString_A,
TRUE
);
if(!NT_SUCCESS(Status)) {
SetErrorText(IDS_ERROR_RTLOOM);
RtlFreeUnicodeString(&VarString_U);
return(FALSE);
}
//
// Enable the SE_SYSTEM_ENVIRONMENT_PRIVILEGE, if this fails we
// cannot query the environment string
//
if( !AdjustPrivilege(
Privilege,
ENABLE_PRIVILEGE,
&PrevState,
&PrevLength
)
) {
SetErrorText(IDS_ERROR_PRIVILEGE);
RtlFreeUnicodeString(&VarString_U);
return( FALSE );
}
//
// call the NT Function to set the environment variable
//
Status = NtSetSystemEnvironmentValue(
&VarString_U,
&ValueString_U
);
//
// Restore the SE_SYSTEM_ENVIRONMENT_PRIVILEGE to its previous state
//
RestorePrivilege( &PrevState );
//
// free the two unicode strings
//
RtlFreeUnicodeString(&VarString_U);
RtlFreeUnicodeString(&ValueString_U);
//
// return Success/Failure
//
if (!NT_SUCCESS(Status)) {
SetErrorText(IDS_ERROR_ENVVARWRITE);
return ( FALSE );
}
return ( TRUE );
}