288 lines
8.6 KiB
C
288 lines
8.6 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
lodctr.c
|
||
|
||
Abstract:
|
||
|
||
Program to read the contents of the file specified in the command line
|
||
and update the registry accordingly
|
||
|
||
Author:
|
||
|
||
Bob Watson (a-robw) 10 Feb 93
|
||
|
||
Revision History:
|
||
|
||
a-robw 25-Feb-93 revised calls to make it compile as a UNICODE or
|
||
an ANSI app.
|
||
|
||
a-robw 10-Nov-95 revised to use DLL functions for all the dirty work
|
||
|
||
// command line arguments supported:
|
||
|
||
/C:<filename> upgrade counter text strings using <filename>
|
||
/H:<filename> upgrade help text strings using <filename>
|
||
/L:<LangID> /C and /H params are for language <LangID>
|
||
|
||
/S:<filename> save current perf registry strings & info to <filname>
|
||
/R:<filename> restore perf registry strings & info using <filname>
|
||
|
||
/T:<service> set <service> to be Trusted using current DLL
|
||
|
||
--*/
|
||
#define UNICODE 1
|
||
#define _UNICODE 1
|
||
//
|
||
// Windows Include files
|
||
//
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
#include <windows.h>
|
||
#include <stdlib.h>
|
||
#include <tchar.h>
|
||
|
||
#include <loadperf.h>
|
||
#include "..\common\common.h"
|
||
|
||
static CHAR szFileNameBuffer[MAX_PATH*2];
|
||
|
||
static
|
||
LPCSTR
|
||
GetTrustedServiceName (
|
||
LPCSTR szArg1
|
||
)
|
||
{
|
||
LPSTR szReturn = NULL;
|
||
|
||
if ((szArg1[0] == '-') || (szArg1[0] == '/')) {
|
||
//it's a switch command
|
||
if ((szArg1[1] == 't') || (szArg1[1] == 'T')) {
|
||
// the command is to Save the configuration to a file
|
||
if (szArg1[2] == ':') {
|
||
// then the rest of the string is the name of the trusted service
|
||
szReturn = (LPSTR)&szArg1[3];
|
||
}
|
||
}
|
||
}
|
||
return (LPCSTR)szReturn;
|
||
}
|
||
static
|
||
BOOL
|
||
GetUpgradeFileNames (
|
||
LPCSTR *szArgs,
|
||
LPSTR *szCounterFile,
|
||
LPSTR *szHelpFile,
|
||
LPSTR *szLangId
|
||
)
|
||
{
|
||
DWORD dwArgIdx = 1;
|
||
DWORD dwMask = 0;
|
||
|
||
do {
|
||
// check first arg, function assumes there are 2 args or more
|
||
if ((szArgs[dwArgIdx][0] == '-') || (szArgs[dwArgIdx][0] == '/')) {
|
||
//it's a switch command
|
||
if ((szArgs[dwArgIdx][1] == 'c') || (szArgs[dwArgIdx ][1] == 'C')) {
|
||
// the command is to load a service
|
||
if (szArgs[dwArgIdx ][2] == ':') {
|
||
// then the rest of the string is the service name
|
||
*szCounterFile = (LPSTR)&szArgs[dwArgIdx ][3];
|
||
dwMask |= 1;
|
||
}
|
||
} else if ((szArgs[dwArgIdx][1] == 'h') || (szArgs[dwArgIdx ][1] == 'H')) {
|
||
// the command is to load a service
|
||
if (szArgs[dwArgIdx][2] == ':') {
|
||
// then the rest of the string is the service name
|
||
*szHelpFile = (LPSTR)&szArgs[dwArgIdx ][3];
|
||
dwMask |= 2;
|
||
}
|
||
} else if ((szArgs[dwArgIdx][1] == 'l') || (szArgs[dwArgIdx ][1] == 'L')) {
|
||
// the command is to load a service
|
||
if (szArgs[dwArgIdx][2] == ':') {
|
||
// then the rest of the string is the service name
|
||
*szLangId = (LPSTR)&szArgs[dwArgIdx ][3];
|
||
dwMask |= 4;
|
||
}
|
||
}
|
||
}
|
||
dwArgIdx++;
|
||
} while (dwArgIdx <= 3);
|
||
|
||
if (dwMask == 7) {
|
||
// all names found
|
||
return TRUE;
|
||
} else {
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
LPCSTR
|
||
GetSaveFileName (
|
||
LPCSTR szArg1
|
||
)
|
||
{
|
||
LPSTR szReturn = NULL;
|
||
DWORD dwSize;
|
||
|
||
if ((szArg1[0] == '-') || (szArg1[0] == '/')) {
|
||
//it's a switch command
|
||
if ((szArg1[1] == 's') || (szArg1[1] == 'S')) {
|
||
// the command is to Save the configuration to a file
|
||
if (szArg1[2] == ':') {
|
||
// then the rest of the string is the input file name
|
||
dwSize = SearchPathA (NULL, (LPSTR)&szArg1[3], NULL,
|
||
sizeof(szFileNameBuffer)/sizeof(szFileNameBuffer[0]),
|
||
szFileNameBuffer, NULL);
|
||
if (dwSize == 0) {
|
||
//unable to find file in path so use it as is
|
||
szReturn = (LPSTR)&szArg1[3];
|
||
} else {
|
||
// else return the expanded file name
|
||
szReturn = szFileNameBuffer;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return (LPCSTR)szReturn;
|
||
}
|
||
static
|
||
LPCSTR
|
||
GetRestoreFileName (
|
||
LPCSTR szArg1
|
||
)
|
||
{
|
||
LPSTR szReturn = NULL;
|
||
DWORD dwSize;
|
||
|
||
if ((szArg1[0] == '-') || (szArg1[0] == '/')) {
|
||
//it's a switch command
|
||
if ((szArg1[1] == 'r') || (szArg1[1] == 'R')) {
|
||
// the command is to Save the configuration to a file
|
||
if (szArg1[2] == ':') {
|
||
// then the rest of the string is the input file name
|
||
dwSize = SearchPathA (NULL, (LPSTR)&szArg1[3], NULL,
|
||
sizeof(szFileNameBuffer)/sizeof(szFileNameBuffer[0]),
|
||
szFileNameBuffer, NULL);
|
||
if (dwSize == 0) {
|
||
//unable to find file in path so use it as is
|
||
szReturn = (LPSTR)&szArg1[3];
|
||
} else {
|
||
// else return the expanded file name
|
||
szReturn = szFileNameBuffer;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return (LPCSTR)szReturn;
|
||
}
|
||
|
||
int
|
||
__cdecl main(
|
||
int argc,
|
||
char *argv[]
|
||
)
|
||
/*++
|
||
|
||
main
|
||
|
||
|
||
|
||
Arguments
|
||
|
||
|
||
ReturnValue
|
||
|
||
0 (ERROR_SUCCESS) if command was processed
|
||
Non-Zero if command error was detected.
|
||
|
||
--*/
|
||
{
|
||
LPTSTR lpCommandLine;
|
||
LPSTR szCmdArgFileName;
|
||
LPWSTR wszFileName;
|
||
DWORD dwFileNameLen;
|
||
int nReturn;
|
||
|
||
lpCommandLine = GetCommandLine(); // get command line
|
||
|
||
// check for a service name in the command line
|
||
|
||
if (argc >= 2) {
|
||
if (argc >= 4) {
|
||
BOOL bDoUpdate;
|
||
LPSTR szCounterFile = NULL;
|
||
LPSTR szHelpFile = NULL;
|
||
LPSTR szLanguageID = NULL;
|
||
|
||
bDoUpdate = GetUpgradeFileNames (
|
||
argv,
|
||
&szCounterFile,
|
||
&szHelpFile,
|
||
&szLanguageID);
|
||
|
||
if (bDoUpdate) {
|
||
return (int) UpdatePerfNameFilesA (
|
||
szCounterFile,
|
||
szHelpFile,
|
||
szLanguageID,
|
||
0);
|
||
|
||
}
|
||
} else {
|
||
// then there's a param to check
|
||
szCmdArgFileName = (LPSTR)GetSaveFileName (argv[1]);
|
||
if (szCmdArgFileName != NULL) {
|
||
dwFileNameLen = lstrlenA(szCmdArgFileName) + 1;
|
||
wszFileName = HeapAlloc (GetProcessHeap(), 0, (dwFileNameLen) * sizeof (WCHAR));
|
||
if (wszFileName != NULL) {
|
||
mbstowcs (wszFileName, szCmdArgFileName, dwFileNameLen);
|
||
nReturn = (int)BackupPerfRegistryToFileW (
|
||
(LPCWSTR)wszFileName,
|
||
(LPCWSTR)L"");
|
||
HeapFree (GetProcessHeap(), 0, wszFileName);
|
||
return nReturn;
|
||
}
|
||
}
|
||
|
||
// try Restore file name
|
||
szCmdArgFileName = (LPSTR)GetRestoreFileName (argv[1]);
|
||
if (szCmdArgFileName != NULL) {
|
||
dwFileNameLen = lstrlenA(szCmdArgFileName) + 1;
|
||
wszFileName = HeapAlloc (GetProcessHeap(), 0, (dwFileNameLen) * sizeof (WCHAR));
|
||
if (wszFileName != NULL) {
|
||
mbstowcs (wszFileName, szCmdArgFileName, dwFileNameLen);
|
||
nReturn = (int)RestorePerfRegistryFromFileW(
|
||
(LPCWSTR) wszFileName,
|
||
NULL);
|
||
HeapFree (GetProcessHeap(), 0, wszFileName);
|
||
return nReturn;
|
||
}
|
||
}
|
||
|
||
// try Trusted service name
|
||
szCmdArgFileName = (LPSTR)GetTrustedServiceName (argv[1]);
|
||
if (szCmdArgFileName != NULL) {
|
||
dwFileNameLen = lstrlenA(szCmdArgFileName) + 1;
|
||
wszFileName = HeapAlloc (GetProcessHeap(), 0, (dwFileNameLen) * sizeof (WCHAR));
|
||
if (wszFileName != NULL) {
|
||
mbstowcs (wszFileName, szCmdArgFileName, dwFileNameLen);
|
||
nReturn = (int)SetServiceAsTrusted (NULL,
|
||
(LPCWSTR)wszFileName); // filename is really the service name
|
||
HeapFree (GetProcessHeap(), 0, wszFileName);
|
||
return nReturn;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// if here then load the registry from an ini file
|
||
return (int) LoadPerfCounterTextStrings (
|
||
lpCommandLine,
|
||
FALSE); // show text strings to console
|
||
}
|