windows-nt/Source/XPSP1/NT/ds/nw/nwscript/env.c
2020-09-26 16:20:57 +08:00

357 lines
8.7 KiB
C

/*************************************************************************
*
* ENV.C
*
* Environment export routines
*
* Copyright (c) 1995 Microsoft Corporation
*
* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\ENV.C $
*
* Rev 1.2 10 Apr 1996 14:22:28 terryt
* Hotfix for 21181hq
*
* Rev 1.2 12 Mar 1996 19:53:48 terryt
* Relative NDS names and merge
*
* Rev 1.1 22 Dec 1995 14:24:40 terryt
* Add Microsoft headers
*
* Rev 1.0 15 Nov 1995 18:06:58 terryt
* Initial revision.
*
* Rev 1.2 25 Aug 1995 16:22:50 terryt
* Capture support
*
* Rev 1.1 23 May 1995 19:36:54 terryt
* Spruce up source
*
* Rev 1.0 15 May 1995 19:10:34 terryt
* Initial revision.
*
*************************************************************************/
#include <stdio.h>
#include <direct.h>
#include <time.h>
#include <stdlib.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include "nwscript.h"
#define MAX_PATH_LEN 2048
#define PATH "Path"
#define LIBPATH "LibPath"
#define OS2LIBPATH "Os2LibPath"
unsigned char * Path_Value = NULL;
unsigned char * LibPath_Value = NULL;
unsigned char * Os2LibPath_Value = NULL;
/********************************************************************
GetOldPaths
Routine Description:
Save the orginal paths for
Path
LibPath
Os2LibPath
Arguments:
none
Return Value:
none
*******************************************************************/
void
GetOldPaths( void )
{
if (!(Path_Value = (unsigned char *)LocalAlloc( LPTR, MAX_PATH_LEN )))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
return;
}
GetEnvironmentVariableA( PATH, Path_Value, MAX_PATH_LEN );
if (!(LibPath_Value = (unsigned char *)LocalAlloc( LPTR, MAX_PATH_LEN)))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
return;
}
GetEnvironmentVariableA( LIBPATH, LibPath_Value, MAX_PATH_LEN );
if (!(Os2LibPath_Value = (unsigned char *)LocalAlloc( LPTR, MAX_PATH_LEN)))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
return;
}
GetEnvironmentVariableA( OS2LIBPATH, Os2LibPath_Value, MAX_PATH_LEN );
}
/********************************************************************
AdjustPath
Routine Description:
Given an old path and a new path, merge the two togther.
Basically, the Adjusted path is the old path with the
new values at the end, minus any duplicates.
Arguments:
Value - New path
OldPath_Value - Old path
AdjustedValue - New value (allocated)
Return Value:
none
*******************************************************************/
void
AdjustPath( unsigned char * Value,
unsigned char * OldPath_Value,
unsigned char ** AdjustedValue )
{
unsigned char * tokenPath;
unsigned char * clipStart;
unsigned char * clipEnd;
unsigned char * tokenSearch;
unsigned char * tokenNext;
if (!(*AdjustedValue = (unsigned char *)LocalAlloc( LPTR, MAX_PATH_LEN)))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
return;
}
strncpy( *AdjustedValue, Value, MAX_PATH_LEN );
if (!(tokenSearch = (unsigned char *)LocalAlloc( LPTR, MAX_PATH_LEN)))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
(void) LocalFree((HLOCAL) *AdjustedValue) ;
return;
}
strncpy( tokenSearch, OldPath_Value, MAX_PATH_LEN );
tokenNext = tokenSearch;
if ( !tokenNext || !tokenNext[0] )
tokenPath = NULL;
else {
tokenPath = tokenNext;
tokenNext = strchr( tokenPath, ';' );
if ( tokenNext ) {
*tokenNext++ = 0;
}
}
while ( tokenPath != NULL )
{
if ( clipStart = strstr( *AdjustedValue, tokenPath ) ) {
if ( clipEnd = strchr( clipStart, ';' ) ) {
memmove( clipStart, clipEnd + 1, strlen( clipEnd + 1 ) + 1 );
}
else {
clipStart[0] = 0;
}
}
if ( !tokenNext || !tokenNext[0] )
tokenPath = NULL;
else {
tokenPath = tokenNext;
tokenNext = strchr( tokenPath, ';' );
if ( tokenNext ) {
*tokenNext++ = 0;
}
}
}
(void) LocalFree((HLOCAL) tokenSearch) ;
}
/********************************************************************
ExportEnv
Routine Description:
Export environment value to the registry
Arguments:
EnvString - Environment string
Return Value:
none
*******************************************************************/
void
ExportEnv( unsigned char * EnvString )
{
HKEY ScriptEnvironmentKey;
NTSTATUS Status;
unsigned char * Value;
unsigned char * ValueName;
unsigned char * AdjustedValue = NULL;
ValueName = EnvString;
Value = strchr( EnvString, '=' );
if ( Value == NULL ) {
wprintf(L"Bad Environment string\n");
return;
}
Value++;
if (!(ValueName = (unsigned char *)LocalAlloc( LPTR, Value-EnvString + 1)))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
return;
}
strncpy( ValueName, EnvString, (UINT) (Value-EnvString - 1) );
if ( !_strcmpi( ValueName, PATH ) ) {
AdjustPath( Value, Path_Value, &AdjustedValue );
Value = AdjustedValue;
}
else if ( !_strcmpi( ValueName, LIBPATH ) ) {
AdjustPath( Value, LibPath_Value, &AdjustedValue );
Value = AdjustedValue;
}
else if ( !_strcmpi( ValueName, OS2LIBPATH ) ) {
AdjustPath( Value, Os2LibPath_Value, &AdjustedValue );
Value = AdjustedValue;
}
if (Value == NULL) {
return;
}
Status = RegCreateKeyExW( HKEY_CURRENT_USER,
SCRIPT_ENVIRONMENT_VALUENAME,
0,
WIN31_CLASS,
REG_OPTION_VOLATILE,
KEY_WRITE,
NULL, // security attr
&ScriptEnvironmentKey,
NULL
);
if ( NT_SUCCESS(Status)) {
Status = RegSetValueExA( ScriptEnvironmentKey,
ValueName,
0,
REG_SZ,
(LPVOID) Value,
strlen( Value ) + 1
);
}
else {
wprintf(L"Cannot create registry key\n");
}
(void) LocalFree((HLOCAL) ValueName) ;
if ( AdjustedValue )
(void) LocalFree((HLOCAL) AdjustedValue) ;
RegCloseKey( ScriptEnvironmentKey );
}
/********************************************************************
ExportCurrentDirectory
Routine Description:
Return the first non-local drive
Arguments:
DriveNum - Number of drive 1-26
Return Value:
none
*******************************************************************/
void
ExportCurrentDirectory( int DriveNum )
{
char DriveName[10];
HKEY ScriptEnvironmentKey;
NTSTATUS Status;
char CurrentPath[MAX_PATH_LEN];
strcpy( DriveName, "=A:" );
DriveName[1] += (DriveNum - 1);
if ( NTGetCurrentDirectory( (unsigned char)(DriveNum - 1), CurrentPath ) )
return;
Status = RegCreateKeyExW( HKEY_CURRENT_USER,
SCRIPT_ENVIRONMENT_VALUENAME,
0,
WIN31_CLASS,
REG_OPTION_VOLATILE,
KEY_WRITE,
NULL, // security attr
&ScriptEnvironmentKey,
NULL
);
if ( NT_SUCCESS(Status)) {
Status = RegSetValueExA( ScriptEnvironmentKey,
DriveName,
0,
REG_SZ,
(LPVOID) CurrentPath,
strlen( CurrentPath ) + 1
);
}
else {
wprintf(L"Cannot open registry key\n");
}
RegCloseKey( ScriptEnvironmentKey );
}
/********************************************************************
ExportCurrentDrive
Routine Description:
Export current drive to registry
NOT IMPLEMENTED
Arguments:
DriveNum - drive number
Return Value:
none
*******************************************************************/
void
ExportCurrentDrive( int DriveNum )
{
/*
* Don't know if we want to do this or how.
*/
}