427 lines
13 KiB
C
427 lines
13 KiB
C
|
//==========================================================================//
|
|||
|
// Includes //
|
|||
|
//==========================================================================//
|
|||
|
#include <string.h> // strupr
|
|||
|
#include <stdio.h> // for sprintf.
|
|||
|
|
|||
|
|
|||
|
#include "setedit.h"
|
|||
|
#include "init.h" // external declarations for this file
|
|||
|
|
|||
|
#include "command.h" // for ViewChart
|
|||
|
#include "grafdata.h" // for QuerySaveChart
|
|||
|
#include "graph.h" // for GraphInitializeApplication
|
|||
|
#include "legend.h" // for LegendInitializeApplication
|
|||
|
#include "perfdata.h" // for PerfDataInitializeInstance
|
|||
|
#include "perfmops.h" // for OpenFileHandler, for now
|
|||
|
#include "status.h" // for StatusInitializeApplication
|
|||
|
#include "registry.h" // for Load/SaveMainWindowPlacement
|
|||
|
#include "toolbar.h" // for ToolbarInitializeApplication
|
|||
|
#include "utils.h"
|
|||
|
#include "fileopen.h" // for FileOpen
|
|||
|
#include "pmemory.h" // for MemoryFree
|
|||
|
|
|||
|
extern TCHAR DefaultLangId[] ;
|
|||
|
extern TCHAR EnglishLangId[] ;
|
|||
|
|
|||
|
static LPSTR lpszCommandLine;
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Constants //
|
|||
|
//==========================================================================//
|
|||
|
|
|||
|
|
|||
|
#define szPerfmonMainClass TEXT("PerfmonMainClass")
|
|||
|
|
|||
|
HHOOK lpMsgFilterProc ;
|
|||
|
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Local Functions //
|
|||
|
//==========================================================================//
|
|||
|
static
|
|||
|
LONG
|
|||
|
EnablePrivilege (
|
|||
|
IN LPTSTR szPrivName
|
|||
|
)
|
|||
|
{
|
|||
|
LUID SePrivNameValue;
|
|||
|
TOKEN_PRIVILEGES tkp;
|
|||
|
|
|||
|
HANDLE hToken = NULL;
|
|||
|
|
|||
|
/* Retrieve a handle of the access token. */
|
|||
|
|
|||
|
if (!OpenProcessToken(GetCurrentProcess(),
|
|||
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
|||
|
&hToken)) {
|
|||
|
goto Exit_Point;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Enable the privilege by name and get the ID
|
|||
|
*/
|
|||
|
|
|||
|
if (!LookupPrivilegeValue((LPTSTR) NULL,
|
|||
|
szPrivName,
|
|||
|
&SePrivNameValue)) {
|
|||
|
goto Exit_Point;
|
|||
|
}
|
|||
|
|
|||
|
tkp.PrivilegeCount = 1;
|
|||
|
tkp.Privileges[0].Luid = SePrivNameValue;
|
|||
|
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|||
|
|
|||
|
AdjustTokenPrivileges(hToken,
|
|||
|
FALSE,
|
|||
|
&tkp,
|
|||
|
sizeof(TOKEN_PRIVILEGES),
|
|||
|
(PTOKEN_PRIVILEGES) NULL,
|
|||
|
(PDWORD) NULL);
|
|||
|
|
|||
|
/* The return value of AdjustTokenPrivileges be texted. */
|
|||
|
|
|||
|
Exit_Point:
|
|||
|
|
|||
|
if (hToken != NULL) CloseHandle (hToken);
|
|||
|
return GetLastError();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void GetScalesFonts (void)
|
|||
|
{
|
|||
|
LOGFONT lf ;
|
|||
|
|
|||
|
memset (&lf, 0, sizeof (lf)) ;
|
|||
|
|
|||
|
lstrcpy (lf.lfFaceName, szScalesFontFace) ;
|
|||
|
lf.lfHeight = iScalesFontHeight ;
|
|||
|
lf.lfWeight = FW_REGULAR ;
|
|||
|
|
|||
|
hFontScales = CreateFontIndirect (&lf) ;
|
|||
|
|
|||
|
lf.lfWeight = FW_BOLD ;
|
|||
|
hFontScalesBold = CreateFontIndirect (&lf) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL InitializeSystemValues (void)
|
|||
|
/*
|
|||
|
Effect: Read and store in variables the various system values,
|
|||
|
such as the width and height of the screen and icons,
|
|||
|
the width of scroll bars, etc.
|
|||
|
|
|||
|
Called By: PerfmonInitialize only.
|
|||
|
|
|||
|
Returns: Whether this function was successful in getting all
|
|||
|
needed system values.
|
|||
|
*/
|
|||
|
{ // InitializeSystemValues
|
|||
|
xScreenWidth = GetSystemMetrics (SM_CXSCREEN) ;
|
|||
|
yScreenHeight = GetSystemMetrics (SM_CYSCREEN) ;
|
|||
|
|
|||
|
xBorderWidth = GetSystemMetrics (SM_CXBORDER) ;
|
|||
|
yBorderHeight = GetSystemMetrics (SM_CYBORDER) ;
|
|||
|
|
|||
|
xScrollWidth = GetSystemMetrics (SM_CXVSCROLL) ;
|
|||
|
yScrollHeight = GetSystemMetrics (SM_CYHSCROLL) ;
|
|||
|
|
|||
|
xScrollThumbWidth = GetSystemMetrics (SM_CXHTHUMB) ;
|
|||
|
yScrollThumbHeight = GetSystemMetrics (SM_CYVTHUMB) ;
|
|||
|
|
|||
|
xDlgBorderWidth = GetSystemMetrics (SM_CXDLGFRAME) ;
|
|||
|
yDlgBorderHeight = GetSystemMetrics (SM_CYDLGFRAME) ;
|
|||
|
|
|||
|
MinimumSize = yScrollHeight +
|
|||
|
GetSystemMetrics (SM_CYMENU) +
|
|||
|
GetSystemMetrics (SM_CYCAPTION) ;
|
|||
|
|
|||
|
//================================================================//
|
|||
|
// create all the brushes and pens for performance improvement //
|
|||
|
//================================================================//
|
|||
|
CreatePerfmonSystemObjects () ;
|
|||
|
hWhitePen = CreatePen (PS_SOLID, 3, crWhite) ;
|
|||
|
|
|||
|
return (TRUE) ;
|
|||
|
} // InitializeSystemValues
|
|||
|
|
|||
|
|
|||
|
BOOL InitializeApplication (void)
|
|||
|
/*
|
|||
|
Effect: Perform all initializations required for the FIRST
|
|||
|
instance of the Perfmon application. In particular,
|
|||
|
register all of Perfmon's window classes.
|
|||
|
|
|||
|
Note: There is no background brush set for the MainWindow
|
|||
|
class so that the main window is never erased. The
|
|||
|
client area of MainWindow is always covered by one
|
|||
|
of the view windows. If we erase it, it would just
|
|||
|
flicker needlessly.
|
|||
|
|
|||
|
Called By: PerfmonInitialize only.
|
|||
|
|
|||
|
Returns: Whether this function was successful in initializing.
|
|||
|
*/
|
|||
|
{ // InitializeApplication
|
|||
|
BOOL bSuccess ;
|
|||
|
WNDCLASS wc ;
|
|||
|
TCHAR LocalHelpFileName [ShortTextLen] ;
|
|||
|
LPTSTR pFileName ;
|
|||
|
|
|||
|
hIcon = LoadIcon (hInstance, idIcon) ;
|
|||
|
|
|||
|
//=============================//
|
|||
|
// Register Main window class //
|
|||
|
//=============================//
|
|||
|
|
|||
|
wc.style = CS_DBLCLKS | CS_BYTEALIGNCLIENT;
|
|||
|
wc.lpfnWndProc = (WNDPROC) MainWndProc;
|
|||
|
wc.hInstance = hInstance;
|
|||
|
wc.cbClsExtra = 0 ;
|
|||
|
wc.cbWndExtra = 0;
|
|||
|
wc.hIcon = hIcon ;
|
|||
|
wc.hCursor = LoadCursor(NULL, IDI_APPLICATION);
|
|||
|
wc.hbrBackground = NULL ; // see note above
|
|||
|
wc.lpszMenuName = idMenuChart ;
|
|||
|
wc.lpszClassName = szPerfmonMainClass ;
|
|||
|
|
|||
|
bSuccess = RegisterClass (&wc) ;
|
|||
|
|
|||
|
//=============================//
|
|||
|
// Register Abstract "Systems" //
|
|||
|
//=============================//
|
|||
|
hbLightGray = GetStockObject (LTGRAY_BRUSH) ;
|
|||
|
|
|||
|
if (bSuccess)
|
|||
|
bSuccess = StatusInitializeApplication () ;
|
|||
|
|
|||
|
if (bSuccess)
|
|||
|
bSuccess = GraphInitializeApplication () ;
|
|||
|
|
|||
|
return (bSuccess) ;
|
|||
|
} // InitializeApplication
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL InitializeInstance (int nCmdShow, LPCSTR lpszCmdLine)
|
|||
|
/*
|
|||
|
Effect: Perform all initializations required for EACH instance
|
|||
|
of the Perfmon application. In particular, create all
|
|||
|
of Perfmon's initial windows, and perform any other
|
|||
|
initializations except registering classes (done in
|
|||
|
InitializeApplication).
|
|||
|
|
|||
|
Called By: PerfmonInitialize only.
|
|||
|
|
|||
|
Note: This function has multiple return points.
|
|||
|
|
|||
|
Returns: Whether this function was successful in initalizing.
|
|||
|
*/
|
|||
|
{ // InitializeInstance
|
|||
|
DWORD ComputerNameLength;
|
|||
|
TCHAR szApplication [WindowCaptionLen] ;
|
|||
|
|
|||
|
// enable privileges needed to profile system
|
|||
|
// if this fails, that's ok for now.
|
|||
|
|
|||
|
EnablePrivilege (SE_SYSTEM_PROFILE_NAME); // to access perfdata
|
|||
|
EnablePrivilege (SE_INC_BASE_PRIORITY_NAME); // to raise priority
|
|||
|
|
|||
|
//=============================//
|
|||
|
// Set Priority high //
|
|||
|
//=============================//
|
|||
|
|
|||
|
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS) ;
|
|||
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) ;
|
|||
|
|
|||
|
//=============================//
|
|||
|
// Load Resources //
|
|||
|
//=============================//
|
|||
|
|
|||
|
GetScalesFonts () ;
|
|||
|
|
|||
|
hMenuChart = LoadMenu (hInstance, idMenuChart) ;
|
|||
|
|
|||
|
hAccelerators = LoadAccelerators (hInstance, idAccelerators) ;
|
|||
|
|
|||
|
|
|||
|
//=============================//
|
|||
|
// Initialize Systems //
|
|||
|
//=============================//
|
|||
|
|
|||
|
iLanguage = GetUserDefaultLangID() ;
|
|||
|
iEnglishLanguage = MAKELANGID (LANG_ENGLISH, LANG_NEUTRAL) ;
|
|||
|
TSPRINTF (DefaultLangId, TEXT("%03x"), iLanguage) ;
|
|||
|
TSPRINTF (EnglishLangId, TEXT("%03x"), iEnglishLanguage) ;
|
|||
|
|
|||
|
// GetComputerName returns the name without the "\\" prefix. We add
|
|||
|
// the prefix before even calling the routine. This is so that all our
|
|||
|
// computer names have the prefix and are therefore compatible with
|
|||
|
// I_SetSystemFocus (see perfmops.c).
|
|||
|
|
|||
|
ComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
|
|||
|
lstrcpy (LocalComputerName, szComputerPrefix) ;
|
|||
|
GetComputerName (LocalComputerName + lstrlen (szComputerPrefix),
|
|||
|
&ComputerNameLength);
|
|||
|
|
|||
|
PerfDataInitializeInstance () ;
|
|||
|
|
|||
|
//=============================//
|
|||
|
// Create Window //
|
|||
|
//=============================//
|
|||
|
|
|||
|
StringLoad (IDS_APPNAME, szApplication) ;
|
|||
|
hWndMain = CreateWindow (szPerfmonMainClass,
|
|||
|
szApplication,
|
|||
|
WS_OVERLAPPEDWINDOW | WS_BORDER,
|
|||
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|||
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL);
|
|||
|
|
|||
|
if (!hWndMain)
|
|||
|
return (FALSE) ;
|
|||
|
|
|||
|
ViewChart (hWndMain) ;
|
|||
|
|
|||
|
LoadMainWindowPlacement (hWndMain) ;
|
|||
|
|
|||
|
return (TRUE) ;
|
|||
|
} // InitializeInstance
|
|||
|
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Exported Functions //
|
|||
|
//==========================================================================//
|
|||
|
|
|||
|
|
|||
|
BOOL PerfmonInitialize (HINSTANCE hCurrentInstance,
|
|||
|
HINSTANCE hPrevInstance,
|
|||
|
LPCSTR lpszCmdLine,
|
|||
|
int nCmdShow)
|
|||
|
/*
|
|||
|
Effect: Performa all initializations required when Perfmon is
|
|||
|
started. In particular, initialize all "systems", register
|
|||
|
all window classes, create needed windows, read in and
|
|||
|
process font and Perfmon lists.
|
|||
|
|
|||
|
Called By: WinMain only, at the start of the application.
|
|||
|
|
|||
|
Assert: There are no other instances of Perfmon currently
|
|||
|
executing.
|
|||
|
|
|||
|
Returns: Whether initialization was successful. If this function
|
|||
|
returns FALSE, Perfmon should exit immediately.
|
|||
|
|
|||
|
Internals: The bSuccess variable is used to conditionalize each
|
|||
|
successive initialization step.
|
|||
|
*/
|
|||
|
{ // PerfmonInitialize
|
|||
|
BOOL bSuccess ;
|
|||
|
TCHAR szFilePath [FilePathLen + 1] ;
|
|||
|
LPTSTR pFileNameStart ;
|
|||
|
HANDLE hFindFile ;
|
|||
|
WIN32_FIND_DATA FindFileInfo ;
|
|||
|
CHAR QuoteChar ;
|
|||
|
LPSTR pCmdLine ;
|
|||
|
int NameOffset ;
|
|||
|
|
|||
|
|
|||
|
hInstance = hCurrentInstance ;
|
|||
|
bSuccess = InitializeSystemValues () ;
|
|||
|
|
|||
|
if (bSuccess && !hPrevInstance)
|
|||
|
bSuccess = InitializeApplication () ;
|
|||
|
|
|||
|
if (bSuccess)
|
|||
|
bSuccess = InitializeInstance (nCmdShow, lpszCmdLine) ;
|
|||
|
|
|||
|
if (bSuccess)
|
|||
|
{
|
|||
|
|
|||
|
if (strempty (lpszCmdLine))
|
|||
|
StringLoad (IDS_DEFAULTPATH, szFilePath) ;
|
|||
|
else
|
|||
|
{
|
|||
|
// check for single or double quote
|
|||
|
QuoteChar = *lpszCmdLine ;
|
|||
|
if (QuoteChar == '\'' || QuoteChar == '\"')
|
|||
|
{
|
|||
|
lpszCmdLine++ ;
|
|||
|
|
|||
|
// remove the matching QuoteChar if found
|
|||
|
pCmdLine = (LPSTR) lpszCmdLine ;
|
|||
|
while (*pCmdLine != '\0')
|
|||
|
{
|
|||
|
if (*pCmdLine == QuoteChar)
|
|||
|
{
|
|||
|
*pCmdLine = '\0' ;
|
|||
|
break ;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pCmdLine++ ;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// convert the LPSTR to LPTSTR
|
|||
|
|
|||
|
mbstowcs (szFilePath, lpszCmdLine, strlen(lpszCmdLine) + 1) ;
|
|||
|
|
|||
|
pFileNameStart = ExtractFileName (szFilePath) ;
|
|||
|
NameOffset = (int)(pFileNameStart - szFilePath) ;
|
|||
|
|
|||
|
// convert short filename to long NTFS filename if necessary
|
|||
|
hFindFile = FindFirstFile (szFilePath, &FindFileInfo) ;
|
|||
|
if (hFindFile && hFindFile != INVALID_HANDLE_VALUE)
|
|||
|
{
|
|||
|
// append the file name back to the path name
|
|||
|
lstrcpy (&szFilePath[NameOffset], FindFileInfo.cFileName) ;
|
|||
|
FindClose (hFindFile) ;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// OpenFileHandler (hWndMain, szFilePath) ;
|
|||
|
FileOpen (hWndMain, (int)0, (LPTSTR)szFilePath) ;
|
|||
|
PrepareMenu (GetMenu (hWndMain));
|
|||
|
}
|
|||
|
|
|||
|
return (bSuccess) ;
|
|||
|
} // PerfmonInitialize
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void PerfmonClose (HWND hWndMain)
|
|||
|
{
|
|||
|
|
|||
|
// reset all views - will free all systems as well
|
|||
|
ResetGraphView (hWndGraph) ;
|
|||
|
|
|||
|
// close the local machine
|
|||
|
if (bCloseLocalMachine)
|
|||
|
{
|
|||
|
RegCloseKey (HKEY_PERFORMANCE_DATA) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// free all the filenames
|
|||
|
if (pChartFullFileName)
|
|||
|
{
|
|||
|
MemoryFree (pChartFullFileName) ;
|
|||
|
pChartFullFileName = NULL ;
|
|||
|
}
|
|||
|
|
|||
|
// free all the GDI resources
|
|||
|
DeletePen (hWhitePen) ;
|
|||
|
DeletePerfmonSystemObjects () ;
|
|||
|
|
|||
|
// SaveMainWindowPlacement (hWndMain) ;
|
|||
|
DestroyWindow (hWndMain) ;
|
|||
|
} // PerfmonClose
|
|||
|
|
|||
|
|