Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

377 lines
9.8 KiB

// Copyright (c) 1998-1999 Microsoft Corporation
/***************************************************************************
*
* ACINIUPD.C
*
* Utility to update INI files
*
*
****************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <winsta.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <utilsub.h>
#include <string.h>
#include <winnlsp.h>
#include "aciniupd.h"
#include "tsappcmp.h"
#define WININI L"win.ini"
/*
* Global Data
*/
WCHAR file_name[MAX_IDS_LEN+1]; // ini file name
WCHAR section_name[MAX_IDS_LEN+1]; // section name
WCHAR key_name[MAX_IDS_LEN+1]; // key name
WCHAR new_string[MAX_IDS_LEN+1]; // new string
USHORT help_flag = FALSE; // User wants help
USHORT fEditValue = FALSE; // Update the value associated with the key
USHORT fEditKey = FALSE; // Update the key name
USHORT fUserIni = FALSE; // Make change to the user's windows directory
USHORT fVerbose = FALSE; // Verbose mode for debugging
TOKMAP ptm[] = {
{L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &help_flag},
{L"/e", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fEditValue},
{L"/k", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fEditKey},
{L"/u", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fUserIni},
{L"/v", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fVerbose},
{L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, file_name},
{L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, section_name},
{L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, key_name},
{L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, new_string},
{0, 0, 0, 0, 0}
};
/*
* Local functions
*/
void Usage(BOOLEAN bError);
int UpdateValue(PWCHAR fileName, PWCHAR sectionName, PWCHAR keyName, PWCHAR newString);
int UpdateKey(PWCHAR fileName, PWCHAR sectionName, PWCHAR keyName, PWCHAR newString);
/******************************************************************************
*
* main
*
******************************************************************************/
int __cdecl
main( INT argc, CHAR **argv )
{
WCHAR **argvW;
WCHAR wcSrcPort[MAX_PATH], wcDestPort[MAX_PATH];
ULONG ulSrcPort, ulDestPort, rc;
BOOLEAN State, Changed = FALSE;
int result = SUCCESS;
BOOL InstallState;
setlocale(LC_ALL, ".OCP");
SetThreadUILanguage(0);
/*
* Massage the command line.
*/
argvW = MassageCommandLine((DWORD)argc);
if (argvW == NULL) {
ErrorPrintf(IDS_ERROR_MALLOC);
return(FAILURE);
}
/*
* parse the cmd line without parsing the program name (argc-1, argv+1)
*/
rc = ParseCommandLine(argc-1, argvW+1, ptm, 0);
/*
* Check for error from ParseCommandLine
*/
if ( help_flag || (rc && !(rc & PARSE_FLAG_NO_PARMS)) ) {
if ( !help_flag ) {
Usage(TRUE);
return(FAILURE);
} else {
Usage(FALSE);
return(SUCCESS);
}
}
if (wcscmp( file_name, L"" ) == 0 ||
wcscmp( section_name, L"" ) == 0 ||
wcscmp( key_name, L"" ) == 0) {
Usage( TRUE );
return (FAILURE);
}
rc = 1;
#if 0
State = CtxGetIniMapping();
/*
* Change the INI mapping mode if necessary
*/
if (!State && fUserIni) {
rc = CtxSetIniMapping( TRUE );
Changed = TRUE;
}
else if (State && !fUserIni) {
rc = CtxSetIniMapping( FALSE );
Changed = TRUE;
}
#else
InstallState = TermsrvAppInstallMode();
if( InstallState && fUserIni ) {
rc = SetTermsrvAppInstallMode( FALSE );
Changed = TRUE;
} else if( !InstallState && !fUserIni ) {
rc = SetTermsrvAppInstallMode( TRUE );
Changed = TRUE;
}
#endif // 0
/*
* Exit if failed to change user mode
*/
if (!rc) {
if (fVerbose) ErrorPrintf(IDS_ERROR_CHANGE_MODE, GetLastError());
return (FAILURE);
}
if (fEditValue) {
result = UpdateValue(file_name, section_name, key_name, new_string);
}
else if (fEditKey) {
result = UpdateKey(file_name, section_name, key_name, new_string);
}
else {
Usage(FALSE);
result = FAILURE;
}
/*
* Change back to the original mode if necessary. Assume it always successes.
*/
if (Changed) {
// rc = CtxSetIniMapping( State );
rc = SetTermsrvAppInstallMode( InstallState );
}
return (result);
} /* main */
/*******************************************************************************
*
* Usage
*
* Output the usage message for this utility.
*
* ENTRY:
* bError (input)
* TRUE if the 'invalid parameter(s)' message should preceed the usage
* message and the output go to stderr; FALSE for no such error
* string and output goes to stdout.
*
* EXIT:
*
*
******************************************************************************/
void
Usage( BOOLEAN bError )
{
if ( bError ) {
ErrorPrintf(IDS_ERROR_INVALID_PARAMETERS);
}
ErrorPrintf(IDS_HELP_USAGE1);
ErrorPrintf(IDS_HELP_USAGE2);
ErrorPrintf(IDS_HELP_USAGE3);
ErrorPrintf(IDS_HELP_USAGE4);
ErrorPrintf(IDS_HELP_USAGE6);
} /* Usage() */
/******************************************************************************
*
* UpdateValue
*
* Update the associated value for the key
*
* ENTRY:
* PWCHAR fileName
* Ini file name
* PWCHAR sectionName
* Section name
* PWCHAR keyName
* Key name
* pwchar newString
* New value
*
* EXIT:
* FAILURE / SUCCESS
*
*******************************************************************************/
int UpdateValue( PWCHAR fileName,
PWCHAR sectionName,
PWCHAR keyName,
PWCHAR newString )
{
BOOLEAN isWinIni;
WCHAR value[5];
UINT result = 0;
isWinIni = wcscmp( fileName, WININI ) == 0 ? TRUE : FALSE;
/*
* If change is made to win.ini, call WriteProfileString API
*/
if (isWinIni) {
result = WriteProfileString( sectionName,
keyName,
newString );
}
/*
* Otherwise, call WritePrivateProfileString API
*/
else {
result = WritePrivateProfileString( sectionName,
keyName,
newString,
fileName );
}
if (result == 0) {
if (fVerbose)
{
StringDwordErrorPrintf(IDS_ERROR_UPDATE_VALUE, keyName, GetLastError());
}
return (FAILURE);
}
return (SUCCESS);
} /* UpdateValue */
/******************************************************************************
*
* UpdateKey
*
* Update the key name
*
* ENTRY:
* PWCHAR fileName
* Ini file name
* PWCHAR sectionName
* Section name
* PWCHAR keyName
* Key name
* PWCHAR newString
* New key name
*
* EXIT:
* FAILURE / SUCCESS
*
*******************************************************************************/
int UpdateKey( PWCHAR fileName,
PWCHAR sectionName,
PWCHAR keyName,
PWCHAR newString )
{
BOOLEAN isWinIni;
PWCHAR value;
UINT result;
value = (WCHAR *)malloc( sizeof(WCHAR) * (MAX_IDS_LEN + 1) );
if (value == NULL) {
if (fVerbose) ErrorPrintf(IDS_ERROR_MALLOC);
return (FAILURE);
}
__try
{
isWinIni = wcscmp( fileName, WININI ) == 0 ? TRUE : FALSE;
/*
* Get the value string
*/
if (isWinIni) {
result = GetProfileString( sectionName,
keyName,
L"",
value,
MAX_IDS_LEN+1 );
}
else {
result = GetPrivateProfileString( sectionName,
keyName,
L"",
value,
MAX_IDS_LEN+1,
fileName );
}
if (result == 0) {
if (fVerbose)
{
StringErrorPrintf(IDS_ERROR_GET_VALUE, keyName);
}
return (FAILURE);
}
/*
* Delete the old key
*/
if (isWinIni) {
result = WriteProfileString( sectionName, keyName, NULL );
}
else {
result = WritePrivateProfileString( sectionName, keyName, NULL, fileName );
}
if (result == 0) {
if (fVerbose)
{
StringDwordErrorPrintf(IDS_ERROR_DEL_KEY, keyName, GetLastError());
}
return (FAILURE);
}
/*
* Add the new key
*/
if (isWinIni) {
result = WriteProfileString( sectionName, newString, value );
}
else {
result = WritePrivateProfileString( sectionName, newString, value, fileName );
}
if (result == 0) {
if (fVerbose)
{
StringDwordErrorPrintf(IDS_ERROR_UPDATE_KEY, keyName, GetLastError());
}
return (FAILURE);
}
return (SUCCESS);
}
__finally
{
free( value );
}
} /* UpdateKey */