|
|
/*************************************************************************
* * 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. */ }
|