214 lines
4.8 KiB
C++
214 lines
4.8 KiB
C++
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1999.
|
||
|
//
|
||
|
// File: main.cxx
|
||
|
//
|
||
|
// Contents: Stub executable that launches Event Viewer Snapin.
|
||
|
//
|
||
|
// History: 01-14-1999 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
#include "headers.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#define THIS_FILE L"main.cxx"
|
||
|
#define MAX_START_WAIT 500
|
||
|
const WCHAR c_wzBaseCommand[] = L"mmc.exe /s ";
|
||
|
const WCHAR c_wzEventMsc[] = L"eventvwr.msc";
|
||
|
const WCHAR c_wzComputerSwitch[] = L" /COMPUTER=";
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: NextSpace
|
||
|
//
|
||
|
// Synopsis: Return a pointer to the first space character found,
|
||
|
// starting at [pwz], or to the end of the string, whichever
|
||
|
// is first.
|
||
|
//
|
||
|
// History: 01-14-1999 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
PWSTR
|
||
|
NextSpace(
|
||
|
PWSTR pwz)
|
||
|
{
|
||
|
while (*pwz && *pwz != L' ')
|
||
|
{
|
||
|
pwz++;
|
||
|
}
|
||
|
return pwz;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+--------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: main
|
||
|
//
|
||
|
// Synopsis: Launch the event viewer snapin.
|
||
|
//
|
||
|
// Returns: 0
|
||
|
//
|
||
|
// History: 01-14-1999 DavidMun Created
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
int _cdecl
|
||
|
main(int argc, char * argv[])
|
||
|
{
|
||
|
//
|
||
|
// Process the command line, ignoring /L and /H switches and treating
|
||
|
// anything else as a server name.
|
||
|
//
|
||
|
|
||
|
PWSTR pwzArgs = GetCommandLine();
|
||
|
|
||
|
//
|
||
|
// Skip this executable's name
|
||
|
//
|
||
|
|
||
|
pwzArgs = NextSpace(pwzArgs);
|
||
|
|
||
|
//
|
||
|
// Advance until the server name or end of string, ignoring switches
|
||
|
//
|
||
|
|
||
|
while (*pwzArgs)
|
||
|
{
|
||
|
if (*pwzArgs == L' ')
|
||
|
{
|
||
|
pwzArgs++;
|
||
|
}
|
||
|
else if (*pwzArgs == L'-' || *pwzArgs == L'/')
|
||
|
{
|
||
|
pwzArgs = NextSpace(pwzArgs);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PWSTR pwzFileEnd = NextSpace(pwzArgs);
|
||
|
|
||
|
*pwzFileEnd = L'\0';
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// pwzArgs either points to a server name or end of string.
|
||
|
// Build up a commandline for the CreateProcess call.
|
||
|
|
||
|
WCHAR wzCommandLine[MAX_PATH
|
||
|
+ ARRAYLEN(c_wzBaseCommand) - 1
|
||
|
+ MAX_PATH
|
||
|
+ ARRAYLEN(c_wzComputerSwitch) - 1];
|
||
|
|
||
|
lstrcpy(wzCommandLine, c_wzBaseCommand);
|
||
|
|
||
|
//
|
||
|
// Build the path to the eventvwr.msc file, which is installed
|
||
|
// in system32.
|
||
|
//
|
||
|
|
||
|
WCHAR wzMscPath[MAX_PATH] = L"";
|
||
|
|
||
|
UINT cchSysDir = GetSystemDirectory(wzMscPath, ARRAYLEN(wzMscPath));
|
||
|
|
||
|
if (!cchSysDir || cchSysDir > ARRAYLEN(wzMscPath))
|
||
|
{
|
||
|
PopupMessage(IDS_NO_SYSTEMDIR);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (wzMscPath[cchSysDir - 1] != L'\\')
|
||
|
{
|
||
|
wzMscPath[cchSysDir++] = L'\\';
|
||
|
wzMscPath[cchSysDir] = L'\0';
|
||
|
}
|
||
|
lstrcat(wzMscPath, c_wzEventMsc);
|
||
|
|
||
|
//
|
||
|
// Verify that the .msc file exists, because mmc doesn't give a good
|
||
|
// error message if it doesn't.
|
||
|
//
|
||
|
|
||
|
HANDLE hMscFile;
|
||
|
|
||
|
hMscFile = CreateFile(wzMscPath,
|
||
|
0, // no access, just checking for existence
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
|
||
|
if (hMscFile == INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
PopupMessage(IDS_EVENTVWR_MSC_NOT_FOUND, wzMscPath);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
CloseHandle(hMscFile);
|
||
|
|
||
|
//
|
||
|
// Add eventvwr.msc to command line.
|
||
|
//
|
||
|
|
||
|
lstrcat(wzCommandLine, wzMscPath);
|
||
|
|
||
|
//
|
||
|
// Append the server name, if supplied
|
||
|
//
|
||
|
|
||
|
if (*pwzArgs)
|
||
|
{
|
||
|
lstrcat(wzCommandLine, c_wzComputerSwitch);
|
||
|
lstrcat(wzCommandLine, pwzArgs);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Try to launch mmc
|
||
|
//
|
||
|
|
||
|
BOOL fOk;
|
||
|
STARTUPINFO si;
|
||
|
PROCESS_INFORMATION pi;
|
||
|
|
||
|
ZeroMemory(&si, sizeof si);
|
||
|
si.cb = sizeof si;
|
||
|
|
||
|
si.dwFlags = STARTF_USESHOWWINDOW;
|
||
|
si.wShowWindow = SW_SHOWDEFAULT;
|
||
|
|
||
|
ZeroMemory(&pi, sizeof pi);
|
||
|
|
||
|
fOk = CreateProcess(NULL,
|
||
|
wzCommandLine,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
FALSE,
|
||
|
NORMAL_PRIORITY_CLASS,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
&si,
|
||
|
&pi);
|
||
|
|
||
|
if (fOk)
|
||
|
{
|
||
|
WaitForInputIdle(pi.hProcess, MAX_START_WAIT);
|
||
|
CloseHandle(pi.hThread);
|
||
|
CloseHandle(pi.hProcess);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
PopupMessageAndCode(THIS_FILE, __LINE__, hr, IDS_MMC_LAUNCH_FAILED);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|