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.
 
 
 
 
 
 

326 lines
11 KiB

/*++
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
--*/
// Windows Include files
//
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <locale.h>
#include "mbctype.h"
#include "strsafe.h"
#include <winperf.h>
#include <loadperf.h>
static CHAR szFileNameBuffer[MAX_PATH * 2];
LPWSTR
LodctrMultiByteToWideChar(LPSTR aszString)
{
LPWSTR wszString = NULL;
int dwValue = MultiByteToWideChar(_getmbcp(), 0, aszString, -1, NULL, 0);
if (dwValue != 0) {
wszString = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (dwValue + 1) * sizeof(WCHAR));
if (wszString != NULL) {
MultiByteToWideChar(_getmbcp(), 0, aszString, -1, wszString, dwValue + 1);
}
}
return wszString;
}
LPCSTR GetTrustedServiceName(LPCSTR szArg1)
{
LPSTR szReturn = NULL;
if (lstrlenA(szArg1) >= 4) {
if ((szArg1[0] == '-' || szArg1[0] == '/') && (szArg1[1] == 't' || szArg1[1] == 'T') && (szArg1[2] == ':')) {
szReturn = (LPSTR) & szArg1[3];
}
}
return (LPCSTR) szReturn;
}
BOOL
GetUpgradeFileNames(LPCSTR * szArgs, LPSTR * szCounterFile, LPSTR * szHelpFile, LPSTR * szLangId)
{
DWORD dwArgIdx = 1;
DWORD dwMask = 0;
* szCounterFile = NULL;
* szHelpFile = NULL;
* szLangId = NULL;
do {
if (lstrlenA(szArgs[dwArgIdx]) >= 4) {
if ((szArgs[dwArgIdx][0] == '-') || (szArgs[dwArgIdx][0] == '/')) {
if ((szArgs[dwArgIdx][1] == 'c' || szArgs[dwArgIdx ][1] == 'C') && (szArgs[dwArgIdx][2] == ':')) {
* szCounterFile = (LPSTR) & szArgs[dwArgIdx][3];
dwMask |= 1;
}
else if ((szArgs[dwArgIdx][1] == 'h' || szArgs[dwArgIdx][1] == 'H') && (szArgs[dwArgIdx][2] == ':')) {
* szHelpFile = (LPSTR) & szArgs[dwArgIdx][3];
dwMask |= 2;
}
else if ((szArgs[dwArgIdx][1] == 'l' || szArgs[dwArgIdx][1] == 'L') && (szArgs[dwArgIdx][2] == ':')) {
* szLangId = (LPSTR) & szArgs[dwArgIdx][3];
dwMask |= 4;
}
}
}
dwArgIdx ++;
}
while (dwArgIdx <= 3);
return (dwMask == 7) ? (TRUE) : (FALSE);
}
BOOL GetSaveFileName(LPCSTR szArg1, LPCSTR * szSaveFile)
{
BOOL bReturn = FALSE;
DWORD dwSize = 0;
* szSaveFile = NULL;
if (lstrlenA(szArg1) >= 4) {
if ((szArg1[0] == '-' || szArg1[0] == '/') && (szArg1[1] == 's' || szArg1[1] == 'S') && (szArg1[2] == ':')) {
bReturn = TRUE;
ZeroMemory(szFileNameBuffer, sizeof(szFileNameBuffer));
dwSize = SearchPathA(NULL,
(LPSTR) & szArg1[3],
NULL,
RTL_NUMBER_OF(szFileNameBuffer),
szFileNameBuffer,
NULL);
if (dwSize == 0) {
* szSaveFile = (LPSTR) & szArg1[3];
}
else {
* szSaveFile = szFileNameBuffer;
}
}
}
return bReturn;
}
BOOL GetRestoreFileName(LPCSTR szArg1, LPCSTR * szRestoreFile)
{
BOOL bReturn = FALSE;
DWORD dwSize = 0;
* szRestoreFile = NULL;
if (lstrlenA(szArg1) >= 2) {
if ((szArg1[0] == '-' || szArg1[0] == '/') && (szArg1[1] == 'r' || szArg1[1] == 'R')) {
if (lstrlenA(szArg1) >= 4 && szArg1[2] == ':') {
ZeroMemory(szFileNameBuffer, sizeof(szFileNameBuffer));
dwSize = SearchPathA(NULL,
(LPSTR) & szArg1[3],
NULL,
RTL_NUMBER_OF(szFileNameBuffer),
szFileNameBuffer,
NULL);
if (dwSize == 0) {
* szRestoreFile = (LPSTR) & szArg1[3];
}
else {
* szRestoreFile = szFileNameBuffer;
}
}
bReturn = TRUE;
}
}
return bReturn;
}
////////////////////////////////////////////////////////////////////////////
//
// MySetThreadUILanguage
//
// This routine sets the thread UI language based on the console codepage.
//
// 9-29-00 WeiWu Created.
// Copied from Base\Win32\Winnls so that it works in W2K as well
////////////////////////////////////////////////////////////////////////////
LANGID WINAPI MySetThreadUILanguage(WORD wReserved)
{
//
// Cache system locale and CP info
//
static LCID s_lidSystem = 0;
static UINT s_uiSysCp = 0;
static UINT s_uiSysOEMCp = 0;
ULONG uiUserUICp;
ULONG uiUserUIOEMCp;
WCHAR szData[16];
UNICODE_STRING ucStr;
LANGID lidUserUI = GetUserDefaultUILanguage();
LCID lcidThreadOld = GetThreadLocale();
//
// Set default thread locale to EN-US
//
// This allow us to fall back to English UI to avoid trashed characters
// when console doesn't meet the criteria of rendering native UI.
//
LCID lcidThread = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
UINT uiConsoleCp = GetConsoleOutputCP();
//
// Make sure nobody uses it yet
//
ASSERT(wReserved == 0);
//
// Get cached system locale and CP info.
//
if (!s_uiSysCp) {
LCID lcidSystem = GetSystemDefaultLCID();
if (lcidSystem) {
//
// Get ANSI CP
//
GetLocaleInfoW(lcidSystem, LOCALE_IDEFAULTANSICODEPAGE, szData, sizeof(szData)/sizeof(WCHAR));
RtlInitUnicodeString(&ucStr, szData);
RtlUnicodeStringToInteger(&ucStr, 10, &uiUserUICp);
//
// Get OEM CP
//
GetLocaleInfoW(lcidSystem, LOCALE_IDEFAULTCODEPAGE, szData, sizeof(szData)/sizeof(WCHAR));
RtlInitUnicodeString(&ucStr, szData);
RtlUnicodeStringToInteger(&ucStr, 10, &s_uiSysOEMCp);
//
// Cache system primary langauge
//
s_lidSystem = PRIMARYLANGID(LANGIDFROMLCID(lcidSystem));
}
}
//
// Don't cache user UI language and CP info, UI language can be changed without system reboot.
//
if (lidUserUI) {
GetLocaleInfoW(MAKELCID(lidUserUI,SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, szData, sizeof(szData)/sizeof(WCHAR));
RtlInitUnicodeString(& ucStr, szData);
RtlUnicodeStringToInteger(& ucStr, 10, &uiUserUICp);
GetLocaleInfoW(MAKELCID(lidUserUI,SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, szData, sizeof(szData)/sizeof(WCHAR));
RtlInitUnicodeString(& ucStr, szData);
RtlUnicodeStringToInteger(& ucStr, 10, &uiUserUIOEMCp);
}
//
// Complex scripts cannot be rendered in the console, so we
// force the English (US) resource.
//
if (uiConsoleCp && s_lidSystem != LANG_ARABIC && s_lidSystem != LANG_HEBREW &&
s_lidSystem != LANG_VIETNAMESE && s_lidSystem != LANG_THAI) {
//
// Use UI language for console only when console CP, system CP and UI language CP match.
//
if ((uiConsoleCp == s_uiSysCp || uiConsoleCp == s_uiSysOEMCp) &&
(uiConsoleCp == uiUserUICp || uiConsoleCp == uiUserUIOEMCp)) {
lcidThread = MAKELCID(lidUserUI, SORT_DEFAULT);
}
}
//
// Set the thread locale if it's different from the currently set
// thread locale.
//
if ((lcidThread != lcidThreadOld) && (!SetThreadLocale(lcidThread))) {
lcidThread = lcidThreadOld;
}
//
// Return the thread locale that was set.
//
return (LANGIDFROMLCID(lcidThread));
}
int __cdecl main(int argc, char * argv[])
{
LPSTR szCmdArgFileName = NULL;
LPWSTR wszFileName = NULL;
int nReturn = 0;
BOOL bSuccess = FALSE;
setlocale(LC_ALL, ".OCP");
MySetThreadUILanguage(0);
// check for a service name in the command line
if (argc >= 4) {
LPSTR szCounterFile = NULL;
LPSTR szHelpFile = NULL;
LPSTR szLanguageID = NULL;
bSuccess = GetUpgradeFileNames(argv, & szCounterFile, & szHelpFile, & szLanguageID);
if (bSuccess) {
nReturn = (int) UpdatePerfNameFilesA(szCounterFile, szHelpFile, szLanguageID, 0);
}
}
else if (argc >= 2) {
// then there's a param to check
bSuccess = GetSaveFileName(argv[1], & szCmdArgFileName);
if (bSuccess && szCmdArgFileName != NULL) {
wszFileName = LodctrMultiByteToWideChar(szCmdArgFileName);
if (wszFileName != NULL) {
nReturn = (int) BackupPerfRegistryToFileW((LPCWSTR) wszFileName, (LPCWSTR) L"");
HeapFree(GetProcessHeap(), 0, wszFileName);
}
}
if (! bSuccess) {
bSuccess = GetRestoreFileName(argv[1], & szCmdArgFileName);
if (bSuccess) {
wszFileName = NULL;
if (szCmdArgFileName != NULL) {
wszFileName = LodctrMultiByteToWideChar(szCmdArgFileName);
}
nReturn = (int) RestorePerfRegistryFromFileW((LPCWSTR) wszFileName, NULL);
if (wszFileName != NULL) {
HeapFree(GetProcessHeap(), 0, wszFileName);
}
}
}
if (! bSuccess) {
szCmdArgFileName = (LPSTR) GetTrustedServiceName(argv[1]);
if (szCmdArgFileName != NULL) {
wszFileName = LodctrMultiByteToWideChar(szCmdArgFileName);
if (wszFileName != NULL) {
nReturn = (int) SetServiceAsTrustedW(NULL, (LPCWSTR) wszFileName);
bSuccess = TRUE;
HeapFree(GetProcessHeap(), 0, wszFileName);
}
}
}
}
if (! bSuccess) {
// if here then load the registry from an ini file
LPWSTR lpCommandLine = GetCommandLineW();
nReturn = (int) LoadPerfCounterTextStringsW(lpCommandLine, FALSE);
}
return nReturn;
}