/***************************************************************************** * * Perfmon.c - This is the WinMain module. It creates the main window and * the threads, and contains the main MainWndProc. * * Microsoft Confidential * Copyright (c) 1992-1993 Microsoft Corporation * * Authors - * * Russ Blake * Mike Moskowitz * Hon-Wah Chan * Bob Watson * ****************************************************************************/ //==========================================================================// // Includes // //==========================================================================// #undef NOSYSCOMMANDS // DEFINE_GLOBALS will define all the globals listed in globals.h #define DEFINE_GLOBALS #include "perfmon.h" #include // for tool tip & tool bar definitions #include // just for now #include "command.h" #include "graph.h" #include "log.h" #include "alert.h" #include "report.h" // for CreateReportWindow #include "legend.h" #include "init.h" #include "perfmops.h" #include "toolbar.h" // for CreateToolbar #include "status.h" // for CreatePMStatusWindow #include "utils.h" #include "fileopen.h" // for FileOpen #define dwToolbarStyle (WS_CHILD | WS_VISIBLE | TBS_NOCAPTION) extern TCHAR szInternational[] ; //==========================================================================// // Message Handlers // //==========================================================================// void static OnSize ( HWND hWnd, WORD xWidth, WORD yHeight ) /* Effect: Perform any actions needed when the main window is resized. In particular, size the four data windows, only one of which is visible right now. */ { SizePerfmonComponents () ; } BOOL static ShowSysmonNotice ( HWND hWnd ) /* returns TRUE if perfmon should continue or FALSE if perfmon should exit */ { BOOL bStatus; UINT nRet; DWORD dwSize; STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInformation; WCHAR szString1[MAX_PATH * 2]; WCHAR szString2[MAX_PATH * 2]; WCHAR szCmdPath[MAX_PATH * 2]; dwSize = sizeof(szString1) / sizeof(szString1[0]); LoadString (hInstance, SP_NOTICE_TEXT, szString1, dwSize); dwSize = sizeof(szString2) / sizeof(szString2[0]); LoadString (hInstance, SP_NOTICE_CAPTION, szString2, dwSize); nRet = MessageBoxW ( hWnd, szString1, szString2, MB_OKCANCEL | MB_ICONEXCLAMATION); if (nRet == IDOK) { // then start the MMC with the sysmon console StartupInfo.cb = sizeof(StartupInfo); StartupInfo.lpReserved = NULL; StartupInfo.lpDesktop = NULL; StartupInfo.lpTitle = NULL; StartupInfo.dwX = CW_USEDEFAULT; StartupInfo.dwY = CW_USEDEFAULT; StartupInfo.dwXSize = CW_USEDEFAULT; StartupInfo.dwYSize = CW_USEDEFAULT; StartupInfo.dwXCountChars = 0; StartupInfo.dwYCountChars = 0; StartupInfo.dwFillAttribute = 0; StartupInfo.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE; StartupInfo.wShowWindow = 0; StartupInfo.cbReserved2 = 0; StartupInfo.lpReserved2 = 0; StartupInfo.hStdInput = 0; StartupInfo.hStdOutput = 0; StartupInfo.hStdError = 0; memset (&ProcessInformation, 0, sizeof(ProcessInformation)); dwSize = sizeof(szString1) / sizeof(szString1[0]); LoadString (hInstance, SP_SYSMON_CMDLINE, szString1, dwSize); ExpandEnvironmentStringsW ( szString1, szCmdPath, (sizeof(szCmdPath)/sizeof(szCmdPath[0]))); bStatus = CreateProcessW ( NULL, szCmdPath, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInformation ); // close the handles if they were opened if (ProcessInformation.hProcess != NULL) CloseHandle (ProcessInformation.hProcess); if (ProcessInformation.hThread != NULL) CloseHandle (ProcessInformation.hThread); if (bStatus) { // the process was created so return FALSE; // tell perfmon to exit } else { LONG lStatus; lStatus = GetLastError(); dwSize = sizeof(szString2) / sizeof(szString2[0]); LoadString (hInstance, SP_SYSMON_CREATE_ERR, szString2, dwSize); nRet = MessageBoxW (hWnd, szString2, NULL, MB_OK | MB_ICONEXCLAMATION); return TRUE; // keep perfmon } } else { return TRUE; } } void static OnCreate ( HWND hWnd ) /* Effect: Perform all actions needed when the main window is created. In particular, create the three data windows, and show one of them. To Do: Check for proper creation. If not possible, we will need to abort creation of the program. Called By: MainWndProc only, in response to a WM_CREATE message. */ { hWndGraph = CreateGraphWindow (hWnd) ; #ifdef ADVANCED_PERFMON hWndLog = CreateLogWindow (hWnd) ; hWndAlert = CreateAlertWindow (hWnd) ; hWndReport = CreateReportWindow (hWnd) ; #endif hWndStatus = CreatePMStatusWindow (hWnd) ; CreateToolbarWnd (hWnd) ; MinimumSize += WindowHeight (hWndToolbar) ; Options.bMenubar = TRUE ; Options.bToolbar = TRUE ; Options.bStatusbar = TRUE; Options.bAlwaysOnTop = FALSE ; // initialize to chart view - HWC iPerfmonView = IDM_VIEWCHART; ShowWindow (PerfmonViewWindow (), SW_SHOWNORMAL) ; } //==========================================================================// // Exported Functions // //==========================================================================// void MenuBarHit ( WPARAM wParam ) { if (wParam == MENUCLOSING) { StatusLineReady (hWndStatus) ; dwCurrentMenuID = 0 ; } else if (HIWORD(wParam) & MF_SYSMENU) { WORD SystemMenuItem = 0 ; switch (LOWORD (wParam)) { case SC_RESTORE: SystemMenuItem = IDM_SYSTEMRESTORE ; break ; case SC_SIZE: SystemMenuItem = IDM_SYSTEMSIZE ; break ; case SC_MOVE: SystemMenuItem = IDM_SYSTEMMOVE ; break ; case SC_MINIMIZE: SystemMenuItem = IDM_SYSTEMMINIMIZE ; break ; case SC_MAXIMIZE: SystemMenuItem = IDM_SYSTEMMAXIMIZE ; break ; case SC_CLOSE: SystemMenuItem = IDM_SYSTEMCLOSE ; break ; case SC_TASKLIST: SystemMenuItem = IDM_SYSTEMSWITCHTO ; break ; } if (SystemMenuItem) { StatusLine (hWndStatus, SystemMenuItem) ; dwCurrentMenuID = MenuIDToHelpID (SystemMenuItem) ; } } else { StatusLine (hWndStatus, LOWORD (wParam)) ; } } void OnDropFile ( WPARAM wParam ) { TCHAR FileName [FilePathLen + 1] ; LPTSTR pFileNameStart ; HANDLE hFindFile ; WIN32_FIND_DATA FindFileInfo ; int NameOffset ; int NumOfFiles = 0 ; NumOfFiles = DragQueryFile ((HDROP) wParam, 0xffffffff, NULL, 0) ; if (NumOfFiles > 0) { // we only open the first file for now DragQueryFile((HDROP) wParam, 0, FileName, FilePathLen) ; pFileNameStart = ExtractFileName (FileName) ; NameOffset = (int)(pFileNameStart - FileName) ; // convert short filename to long NTFS filename if necessary hFindFile = FindFirstFile (FileName, &FindFileInfo) ; if (hFindFile && hFindFile != INVALID_HANDLE_VALUE) { // append the file name back to the path name lstrcpy (&FileName[NameOffset], FindFileInfo.cFileName) ; FindClose (hFindFile) ; } FileOpen (hWndMain, (int)0, (LPTSTR)FileName) ; PrepareMenu (GetMenu (hWndMain)); } DragFinish ((HDROP) wParam) ; } LRESULT APIENTRY MainWndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { LRESULT lRetCode = 0L ; BOOL bCallDefWinProc = FALSE ; switch (LOWORD (message)) { // switch case WM_LBUTTONDBLCLK: ShowPerfmonMenu (!Options.bMenubar) ; if (Options.bMenubar) { PrepareMenu (GetMenu (hWnd)) ; } break ; case WM_COMMAND: if (PerfmonCommand (hWnd,wParam,lParam)) return(0); else bCallDefWinProc = TRUE ; break; case WM_MENUSELECT: MenuBarHit (wParam) ; break ; case WM_NCHITTEST: /* if we have no title/menu bar, clicking and dragging the client * area moves the window. To do this, return HTCAPTION. * Note dragging not allowed if window maximized, or if caption * bar is present. */ wParam = DefWindowProc(hWnd, message, wParam, lParam); if (!Options.bMenubar && (wParam == HTCLIENT) && !IsZoomed (hWndMain)) return HTCAPTION ; else return wParam ; break ; case WM_SHOWWINDOW: PrepareMenu (GetMenu (hWnd)) ; break ; case WM_SIZE: OnSize (hWnd, LOWORD (lParam), HIWORD (lParam)) ; break ; case WM_GETMINMAXINFO: { MINMAXINFO *pMinMax ; pMinMax = (MINMAXINFO *) lParam ; pMinMax->ptMinTrackSize.x = MinimumSize ; pMinMax->ptMinTrackSize.y = MinimumSize ; } break ; case WM_NOTIFY: { LPTOOLTIPTEXT lpTTT = (LPTOOLTIPTEXT)lParam; if (lpTTT->hdr.code == TTN_NEEDTEXT) { LoadString (hInstance, (UINT)lpTTT->hdr.idFrom, lpTTT->szText, sizeof(lpTTT->szText)/sizeof(TCHAR)); return TRUE; } else { bCallDefWinProc = FALSE ; break; } } case WM_F1DOWN: if (dwCurrentDlgID) { CallWinHelp (dwCurrentDlgID, hWnd) ; } else if (dwCurrentMenuID) { CallWinHelp (dwCurrentMenuID, hWnd) ; dwCurrentMenuID = 0 ; } break ; case WM_CREATE: #if 0 // no longer needed for NT5 if (ShowSysmonNotice (hWnd)) { #endif OnCreate (hWnd) ; ViewChart (hWnd) ; PrepareMenu (GetMenu (hWnd)) ; #if 0 // no longer needed for NT5 } else { PerfmonClose (hWnd); } #endif break ; case WM_DESTROY: WinHelp (hWndMain, pszHelpFile, HELP_QUIT, 0) ; PostQuitMessage (0); break ; case WM_QUERYENDSESSION: // please shut it down return (1) ; break ; case WM_ENDSESSION: if (wParam == TRUE) { // close any log file before closing down PerfmonClose (hWnd) ; return (1) ; } else bCallDefWinProc = TRUE ; break ; case WM_CLOSE: PerfmonClose (hWnd) ; break ; case WM_ACTIVATE: { int fActivate = LOWORD (wParam) ; bPerfmonIconic = (BOOL) HIWORD (wParam) ; if (bPerfmonIconic == 0 && fActivate != WA_INACTIVE) { // set focus on the Legend window if (iPerfmonView == IDM_VIEWCHART) { SetFocus (hWndGraphLegend) ; } else if (iPerfmonView == IDM_VIEWALERT) { SetFocus (hWndAlertLegend) ; } else if (iPerfmonView == IDM_VIEWLOG) { SetFocus (hWndLogEntries) ; } else if (iPerfmonView == IDM_VIEWREPORT) { SetFocus (hWndReport) ; } } } break ; case WM_SYSCOLORCHANGE: DeletePerfmonSystemObjects () ; CreatePerfmonSystemObjects () ; WindowInvalidate (PerfmonViewWindow()) ; break ; case WM_WININICHANGE: if (!lParam || strsamei((LPTSTR)lParam, szInternational)) { GetDateTimeFormats () ; } break ; case WM_DROPFILES: OnDropFile (wParam) ; return (0) ; break ; default: bCallDefWinProc = TRUE ; break; } if (bCallDefWinProc) { lRetCode = DefWindowProc (hWnd, message, wParam, lParam) ; } return (lRetCode); } int WinMain ( HINSTANCE hCurrentInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow ) { MSG msg; if (!PerfmonInitialize (hCurrentInstance, hPrevInstance, lpszCmdLine, nCmdShow)) return (FALSE) ; DragAcceptFiles (hWndMain, TRUE) ; while (GetMessage (&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hWndMain, hAccelerators, &msg)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } } return((int)msg.wParam); } LRESULT MessageFilterProc ( int nCode, WPARAM wParam, LPARAM lParam ) { LPMSG lpMsg = (LPMSG)lParam ; extern HHOOK lpMsgFilterProc ; if (nCode < 0) { return FALSE ; } if (nCode == MSGF_DIALOGBOX || nCode == MSGF_MENU) { if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1) { PostMessage (hWndMain, WM_F1DOWN, nCode, 0L) ; return TRUE ; } } return (DefHookProc (nCode, wParam, (LPARAM)lpMsg, &lpMsgFilterProc)) ; } void SizePerfmonComponents (void) { RECT rectClient ; int xWidth, yHeight ; int yToolbarHeight ; int yStatusHeight ; int yViewHeight ; GetClientRect (hWndMain, &rectClient) ; xWidth = rectClient.right - rectClient.left ; yHeight = rectClient.bottom - rectClient.top ; if (Options.bToolbar) { SendMessage (hWndToolbar, WM_SIZE, 0, 0L) ; } yToolbarHeight = Options.bToolbar ? (WindowHeight (hWndToolbar) - 1) : 0 ; yStatusHeight = Options.bStatusbar ? StatusHeight (hWndStatus) : 0 ; if (Options.bStatusbar) { if (yToolbarHeight + yStatusHeight > yHeight) { // too small to display both toolbar and status bar // just display part of the status bar yStatusHeight = yHeight - yToolbarHeight ; } MoveWindow (hWndStatus, 0, yHeight - yStatusHeight, xWidth, yStatusHeight, TRUE) ; //WindowInvalidate (hWndStatus) ; } //WindowInvalidate (hWndMain) ; WindowShow (hWndStatus, Options.bStatusbar) ; WindowShow (hWndToolbar, Options.bToolbar) ; yViewHeight = yHeight - yStatusHeight - yToolbarHeight ; MoveWindow (hWndGraph, 0, yToolbarHeight, xWidth, yViewHeight, TRUE) ; MoveWindow (hWndAlert, 0, yToolbarHeight, xWidth, yViewHeight, TRUE) ; MoveWindow (hWndLog, 0, yToolbarHeight, xWidth, yViewHeight, TRUE) ; MoveWindow (hWndReport, 0, yToolbarHeight, xWidth, yViewHeight, TRUE) ; }