338 lines
6.7 KiB
C
338 lines
6.7 KiB
C
|
#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 );
|
||
|
|
||
|
}
|