|
|
// pdlcnfig.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "pdlcnfig.h"
#include "OutPage.h"
#include "SetPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CPdlConfigApp
BEGIN_MESSAGE_MAP(CPdlConfigApp, CWinApp) //{{AFX_MSG_MAP(CPdlConfigApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPdlConfigApp construction
CPdlConfigApp::CPdlConfigApp() { // TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CPdlConfigApp object
CPdlConfigApp theApp;
/////////////////////////////////////////////////////////////////////////////
// Test for installation of the service.
LONG CPdlConfigApp::PerfLogServiceStatus() { HKEY hKeyLogService; LONG lStatus;
// try opening the key to the service
lStatus = RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\PerfDataLog"), 0, KEY_READ | KEY_WRITE, &hKeyLogService);
if (lStatus == ERROR_SUCCESS) { // don't keep the key open
RegCloseKey (hKeyLogService); }
return lStatus; }
LONG CPdlConfigApp::ServiceFilesCopied() { HANDLE hFile = INVALID_HANDLE_VALUE; LONG lStatus = ERROR_SUCCESS; TCHAR szFullPathName[MAX_PATH];
ExpandEnvironmentStrings ( TEXT("%windir%\\system32\\pdlsvc.exe"), szFullPathName, MAX_PATH);
hFile = CreateFile ( szFullPathName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { lStatus = GetLastError(); } else { CloseHandle (hFile); lStatus = ERROR_SUCCESS; }
return lStatus; }
/////////////////////////////////////////////////////////////////////////////
// CPdlConfigApp initialization
LONG CPdlConfigApp::CreatePerfDataLogService () { LONG lStatus = ERROR_SUCCESS; HKEY hKeyServices = NULL; HKEY hKeyPerfLog = NULL; HKEY hKeyPerfAlert = NULL; DWORD dwWaitLimit = 20; SC_HANDLE hSC; SC_HANDLE hLogService;
// create service
hSC = OpenSCManager (NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (hSC == NULL) { // display error message
lStatus = GetLastError(); }
if (lStatus == ERROR_SUCCESS) { hLogService = CreateService (hSC, TEXT("PerfDataLog"), TEXT("Performance Data Log"), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, TEXT("%systemroot%\\system32\\pdlsvc.exe"), NULL, NULL, NULL, NULL, NULL);
if (hLogService == NULL) { lStatus = GetLastError(); } else { lStatus = ERROR_SUCCESS; CloseServiceHandle (hLogService); }
if (lStatus == ERROR_SUCCESS) { // wait until the registry is updated before continuing
while (lStatus = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\PerfDataLog"), 0, KEY_READ | KEY_WRITE, &hKeyPerfLog) != ERROR_SUCCESS) { Sleep (500); // wait .5 seconds and try again
if (--dwWaitLimit == 0) { AfxMessageBox (IDS_SC_CREATE_ERROR); break; } }
if (lStatus == ERROR_SUCCESS) { RegCloseKey (hKeyPerfLog); } }
CloseServiceHandle (hSC); }
return lStatus; }
LONG CPdlConfigApp::InitPerfDataLogRegistry () { LONG lStatus = ERROR_SUCCESS;
HKEY hKeyPerfLog = NULL; HKEY hKeyLogQueries = NULL; HKEY hKeyLogQueriesDefault = NULL;
HKEY hKeyPerfAlert = NULL; HKEY hKeyAlertQueries = NULL; HKEY hKeyAlertQueriesDefault = NULL;
HKEY hKeyEventLogApplication = NULL; HKEY hKeyEventLogPerfDataLog = NULL; HKEY hKeyEventLogPerfDataAlert = NULL;
DWORD dwValue; DWORD dwDisposition;
// open registry key
lStatus = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\PerfDataLog"), 0, KEY_READ | KEY_WRITE, &hKeyPerfLog); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
// add registry subkeys for Log Queries
lStatus = RegCreateKeyEx ( hKeyPerfLog, TEXT("Log Queries"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKeyLogQueries, &dwDisposition); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
lStatus = RegCreateKeyEx ( hKeyLogQueries, TEXT("Default"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKeyLogQueriesDefault, &dwDisposition); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
// open registry key
lStatus = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\EventLog\\Application"), 0, KEY_READ | KEY_WRITE, &hKeyEventLogApplication); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
// add registry subkeys for event log
lStatus = RegCreateKeyEx ( hKeyEventLogApplication, TEXT("PerfDataLog"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKeyEventLogPerfDataLog, &dwDisposition); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
lStatus = RegSetValueEx (hKeyEventLogPerfDataLog, TEXT("EventMessageFile"), 0, REG_SZ, (BYTE *)TEXT("%systemroot%\\system32\\pdlsvc.exe"), (lstrlen(TEXT("%systemroot%\\system32\\pdlsvc.exe"))+1) * sizeof (TCHAR)); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
dwValue = 7; lStatus = RegSetValueEx (hKeyEventLogPerfDataLog, TEXT("TypesSupported"), 0, REG_DWORD, (BYTE *)&dwValue, sizeof (DWORD)); ASSERT (lStatus == ERROR_SUCCESS); if (lStatus != ERROR_SUCCESS) goto Close_And_Exit;
Close_And_Exit:
if (hKeyPerfLog != NULL) RegCloseKey (hKeyPerfLog); if (hKeyLogQueries != NULL) RegCloseKey (hKeyLogQueries); if (hKeyLogQueriesDefault != NULL) RegCloseKey (hKeyLogQueriesDefault);
if (hKeyEventLogApplication != NULL) RegCloseKey (hKeyEventLogApplication); if (hKeyEventLogPerfDataLog != NULL) RegCloseKey (hKeyEventLogPerfDataLog);
return lStatus; }
/////////////////////////////////////////////////////////////////////////////
// CPdlConfigApp initialization
BOOL CPdlConfigApp::InitInstance() { LONG lServiceStatus; CString csMessage; BOOL bReturn = TRUE;
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
lServiceStatus = PerfLogServiceStatus();
if (lServiceStatus == ERROR_FILE_NOT_FOUND) { lServiceStatus = ServiceFilesCopied(); if (lServiceStatus == ERROR_SUCCESS) { if (AfxMessageBox (IDS_QUERY_INSTALL, MB_OKCANCEL | MB_ICONQUESTION) == IDOK) { lServiceStatus = CreatePerfDataLogService(); if (lServiceStatus == ERROR_SUCCESS) { lServiceStatus = InitPerfDataLogRegistry(); } if (lServiceStatus != ERROR_SUCCESS) { csMessage.FormatMessage (lServiceStatus); AfxMessageBox (csMessage); bReturn = FALSE; } else { // the service was successfully installed so display
// message
AfxMessageBox (IDS_SERVICE_INSTALLED); } } else { // the service is not installed and the user doesn't
// want it installed so exit
bReturn = FALSE; } } else { // then the service has not yet been installed so bail
AfxMessageBox (IDS_SERVICE_NOT_INSTALLED); bReturn = FALSE; } } else if (lServiceStatus == ERROR_ACCESS_DENIED) { AfxMessageBox (IDS_ACCESS_DENIED, MB_OK | MB_ICONEXCLAMATION); bReturn = FALSE; } else if (lServiceStatus != ERROR_SUCCESS) { AfxMessageBox (IDS_REGISTRY_ERROR, MB_OK | MB_ICONEXCLAMATION); bReturn = FALSE; } else { bReturn = TRUE; }
if (bReturn) { CPropertySheet PSheet; COutputPropPage POutput; CSettingsPropPage PSettings;
m_pMainWnd = &PSheet;
csMessage.LoadString (IDS_PROPERTY_SHEET_CAPTION); PSheet.SetTitle(csMessage); PSheet.AddPage(&PSettings); PSheet.AddPage(&POutput);
INT_PTR nResponse = PSheet.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is
// dismissed with OK
} else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is
// dismissed with Cancel
} bReturn = FALSE; }
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return bReturn; }
|