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 );
|
|
|
|
}
|