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.
 
 
 
 
 
 

270 lines
8.4 KiB

/*++
Copyright (c) 1993-1994 Microsoft Corporation
Module Name:
initodat.c
Abstract:
Routines for converting Perf???.ini to Perf???.dat files.
Source INI files are localed under ..\perfini\<country> directories. Generated DAT files will
be put under %SystemRoot%\System32 directory.
Author:
HonWah Chan (a-honwah) October, 1993
Revision History:
--*/
#include "initodat.h"
#include "strids.h"
#include "common.h"
BOOL
MakeUpgradeFilename(
LPCWSTR szDataFileName,
LPWSTR szUpgradeFileName
)
{
BOOL bReturn = FALSE;
// note: assumes szUpgradeFileName buffer is large enough for result
WCHAR szDrive[_MAX_DRIVE];
WCHAR szDir[_MAX_DIR];
WCHAR szFileName[_MAX_FNAME];
WCHAR szExt[_MAX_EXT];
_wsplitpath(szDataFileName, (LPWSTR) szDrive, (LPWSTR) szDir, (LPWSTR) szFileName, (LPWSTR) szExt);
// see if the filename fits the "PERF[C|H]XXX" format
if (szFileName[4] == L'C' || szFileName[4] == L'H' || szFileName[4] == L'c' || szFileName[4] == L'h') {
// then it's the correct format so change the 4th letter up 1 letter
szFileName[4] += 1;
// and make a new path
_wmakepath(szUpgradeFileName, (LPCWSTR) szDrive, (LPCWSTR) szDir, (LPCWSTR) szFileName, (LPCWSTR) szExt);
bReturn = TRUE;
}
return bReturn;
}
BOOL
GetFilesFromCommandLine(
LPWSTR lpCommandLine,
#ifdef FE_SB
UINT * puCodePage,
#endif
LPWSTR lpFileNameI,
DWORD dwFileNameI,
LPWSTR lpFileNameD,
DWORD dwFileNameD
)
/*++
GetFilesFromCommandLine
parses the command line to retrieve the ini filename that should be
the first and only argument.
Arguments
lpCommandLine pointer to command line (returned by GetCommandLine)
lpFileNameI pointer to buffer that will receive address of the
validated input filename entered on the command line
lpFileNameD pointer to buffer that will receive address of the
optional output filename entered on the command line
Return Value
TRUE if a valid filename was returned
FALSE if the filename is not valid or missing
error is returned in GetLastError
--*/
{
INT iNumArgs;
HFILE hIniFile;
OFSTRUCT ofIniFile;
CHAR lpIniFileName[FILE_NAME_BUFFER_SIZE];
WCHAR lpExeName[FILE_NAME_BUFFER_SIZE];
WCHAR lpIniName[FILE_NAME_BUFFER_SIZE];
BOOL bReturn = FALSE;
// check for valid arguments
if (lpCommandLine == NULL || lpFileNameI == NULL || lpFileNameD == NULL) {
goto Cleanup;
}
// get strings from command line
#ifdef FE_SB
iNumArgs = swscanf(lpCommandLine, L" %s %d %s %s ", lpExeName, puCodePage, lpIniName, lpFileNameD);
#else
iNumArgs = swscanf(lpCommandLine, L" %s %s %s ", lpExeName, lpIniName, lpFileNameD);
#endif
#ifdef FE_SB
if (iNumArgs < 3 || iNumArgs > 4) {
#else
if (iNumArgs < 2 || iNumArgs > 3) {
#endif
// wrong number of arguments
goto Cleanup;
}
// see if file specified exists
// file name is always an ANSI buffer
WideCharToMultiByte(CP_ACP, 0, lpIniName, -1, lpIniFileName, FILE_NAME_BUFFER_SIZE, NULL, NULL);
hIniFile = OpenFile(lpIniFileName, & ofIniFile, OF_PARSE);
if (hIniFile != HFILE_ERROR) {
_lclose(hIniFile);
hIniFile = OpenFile(lpIniFileName, & ofIniFile, OF_EXIST);
if ((hIniFile && hIniFile != HFILE_ERROR) || GetLastError() == ERROR_FILE_EXISTS) {
// file exists, so return name and success
// return full pathname if found
MultiByteToWideChar(CP_ACP, 0, ofIniFile.szPathName, -1, lpFileNameI, dwFileNameI);
bReturn = TRUE;
_lclose(hIniFile);
}
else {
// filename was on command line, but not valid so return
// false, but send name back for error message
MultiByteToWideChar(CP_ACP, 0, lpIniFileName, -1, lpFileNameI, dwFileNameI);
if (hIniFile && hIniFile != HFILE_ERROR) _lclose(hIniFile);
}
}
Cleanup:
return bReturn;
}
BOOL
VerifyIniData(
PVOID pValueBuffer,
ULONG ValueLength
)
/*++
VerifyIniData
This routine does some simple check to see if the ini file is good.
Basically, it is looking for (ID, Text) and checking that ID is an
integer. Mostly in case of missing comma or quote, the ID will be
an invalid integer.
--*/
{
INT iNumArg;
INT TextID;
LPWSTR lpID = NULL;
LPWSTR lpText = NULL;
LPWSTR lpLastID;
LPWSTR lpLastText;
LPWSTR lpInputBuffer = (LPWSTR) pValueBuffer;
LPWSTR lpBeginBuffer = (LPWSTR) pValueBuffer;
BOOL returnCode = TRUE;
UINT NumOfID = 0;
ULONG CurrentLength;
while (TRUE) {
// save up the last items for summary display later
lpLastID = lpID;
lpLastText = lpText;
// increment to next ID and text location
lpID = lpInputBuffer;
CurrentLength = (ULONG) ((PBYTE) lpID - (PBYTE) lpBeginBuffer + sizeof(WCHAR));
if (CurrentLength >= ValueLength) break;
CurrentLength += lstrlenW(lpID) + 1;
if (CurrentLength >= ValueLength) break;
lpText = lpID + lstrlenW(lpID) + 1;
CurrentLength += lstrlenW(lpText) + 1;
if (CurrentLength >= ValueLength) break;
lpInputBuffer = lpText + lstrlenW(lpText) + 1;
iNumArg = swscanf(lpID, L"%d", & TextID);
if (iNumArg != 1) {
// bad ID
returnCode = FALSE;
break;
}
NumOfID ++;
}
if (returnCode == FALSE) {
DisplaySummaryError(lpLastID, lpLastText, NumOfID);
}
else {
DisplaySummary(lpLastID, lpLastText, NumOfID);
}
return (returnCode);
}
__cdecl main(
)
/*++
main
Arguments
ReturnValue
0 (ERROR_SUCCESS) if command was processed
Non-Zero if command error was detected.
--*/
{
LPWSTR lpCommandLine;
WCHAR lpIniFile[MAX_PATH];
WCHAR lpDatFile[MAX_PATH];
UNICODE_STRING IniFileName;
PVOID pValueBuffer = NULL;
ULONG ValueLength;
BOOL bStatus;
NTSTATUS NtStatus = ERROR_SUCCESS;
#ifdef FE_SB
UINT uCodePage = CP_ACP;
#endif
lpCommandLine = GetCommandLineW(); // get command line
if (lpCommandLine == NULL) {
NtStatus = GetLastError();
goto Cleanup;
}
// read command line to determine what to do
lpIniFile[0] = lpDatFile[0] = L'\0';
#ifdef FE_SB // FE_SB
if (GetFilesFromCommandLine(lpCommandLine, & uCodePage,
lpIniFile, RTL_NUMBER_OF(lpIniFile), lpDatFile, RTL_NUMBER_OF(lpDatFile))) {
if (! IsValidCodePage(uCodePage)) {
uCodePage = CP_ACP;
}
#else
if (GetFilesFromCommandLine(lpCommandLine,
lpIniFile, RTL_NUMBER_OF(lpIniFile), lpDatFile, RTL_NUMBER_OF(lpDatFile))) {
#endif // FE_SB
// valid filename (i.e. ini file exists)
RtlInitUnicodeString(& IniFileName, lpIniFile);
#ifdef FE_SB
NtStatus = DatReadMultiSzFile(uCodePage, & IniFileName, & pValueBuffer, & ValueLength);
#else
NtStatus = DatReadMultiSzFile(& IniFileName, & pValueBuffer, & ValueLength);
#endif
bStatus = NT_SUCCESS(NtStatus);
if (bStatus) {
bStatus = VerifyIniData(pValueBuffer, ValueLength);
if (bStatus) {
bStatus = OutputIniData(
& IniFileName, lpDatFile, RTL_NUMBER_OF(lpDatFile), pValueBuffer, ValueLength);
bStatus = MakeUpgradeFilename(lpDatFile, lpDatFile);
if (bStatus) {
bStatus = OutputIniData(
& IniFileName, lpDatFile, RTL_NUMBER_OF(lpDatFile), pValueBuffer, ValueLength);
}
}
}
}
else {
if (* lpIniFile) {
printf(GetFormatResource(LC_NO_INIFILE), lpIniFile);
}
else {
//Incorrect Command Format
// display command line usage
DisplayCommandHelp(LC_FIRST_CMD_HELP, LC_LAST_CMD_HELP);
}
}
Cleanup:
if (pValueBuffer != NULL) FREEMEM(pValueBuffer);
return (NtStatus); // success
}