|
|
1.1 root 1:
2: /******************************************************************************\
3: * This is a part of the Microsoft Source Code Samples.
4: * Copyright (C) 1993 Microsoft Corporation.
5: * All rights reserved.
6: * This source code is only intended as a supplement to
7: * Microsoft Development Tools and/or WinHelp documentation.
8: * See these sources for detailed information regarding the
9: * Microsoft samples programs.
10: \******************************************************************************/
11:
12:
13: /******************************************************************************
14:
15: P R O C E S S V I E W E R
16:
17: Name: pviewer.c
18:
19: Description:
20: This program demonstrates the usage of special registry APIs
21: for collecting performance data.
22:
23: C files used in this app:
24: pviewer.c - this file
25: pviewdat.c - updates the dialog
26: objdata.c - access performance data objects
27: instdata.c - access performance data instances
28: cntrdata.c - access performance data counters
29:
30: ******************************************************************************/
31:
32:
33:
34:
35: #include <windows.h>
36: #include <winperf.h>
37: #include "perfdata.h"
38: #include "pviewdat.h"
39: #include "pviewdlg.h"
40: #include <string.h>
41: #include <stdio.h>
42:
43:
44:
45: #define INDEX_STR_LEN 10
46: #define MACHINE_NAME_LEN MAX_COMPUTERNAME_LENGTH+2
47: #define MACHINE_NAME_SIZE MACHINE_NAME_LEN+1
48:
49:
50: /****
51: Globals
52: ****/
53:
54: TCHAR INDEX_PROCTHRD_OBJ[2*INDEX_STR_LEN];
55: TCHAR INDEX_COSTLY_OBJ[3*INDEX_STR_LEN];
56:
57: TCHAR gszMachineName[MACHINE_NAME_SIZE];
58: TCHAR gszCurrentMachine[MACHINE_NAME_SIZE];
59:
60: DWORD gPerfDataSize = 50*1024; // start with 50K
61: PPERF_DATA gpPerfData;
62:
63: DWORD gCostlyDataSize = 100*1024; // start wiih 100K
64: PPERF_DATA gpCostlyData;
65:
66:
67: PPERF_OBJECT gpProcessObject; // pointer to process objects
68: PPERF_OBJECT gpThreadObject; // pointer to thread objects
69: PPERF_OBJECT gpThreadDetailsObject; // pointer to thread detail objects
70: PPERF_OBJECT gpAddressSpaceObject; // pointer to address space objects
71: PPERF_OBJECT gpImageObject; // pointer to image objects
72:
73:
74: HKEY ghPerfKey = HKEY_PERFORMANCE_DATA; // get perf data from this key
75: HKEY ghMachineKey = HKEY_LOCAL_MACHINE; // get title index from this key
76:
77:
78: HCURSOR ghCursor[2]; // 0 = arrow, 1 = hourglass
79:
80: HANDLE ghMemUpdateEvent; // to signal a refresh of mem stats
81: HANDLE ghMemUpdateMutex; // to restrict overlapping refreshes
82:
83:
84:
85:
86: /****
87: Prototypes
88: ****/
89:
90: BOOL CALLBACK PviewDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
91: void PviewDlgRefresh (HWND hWnd);
92: void PviewDlgRefreshCostlyData (HWND hPviewDlg);
93: void PviewDlgRefreshProcess (HWND hWnd);
94: void PviewDlgRefreshThread (HWND hWnd);
95: void PviewDlgRefreshCurSelProcess (HWND hWnd);
96: void PviewDlgRefreshCurSelThread (HWND hWnd);
97: WORD PviewDlgGetCurSelPriority (HWND hWnd);
98: BOOL PviewDlgChangePriority (HWND hWnd, DWORD wParam, WORD wItem);
99: BOOL PviewDlgTerminateProcess (HWND hPviewDlg);
100:
101: BOOL CALLBACK MemDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
102: void MemDlgUpdateThread (HWND hWnd);
103: void MemDlgRefresh (HWND hWnd, HWND hPviewDlg);
104: void MemDlgRefreshCurSelImage (HWND hMemDlg, HWND hPviewDlg);
105:
106: INT GetCurSelText (HWND hList, LPTSTR str);
107: DWORD GetCurSelData (HWND hWnd, DWORD dwList);
108: INT ReSelectText (HWND hList, INT StartIndex, LPTSTR str);
109: void SetPerfIndexes (HWND hWnd);
110: DWORD GetTitleIdx (HWND hWnd, LPTSTR TitleSz[], DWORD LastIndex, LPTSTR Name);
111: void SetListBoxTabStops (HWND hWnd);
112: void SetLocalMachine (void);
113: BOOL ConnectComputer (HWND hWnd);
114: void DisableControls (HWND hPviewDlg);
115: void EnableControls (HWND hPviewDlg);
116:
117:
118:
119:
120: //********************************************************
121: //
122: // WinMain --
123: //
124: // Build Up: create the program's dialog box,
125: // load the desired icons, enter the message
126: // loop.
127: //
128: // Tear Down: free up the memory allocated by the
129: // dialog box proc, and exit.
130: //
131: int WINAPI WinMain (HINSTANCE hInstance,
132: HINSTANCE hPrevInstance,
133: LPSTR lpCmdLine,
134: int nCmdShow)
135: {
136: HANDLE hWndDialog;
137: MSG msg;
138:
139:
140: // load our default cursors
141: //
142: ghCursor[0] = LoadCursor (0, IDC_ARROW);
143: ghCursor[1] = LoadCursor (0, IDC_WAIT);
144:
145: // open our dialog box
146: //
147: hWndDialog = CreateDialogParam (hInstance,
148: MAKEINTRESOURCE (PVIEW_DLG),
149: NULL,
150: (DLGPROC) PviewDlgProc,
151: (LONG)0);
152:
153: // associate the icon with our window
154: //
155: SetClassLong (hWndDialog, GCL_HICON, (LONG)LoadIcon(hInstance, TEXT("VIEWPICON")) );
156:
157:
158: // the almighty Windows message loop:
159: //
160: while (GetMessage (&msg, NULL, 0, 0))
161: if (!IsDialogMessage (hWndDialog, &msg))
162: {
163: TranslateMessage (&msg);
164: DispatchMessage (&msg);
165: }
166:
167: // close up shop
168: //
169: DestroyWindow (hWndDialog);
170: LocalFree (gpPerfData);
171:
172: return 0;
173: }
174:
175:
176:
177:
178: /*****************
179: PviewDlg functions
180: *****************/
181:
182: //********************************************************
183: //
184: // PviewDlgProc --
185: //
186: // Pview dialog procedure
187: //
188: BOOL CALLBACK PviewDlgProc (HWND hWnd,
189: UINT wMsg,
190: WPARAM wParam,
191: LPARAM lParam)
192: {
193: WORD wItem;
194:
195:
196: switch (wMsg)
197: {
198:
199: case WM_INITDIALOG:
200: SetListBoxTabStops (hWnd);
201: SendDlgItemMessage (hWnd, PVIEW_COMPUTER, EM_LIMITTEXT, MACHINE_NAME_LEN, 0);
202: PostMessage (hWnd, WM_COMMAND, PVIEW_REFRESH, 0);
203: break;
204:
205: case WM_CLOSE:
206: PostQuitMessage (0);
207: break;
208:
209: case WM_COMMAND:
210: //
211: // handle our app-specific controls:
212: //
213: switch (LOWORD (wParam))
214: {
215: // works just like "close"
216: //
217: case PVIEW_EXIT:
218: PostQuitMessage (0);
219: break;
220:
221: // if somebody moved the highlight in the thread list,
222: // update the view
223: //
224: case PVIEW_THREAD_LIST:
225: if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE)
226: {
227: PviewDlgRefreshCurSelThread (hWnd);
228: PostMessage (hWnd, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
229: }
230: break;
231:
232: // if somebody clicked on a new process, update all of the
233: // affected information.
234: //
235: case PVIEW_PROCESS_LIST:
236: if (HIWORD(wParam) == CBN_DBLCLK || HIWORD(wParam) == CBN_SELCHANGE)
237: {
238: PviewDlgRefreshCurSelProcess (hWnd);
239: PostMessage (hWnd, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
240: if (HIWORD(wParam) == CBN_DBLCLK)
241: PostMessage (hWnd, WM_COMMAND, PVIEW_MEMORY_DETAIL, 0);
242: }
243: break;
244:
245: // the user wishes to view the memory stats in detail:
246: //
247: case PVIEW_MEMORY_DETAIL:
248: //
249: // check to see if we can get exclusive access
250: // to the memory statistics
251: //
252: if (WaitForSingleObject (ghMemUpdateMutex, 0))
253:
254: // we can't, so just return.
255: //
256: return FALSE;
257:
258: else
259: {
260: // we have exclusive access, so start up the
261: // memory statistics dialog.
262: //
263: // release the mutex first so the dialog can use it.
264: //
265: ReleaseMutex (ghMemUpdateMutex);
266: DialogBoxParam (NULL,
267: MAKEINTRESOURCE (MEMORY_DLG),
268: hWnd,
269: (DLGPROC) MemDlgProc,
270: (LONG)hWnd);
271: }
272: break;
273:
274: // somebody clicked one of the priority radio
275: // buttons. Find out which one was selected...
276: //
277: case PVIEW_PRIORITY_HIGH:
278: case PVIEW_PRIORITY_NORMAL:
279: case PVIEW_PRIORITY_IDL:
280: if (SendDlgItemMessage (hWnd, PVIEW_PRIORITY_HIGH, BM_GETCHECK, 0, 0))
281: wItem = PVIEW_PRIORITY_HIGH;
282: else if (SendDlgItemMessage (hWnd, PVIEW_PRIORITY_NORMAL, BM_GETCHECK, 0, 0))
283: wItem = PVIEW_PRIORITY_NORMAL;
284: else
285: wItem = PVIEW_PRIORITY_IDL;
286:
287: // if the user actually clicked on a NEW state,
288: // do the change.
289: //
290: if (LOWORD(wParam) != wItem)
291: {
292: // of course, if it's a remote machine, disallow
293: // the modification.
294: //
295: if (lstrcmp (gszCurrentMachine, gszMachineName))
296: {
297: SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
298: SetFocus (GetDlgItem (hWnd, wItem));
299: MessageBox (hWnd,
300: TEXT("Cannot change process priority on remote machine"),
301: TEXT("Set priority"),
302: MB_ICONEXCLAMATION|MB_OK);
303: }
304:
305: // at this point, we know we are affecting the local
306: // machine, and a change has to be made.
307: // Just Do It(TM).
308: //
309: else if (PviewDlgChangePriority (hWnd, wParam, wItem))
310: PviewDlgRefresh (hWnd);
311:
312: }
313: break;
314:
315: case PVIEW_THREAD_HIGHEST:
316: case PVIEW_THREAD_ABOVE:
317: case PVIEW_THREAD_NORMAL:
318: case PVIEW_THREAD_BELOW:
319: case PVIEW_THREAD_LOWEST:
320: //
321: // this selection hasn't been fleshed out yet.
322: //
323: PviewDlgRefreshCurSelThread (hWnd);
324: break;
325:
326: // terminate the selected process
327: //
328: case PVIEW_TERMINATE:
329: if (PviewDlgTerminateProcess (hWnd))
330: PviewDlgRefresh (hWnd);
331: break;
332:
333: // if the text has changed, we want to connect and
334: // view another system's processes...
335: //
336: case PVIEW_COMPUTER:
337: if (HIWORD(wParam) == EN_CHANGE)
338: EnableWindow (GetDlgItem (hWnd, PVIEW_CONNECT), TRUE);
339: else
340: return FALSE;
341: break;
342:
343: // we were told to connect, go ahead and try...
344: //
345: case PVIEW_CONNECT:
346: if (ConnectComputer (hWnd))
347: {
348: SetPerfIndexes (hWnd);
349: PviewDlgRefresh (hWnd);
350: }
351: break;
352:
353: // refresh the current information displayed
354: //
355: case PVIEW_REFRESH:
356: if (ConnectComputer (hWnd))
357: SetPerfIndexes (hWnd);
358: PviewDlgRefresh (hWnd);
359: break;
360:
361: // refresh the currently updated costly
362: // statistics
363: //
364: case PVIEW_REFRESH_COSTLY_DATA:
365: if (WaitForSingleObject (ghMemUpdateMutex, 0))
366: return FALSE;
367:
368: PviewDlgRefreshCostlyData (hWnd);
369: ReleaseMutex (ghMemUpdateMutex);
370: break;
371:
372: default:
373: return FALSE;
374: }
375: break;
376:
377: default:
378: return FALSE;
379: }
380:
381: return TRUE;
382: }
383:
384:
385:
386:
387: //********************************************************
388: //
389: // PviewDlgRefresh --
390: //
391: // Refresh the pview dialog.
392: //
393: void PviewDlgRefresh (HWND hWnd)
394: {
395: static HANDLE hMemUpdateThread = NULL;
396: static DWORD MemUpdateThreadID;
397:
398:
399: SetCursor (ghCursor[1]);
400:
401:
402: if (hMemUpdateThread) // get memory data
403: SetEvent (ghMemUpdateEvent);
404: else
405: hMemUpdateThread = CreateThread (NULL,
406: 0,
407: (LPTHREAD_START_ROUTINE)MemDlgUpdateThread,
408: (LPVOID)hWnd,
409: 0,
410: &MemUpdateThreadID);
411:
412:
413: // get performance data
414: //
415: gpPerfData = RefreshPerfData (ghPerfKey, INDEX_PROCTHRD_OBJ, gpPerfData, &gPerfDataSize);
416:
417: gpProcessObject = FindObject (gpPerfData, PX_PROCESS);
418: gpThreadObject = FindObject (gpPerfData, PX_THREAD);
419:
420:
421: // refresh
422: //
423: PviewDlgRefreshProcess (hWnd);
424: PviewDlgRefreshThread (hWnd);
425:
426: SetCursor (ghCursor[0]);
427:
428: }
429:
430:
431:
432:
433: //********************************************************
434: //
435: // PviewDlgRefreshCostlyData --
436: //
437: // Refresh the costly data.
438: //
439: void PviewDlgRefreshCostlyData (HWND hPviewDlg)
440: {
441: LPTSTR szProcessName;
442: LPTSTR szThreadName;
443: PPERF_INSTANCE pInstance;
444: DWORD dwIndex;
445:
446:
447: dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
448: pInstance = FindInstanceN (gpProcessObject, dwIndex);
449: szProcessName = InstanceName (pInstance);
450:
451: RefreshPviewDlgMemoryData (hPviewDlg,
452: pInstance,
453: gpProcessObject,
454: gpAddressSpaceObject);
455:
456:
457: dwIndex = GetCurSelData (hPviewDlg, PVIEW_THREAD_LIST);
458: pInstance = FindInstanceN (gpThreadObject, dwIndex);
459: szThreadName = InstanceName (pInstance);
460:
461: RefreshPviewDlgThreadPC (hPviewDlg,
462: szProcessName,
463: szThreadName,
464: gpThreadDetailsObject,
465: gpCostlyData);
466:
467: }
468:
469:
470:
471:
472: //********************************************************
473: //
474: // PviewDlgRefreshProcess --
475: //
476: // Refresh the process list and data in pview dialog.
477: //
478: void PviewDlgRefreshProcess (HWND hWnd)
479: {
480: TCHAR szProcessString[256];
481: INT nProcess;
482: INT nIndex;
483: HWND hProcessList;
484: DWORD dwProcessIndex;
485:
486:
487: // refresh process list
488: //
489: hProcessList = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
490: nProcess = GetCurSelText (hProcessList, szProcessString);
491:
492: SendMessage (hProcessList, WM_SETREDRAW, FALSE, 0);
493: SendMessage (hProcessList, LB_RESETCONTENT, 0, 0);
494: SendMessage (hProcessList, LB_SETITEMDATA, 0, 0);
495:
496:
497: RefreshProcessList (hProcessList, gpProcessObject);
498:
499: // refresh process data
500: //
501: if (nProcess != LB_ERR)
502: nIndex = ReSelectText (hProcessList, nProcess, szProcessString);
503: else
504: nIndex = 0;
505:
506:
507: dwProcessIndex = SendMessage (hProcessList, LB_GETITEMDATA, nIndex, 0);
508:
509: RefreshProcessData (hWnd, gpProcessObject, dwProcessIndex);
510:
511: SendMessage (hProcessList, WM_SETREDRAW, TRUE, 0);
512:
513: }
514:
515:
516:
517:
518: //********************************************************
519: //
520: // PviewDlgRefreshThread --
521: //
522: // Refresh the thread list and data in pview dialog.
523: //
524: void PviewDlgRefreshThread (HWND hWnd)
525: {
526: TCHAR szThreadString[256];
527: INT nThread;
528: INT nIndex;
529: HWND hThreadList;
530: DWORD dwThreadIndex;
531:
532: PPERF_INSTANCE pProcessInstance;
533: DWORD dwProcessIndex;
534:
535:
536: // get process info
537: //
538: dwProcessIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
539: pProcessInstance = FindInstanceN (gpProcessObject, dwProcessIndex);
540:
541:
542: // refresh thread list
543: //
544: hThreadList = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
545: nThread = GetCurSelText (hThreadList, szThreadString);
546:
547: SendMessage (hThreadList, WM_SETREDRAW, FALSE, 0);
548: SendMessage (hThreadList, LB_RESETCONTENT, 0, 0);
549: SendMessage (hThreadList, LB_SETITEMDATA, 0, 0);
550:
551: RefreshThreadList (hThreadList, gpThreadObject, dwProcessIndex);
552:
553:
554: // refresh thread data
555: //
556: if (nThread != LB_ERR)
557: nIndex = ReSelectText (hThreadList, nThread, szThreadString);
558: else
559: nIndex = 0;
560:
561: dwThreadIndex = SendMessage (hThreadList, LB_GETITEMDATA, nIndex, 0);
562:
563: RefreshThreadData (hWnd,
564: gpThreadObject,
565: dwThreadIndex,
566: gpProcessObject,
567: pProcessInstance);
568:
569: SendMessage (hThreadList, WM_SETREDRAW, TRUE, 0);
570:
571: }
572:
573:
574:
575:
576: //********************************************************
577: //
578: // PviewDlgGetCurSelPriority --
579: //
580: // Get the process priority of currently selected process.
581: //
582: WORD PviewDlgGetCurSelPriority (HWND hWnd)
583: {
584: DWORD dwIndex;
585: PPERF_INSTANCE pInst;
586:
587: dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
588: pInst = FindInstanceN (gpProcessObject, dwIndex);
589: return ProcessPriority (gpProcessObject, pInst);
590: }
591:
592:
593:
594:
595: //********************************************************
596: //
597: // PviewDlgRefreshCurSelProcess --
598: //
599: // Refresh the data of currently selected process.
600: //
601: void PviewDlgRefreshCurSelProcess (HWND hWnd)
602: {
603: DWORD dwIndex;
604:
605: dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
606: RefreshProcessData (hWnd, gpProcessObject, dwIndex);
607:
608: PviewDlgRefreshThread (hWnd);
609: }
610:
611:
612:
613:
614: //********************************************************
615: //
616: // PviewDlgRefreshCurSelThread --
617: //
618: // Refresh the data of currently selected thread.
619: //
620: void PviewDlgRefreshCurSelThread (HWND hWnd)
621: {
622: PPERF_INSTANCE pProcessInstance;
623: DWORD dwIndex;
624:
625: dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
626: pProcessInstance = FindInstanceN (gpProcessObject, dwIndex);
627:
628: dwIndex = GetCurSelData (hWnd, PVIEW_THREAD_LIST);
629:
630: RefreshThreadData (hWnd,
631: gpThreadObject,
632: dwIndex,
633: gpProcessObject,
634: pProcessInstance);
635: }
636:
637:
638:
639:
640: //********************************************************
641: //
642: // PviewDlgChangePriority --
643: //
644: // Change process priority.
645: //
646: BOOL PviewDlgChangePriority (HWND hWnd, DWORD wParam, WORD wItem)
647: {
648: DWORD dwIndex;
649: PPERF_INSTANCE pInst;
650: PPERF_COUNTER pCountID;
651: DWORD *pProcessID;
652: DWORD ProcessID;
653: HANDLE hProcess;
654: BOOL bStat;
655:
656:
657:
658: dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
659: pInst = FindInstanceN (gpProcessObject, dwIndex);
660:
661:
662: if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
663: {
664: pProcessID = (DWORD *) CounterData (pInst, pCountID);
665: ProcessID = *pProcessID;
666: }
667: else
668: {
669: SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
670: SetFocus (GetDlgItem (hWnd, wItem));
671: MessageBox (hWnd,
672: TEXT("Cannot find ID for this process"),
673: TEXT("Set priority"),
674: MB_ICONEXCLAMATION|MB_OK);
675: return FALSE;
676: }
677:
678:
679: hProcess = OpenProcess (PROCESS_SET_INFORMATION, FALSE, ProcessID);
680: if (!hProcess)
681: {
682: SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
683: SetFocus (GetDlgItem (hWnd, wItem));
684: MessageBox (hWnd,
685: TEXT("Unable to open the process; Priority not changed"),
686: TEXT("Set priority"),
687: MB_ICONEXCLAMATION|MB_OK);
688: return FALSE;
689: }
690:
691:
692:
693: switch (wParam)
694: {
695: case PVIEW_PRIORITY_HIGH:
696: bStat = SetPriorityClass (hProcess, HIGH_PRIORITY_CLASS);
697: break;
698:
699: case PVIEW_PRIORITY_NORMAL:
700: bStat = SetPriorityClass (hProcess, NORMAL_PRIORITY_CLASS);
701: break;
702:
703: case PVIEW_PRIORITY_IDL:
704: bStat = SetPriorityClass (hProcess, IDLE_PRIORITY_CLASS);
705: break;
706:
707: default:
708: break;
709: }
710:
711:
712: CloseHandle (hProcess);
713:
714: if (!bStat)
715: {
716: SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
717: SetFocus (GetDlgItem (hWnd, wItem));
718: MessageBox (hWnd,
719: TEXT("Unable to change priority"),
720: TEXT("Set priority"),
721: MB_ICONEXCLAMATION|MB_OK);
722: return FALSE;
723: }
724:
725:
726: return TRUE;
727:
728: }
729:
730:
731:
732:
733: //********************************************************
734: //
735: // PviewDlgTerminateProcess --
736: //
737: // Terminate the current selected process.
738: //
739: BOOL PviewDlgTerminateProcess (HWND hPviewDlg)
740: {
741: DWORD dwIndex;
742: PPERF_INSTANCE pInst;
743: PPERF_COUNTER pCountID;
744: DWORD *pProcessID;
745: DWORD ProcessID;
746: HANDLE hProcess;
747: TCHAR szTemp[50];
748:
749:
750: dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
751: pInst = FindInstanceN (gpProcessObject, dwIndex);
752:
753:
754: if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
755: {
756: pProcessID = (DWORD *) CounterData (pInst, pCountID);
757: ProcessID = *pProcessID;
758: }
759: else
760: {
761: MessageBox (hPviewDlg,
762: TEXT("Cannot find ID for this process"),
763: TEXT("Terminate Process"),
764: MB_ICONEXCLAMATION|MB_OK);
765: return FALSE;
766: }
767:
768:
769: wsprintf (szTemp, TEXT("Terminate process %s (ID %#x)?"),
770: InstanceName (pInst), ProcessID);
771:
772: if (MessageBox (hPviewDlg, szTemp, TEXT("Terminate Process"), MB_ICONSTOP|MB_OKCANCEL) != IDOK)
773: return FALSE;
774:
775:
776: hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, ProcessID);
777: if (!hProcess)
778: {
779: MessageBox (hPviewDlg,
780: TEXT("Unable to open the process; Process not terminated"),
781: TEXT("Terminate Process"),
782: MB_ICONEXCLAMATION|MB_OK);
783: return FALSE;
784: }
785:
786:
787: if (!TerminateProcess (hProcess, 99))
788: {
789: MessageBox (hPviewDlg,
790: TEXT("Unable to terminate the process."),
791: TEXT("Terminate Process"),
792: MB_ICONEXCLAMATION|MB_OK);
793:
794: CloseHandle (hProcess);
795: return FALSE;
796: }
797:
798:
799: CloseHandle (hProcess);
800:
801: return TRUE;
802:
803: }
804:
805:
806:
807:
808: /***************
809: MemDlg functions
810: ***************/
811:
812: //********************************************************
813: //
814: // MemDlgProc --
815: //
816: // MemoryDlg procedure
817: //
818: BOOL CALLBACK MemDlgProc (HWND hWnd,
819: UINT wMsg,
820: WPARAM wParam,
821: LPARAM lParam)
822: {
823: static HWND hPviewDlg;
824:
825:
826: switch (wMsg)
827: {
828: case WM_INITDIALOG:
829: hPviewDlg = (HWND)lParam;
830: PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
831: break;
832:
833: case WM_QUIT:
834: case WM_CLOSE:
835: EndDialog (hWnd, TRUE);
836: break;
837:
838: case WM_COMMAND:
839: switch (LOWORD (wParam))
840: {
841: // get the memory statistics for the currently selected
842: // process/thread
843: //
844: case MEMORY_IMAGE:
845: if (HIWORD(wParam) == CBN_DBLCLK || HIWORD(wParam) == CBN_SELCHANGE)
846: {
847: if (WaitForSingleObject (ghMemUpdateMutex, 0))
848: return FALSE;
849:
850: MemDlgRefreshCurSelImage (hWnd, hPviewDlg);
851: ReleaseMutex (ghMemUpdateMutex);
852: }
853: else
854: return FALSE;
855: break;
856:
857: // refresh the current memory statistics,
858: // retry if we can't get the mutex
859: //
860: case MEMORY_REFRESH:
861: if (WaitForSingleObject (ghMemUpdateMutex, 1000))
862: {
863: // can't get the mutex, retry...
864: //
865: PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
866: return FALSE;
867: }
868:
869: MemDlgRefresh (hWnd, hPviewDlg);
870: ReleaseMutex (ghMemUpdateMutex);
871: break;
872:
873: case IDCANCEL:
874: case IDOK:
875: EndDialog (hWnd, TRUE);
876: break;
877:
878: default:
879: return FALSE;
880: }
881: default:
882: return FALSE;
883: }
884:
885:
886: return TRUE;
887:
888: }
889:
890:
891:
892:
893: //********************************************************
894: //
895: // MemDlgUpdateThread --
896: //
897: // This function runs in a separate thread to collect memory data.
898: //
899: void MemDlgUpdateThread (HWND hPviewDlg)
900: {
901:
902: ghMemUpdateMutex = CreateMutex (NULL, TRUE, NULL);
903: ghMemUpdateEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
904:
905:
906: while (TRUE)
907: {
908: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), FALSE);
909:
910:
911: gpCostlyData = RefreshPerfData (ghPerfKey,
912: INDEX_COSTLY_OBJ,
913: gpCostlyData,
914: &gCostlyDataSize);
915:
916:
917: gpAddressSpaceObject = FindObject (gpCostlyData, PX_PROCESS_ADDRESS_SPACE);
918: gpThreadDetailsObject = FindObject (gpCostlyData, PX_THREAD_DETAILS);
919: gpImageObject = FindObject (gpCostlyData, PX_IMAGE);
920:
921:
922: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), TRUE);
923:
924: ReleaseMutex (ghMemUpdateMutex);
925:
926: PostMessage (hPviewDlg, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
927:
928:
929: WaitForSingleObject (ghMemUpdateEvent, INFINITE);
930: WaitForSingleObject (ghMemUpdateMutex, INFINITE);
931: }
932:
933: }
934:
935:
936:
937:
938: //********************************************************
939: //
940: // MemDlgRefresh --
941: //
942: // Refresh the memory dialog.
943: //
944: void MemDlgRefresh (HWND hMemDlg, HWND hPviewDlg)
945: {
946: HWND hImageList;
947: DWORD dwIndex;
948: BOOL bStat;
949: PPERF_INSTANCE pInstance;
950:
951:
952: hImageList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
953:
954: SendMessage (hImageList, WM_SETREDRAW, FALSE, 0);
955: SendMessage (hImageList, CB_RESETCONTENT, 0, 0);
956: SendMessage (hImageList, CB_SETITEMDATA, 0, 0);
957:
958: dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
959: pInstance = FindInstanceN (gpProcessObject, dwIndex);
960:
961: bStat = RefreshMemoryDlg (hMemDlg,
962: pInstance,
963: gpProcessObject,
964: gpAddressSpaceObject,
965: gpImageObject);
966:
967: SendMessage (hImageList, WM_SETREDRAW, TRUE, 0);
968: SendMessage (hImageList, CB_SETCURSEL, 0, 0);
969:
970: if (!bStat)
971: {
972: MessageBox (hMemDlg,
973: TEXT("Unable to retrieve memory detail"),
974: TEXT("Memory detail"),
975: MB_ICONSTOP|MB_OK);
976: PostMessage (hMemDlg, WM_CLOSE, 0, 0);
977: }
978:
979: }
980:
981:
982:
983:
984: //********************************************************
985: //
986: // MemDlgRefreshCurSelImage --
987: //
988: // Refresh the current selected image for memory dialog.
989: //
990: void MemDlgRefreshCurSelImage (HWND hMemDlg, HWND hPviewDlg)
991: {
992: HWND hList;
993: INT nIndex;
994: DWORD dwIndex;
995:
996:
997: hList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
998: nIndex = SendMessage (hList, CB_GETCURSEL, 0, 0);
999:
1000: if (nIndex == CB_ERR)
1001: nIndex = 0;
1002:
1003: dwIndex = SendMessage (hList, CB_GETITEMDATA, nIndex, 0);
1004:
1005: if (dwIndex == 0xFFFFFFFF)
1006: MemDlgRefresh (hMemDlg, hPviewDlg);
1007: else
1008: RefreshMemoryDlgImage (hMemDlg, dwIndex, gpImageObject);
1009:
1010: }
1011:
1012:
1013:
1014:
1015: /****************
1016: utility functions
1017: ****************/
1018:
1019: //********************************************************
1020: //
1021: // GetCurSelText --
1022: //
1023: // Get the text of current selection. Used for later ReSelectText().
1024: //
1025: INT GetCurSelText (HWND hList, LPTSTR str)
1026: {
1027: INT Index;
1028: INT Length;
1029:
1030: Index = SendMessage (hList, LB_GETCURSEL, 0, 0);
1031: Length = SendMessage (hList, LB_GETTEXT, Index, (DWORD)str);
1032:
1033: return Index;
1034: }
1035:
1036:
1037:
1038:
1039: //********************************************************
1040: //
1041: // GetCurSelData --
1042: //
1043: // Get the data associated with the current selection.
1044: //
1045: DWORD GetCurSelData (HWND hWnd, DWORD dwList)
1046: {
1047: HWND hList;
1048: INT nIndex;
1049: DWORD dwIndex;
1050:
1051:
1052: hList = GetDlgItem (hWnd, dwList);
1053: nIndex = SendMessage (hList, LB_GETCURSEL, 0, 0);
1054:
1055: if (nIndex == LB_ERR)
1056: nIndex = 0;
1057:
1058: dwIndex = SendMessage (hList, LB_GETITEMDATA, nIndex, 0);
1059:
1060: return dwIndex;
1061: }
1062:
1063:
1064:
1065:
1066: //********************************************************
1067: //
1068: // ReSelectText --
1069: //
1070: // Reselect the line specified by str. Returns the new index. If cannot
1071: // find the line or any error, then 0 is returned.
1072: //
1073: INT ReSelectText (HWND hList, INT StartIndex, LPTSTR str)
1074: {
1075: INT Index;
1076: INT Length;
1077: TCHAR SaveChar = TEXT('\0');
1078:
1079:
1080: Index = SendMessage (hList, LB_FINDSTRING, StartIndex, (DWORD)str);
1081:
1082: if (Index == LB_ERR)
1083: {
1084: Length = lstrlen (str);
1085:
1086: while (Index == LB_ERR && Length)
1087: {
1088: SaveChar = str[Length-1];
1089: str[Length-1] = TEXT('\0');
1090:
1091: Index = SendMessage (hList, LB_FINDSTRING, StartIndex, (DWORD)str);
1092:
1093: str[Length-1] = SaveChar;
1094: Length--;
1095: }
1096: }
1097:
1098: if (Index == LB_ERR)
1099: return 0;
1100: else
1101: {
1102: SendMessage (hList, LB_SETCURSEL, Index, 0);
1103: return Index;
1104: }
1105:
1106: }
1107:
1108:
1109:
1110:
1111: //********************************************************
1112: //
1113: // SetPerfIndexes
1114: //
1115: // Setup the perf data indexes.
1116: //
1117: void SetPerfIndexes (HWND hWnd)
1118: {
1119: LPTSTR TitleBuffer;
1120: LPTSTR *Title;
1121: DWORD Count;
1122: TCHAR szTemp[50];
1123: DWORD dwR;
1124:
1125:
1126: dwR = GetPerfTitleSz (ghMachineKey, &TitleBuffer, &Title, &Count);
1127:
1128: if (dwR != ERROR_SUCCESS)
1129: {
1130: wsprintf (szTemp, TEXT("Unable to retrieve counter indexes, ERROR -> %#x"), dwR);
1131: MessageBox (hWnd, szTemp, TEXT("Pviewer"), MB_OK|MB_ICONEXCLAMATION);
1132: return;
1133: }
1134:
1135:
1136: PX_PROCESS = GetTitleIdx (hWnd, Title, Count, PN_PROCESS);
1137: PX_PROCESS_CPU = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_CPU);
1138: PX_PROCESS_PRIV = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIV);
1139: PX_PROCESS_USER = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_USER);
1140: PX_PROCESS_WORKING_SET = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_WORKING_SET);
1141: PX_PROCESS_PEAK_WS = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PEAK_WS);
1142: PX_PROCESS_PRIO = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIO);
1143: PX_PROCESS_ELAPSE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_ELAPSE);
1144: PX_PROCESS_ID = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_ID);
1145: PX_PROCESS_PRIVATE_PAGE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_PAGE);
1146: PX_PROCESS_VIRTUAL_SIZE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_VIRTUAL_SIZE);
1147: PX_PROCESS_PEAK_VS = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PEAK_VS);
1148: PX_PROCESS_FAULT_COUNT = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_FAULT_COUNT);
1149:
1150: PX_THREAD = GetTitleIdx (hWnd, Title, Count, PN_THREAD);
1151: PX_THREAD_CPU = GetTitleIdx (hWnd, Title, Count, PN_THREAD_CPU);
1152: PX_THREAD_PRIV = GetTitleIdx (hWnd, Title, Count, PN_THREAD_PRIV);
1153: PX_THREAD_USER = GetTitleIdx (hWnd, Title, Count, PN_THREAD_USER);
1154: PX_THREAD_START = GetTitleIdx (hWnd, Title, Count, PN_THREAD_START);
1155: PX_THREAD_SWITCHES = GetTitleIdx (hWnd, Title, Count, PN_THREAD_SWITCHES);
1156: PX_THREAD_PRIO = GetTitleIdx (hWnd, Title, Count, PN_THREAD_PRIO);
1157: PX_THREAD_BASE_PRIO = GetTitleIdx (hWnd, Title, Count, PN_THREAD_BASE_PRIO);
1158: PX_THREAD_ELAPSE = GetTitleIdx (hWnd, Title, Count, PN_THREAD_ELAPSE);
1159:
1160: PX_THREAD_DETAILS = GetTitleIdx (hWnd, Title, Count, PN_THREAD_DETAILS);
1161: PX_THREAD_PC = GetTitleIdx (hWnd, Title, Count, PN_THREAD_PC);
1162:
1163: PX_IMAGE = GetTitleIdx (hWnd, Title, Count, PN_IMAGE);
1164: PX_IMAGE_NOACCESS = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_NOACCESS);
1165: PX_IMAGE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_READONLY);
1166: PX_IMAGE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_READWRITE);
1167: PX_IMAGE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_WRITECOPY);
1168: PX_IMAGE_EXECUTABLE = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXECUTABLE);
1169: PX_IMAGE_EXE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXE_READONLY);
1170: PX_IMAGE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXE_READWRITE);
1171: PX_IMAGE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXE_WRITECOPY);
1172:
1173: PX_PROCESS_ADDRESS_SPACE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_ADDRESS_SPACE);
1174: PX_PROCESS_PRIVATE_NOACCESS = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_NOACCESS);
1175: PX_PROCESS_PRIVATE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_READONLY);
1176: PX_PROCESS_PRIVATE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_READWRITE);
1177: PX_PROCESS_PRIVATE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_WRITECOPY);
1178: PX_PROCESS_PRIVATE_EXECUTABLE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXECUTABLE);
1179: PX_PROCESS_PRIVATE_EXE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXE_READONLY);
1180: PX_PROCESS_PRIVATE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXE_READWRITE);
1181: PX_PROCESS_PRIVATE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXE_WRITECOPY);
1182:
1183: PX_PROCESS_MAPPED_NOACCESS = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_NOACCESS);
1184: PX_PROCESS_MAPPED_READONLY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_READONLY);
1185: PX_PROCESS_MAPPED_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_READWRITE);
1186: PX_PROCESS_MAPPED_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_WRITECOPY);
1187: PX_PROCESS_MAPPED_EXECUTABLE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXECUTABLE);
1188: PX_PROCESS_MAPPED_EXE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXE_READONLY);
1189: PX_PROCESS_MAPPED_EXE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXE_READWRITE);
1190: PX_PROCESS_MAPPED_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXE_WRITECOPY);
1191:
1192: PX_PROCESS_IMAGE_NOACCESS = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_NOACCESS);
1193: PX_PROCESS_IMAGE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_READONLY);
1194: PX_PROCESS_IMAGE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_READWRITE);
1195: PX_PROCESS_IMAGE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_WRITECOPY);
1196: PX_PROCESS_IMAGE_EXECUTABLE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXECUTABLE);
1197: PX_PROCESS_IMAGE_EXE_READONLY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXE_READONLY);
1198: PX_PROCESS_IMAGE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXE_READWRITE);
1199: PX_PROCESS_IMAGE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXE_WRITECOPY);
1200:
1201:
1202: wsprintf (INDEX_PROCTHRD_OBJ, TEXT("%ld %ld"), PX_PROCESS, PX_THREAD);
1203: wsprintf (INDEX_COSTLY_OBJ, TEXT("%ld %ld %ld"),
1204: PX_PROCESS_ADDRESS_SPACE, PX_IMAGE, PX_THREAD_DETAILS);
1205:
1206:
1207: LocalFree (TitleBuffer);
1208: LocalFree (Title);
1209:
1210: }
1211:
1212:
1213:
1214:
1215: //********************************************************
1216: //
1217: // GetTitleIdx
1218: //
1219: // Searches Titles[] for Name. Returns the index found.
1220: //
1221: DWORD GetTitleIdx (HWND hWnd, LPTSTR Title[], DWORD LastIndex, LPTSTR Name)
1222: {
1223: DWORD Index;
1224:
1225: for (Index = 0; Index <= LastIndex; Index++)
1226: if (Title[Index])
1227: if (!lstrcmpi (Title[Index], Name))
1228: return Index;
1229:
1230: MessageBox (hWnd, Name, TEXT("Pviewer cannot find index"), MB_OK);
1231: return 0;
1232: }
1233:
1234:
1235:
1236:
1237: //********************************************************
1238: //
1239: // SetListBoxTabStops --
1240: //
1241: // Set tab stops in the two list boxes.
1242: //
1243: void SetListBoxTabStops (HWND hWnd)
1244: {
1245: HWND hListBox;
1246: INT Tabs[4] = {22*4, 36*4, 44*4};
1247:
1248: hListBox = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
1249: SendMessage (hListBox, LB_SETTABSTOPS, 3, (DWORD)Tabs);
1250:
1251: hListBox = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
1252: SendMessage (hListBox, LB_SETTABSTOPS, 3, (DWORD)Tabs);
1253: }
1254:
1255:
1256:
1257:
1258: //********************************************************
1259: //
1260: // SetLocalMachine --
1261: //
1262: // Set local machine as performance data focus.
1263: //
1264: // Sets ghPerfKey
1265: // ghMachineKey
1266: // gszMachineName
1267: // gszCurrentMachine
1268: //
1269: void SetLocalMachine (void)
1270: {
1271: TCHAR szName[MACHINE_NAME_SIZE];
1272: DWORD dwSize = MACHINE_NAME_SIZE;
1273:
1274:
1275: // performance_data key on local machine
1276: //
1277: ghPerfKey = HKEY_PERFORMANCE_DATA;
1278: ghMachineKey = HKEY_LOCAL_MACHINE;
1279:
1280:
1281:
1282: // get computer name
1283: GetComputerName (szName, &dwSize);
1284:
1285:
1286:
1287: if (szName[0] != '\\' || szName[1] != '\\') // must have two '\\'
1288: {
1289: wsprintf (gszMachineName, TEXT("\\\\%s"), szName);
1290: lstrcpy (gszCurrentMachine, gszMachineName);
1291: }
1292: else
1293: {
1294: lstrcpy (gszMachineName, szName);
1295: lstrcpy (gszCurrentMachine, gszMachineName);
1296: }
1297:
1298: }
1299:
1300:
1301:
1302:
1303: //********************************************************
1304: //
1305: // ConnectComputer --
1306: //
1307: // Connect to a computer with name entered in PVIEW_COMPUTER.
1308: // If a new connection is made, then return TRUE else return FALSE.
1309: //
1310: // Sets gszCurrentMachine
1311: // ghPerfKey
1312: // ghMachineKey
1313: //
1314: BOOL ConnectComputer (HWND hWnd)
1315: {
1316: DWORD dwR;
1317: HKEY hKey;
1318: TCHAR szTemp[MACHINE_NAME_SIZE];
1319: TCHAR szTemp2[MACHINE_NAME_SIZE+100];
1320: BOOL bResult = TRUE;
1321:
1322:
1323:
1324: SetCursor (ghCursor[1]);
1325:
1326:
1327: if (!GetDlgItemText (hWnd, PVIEW_COMPUTER, szTemp, sizeof (szTemp)))
1328: {
1329: SetLocalMachine ();
1330: SetDlgItemText (hWnd, PVIEW_COMPUTER, gszCurrentMachine);
1331: }
1332:
1333: else if (!lstrcmpi (szTemp, gszCurrentMachine)) // didn't change name
1334: bResult = FALSE;
1335:
1336: else if (!lstrcmpi (szTemp, gszMachineName)) // local machine
1337: {
1338: SetLocalMachine ();
1339: EnableControls (hWnd);
1340: }
1341:
1342: else
1343: {
1344: // a remote machine, connect to it
1345: //
1346: dwR = RegConnectRegistry (szTemp, HKEY_PERFORMANCE_DATA, &hKey);
1347:
1348: if (dwR != ERROR_SUCCESS)
1349: {
1350: wsprintf (szTemp2, TEXT("Cannot connect to computer %s"), szTemp);
1351: MessageBox (hWnd, szTemp2, TEXT(""), MB_ICONEXCLAMATION|MB_OK);
1352:
1353: SetDlgItemText (hWnd, PVIEW_COMPUTER, gszCurrentMachine);
1354:
1355: bResult = FALSE;
1356: }
1357: else
1358: {
1359: // connected
1360: //
1361: lstrcpy (gszCurrentMachine, szTemp);
1362: ghPerfKey = hKey;
1363:
1364: DisableControls (hWnd);
1365:
1366:
1367: // we also need to get the remote machine's title indexes.
1368: //
1369: dwR = RegConnectRegistry (gszCurrentMachine, HKEY_LOCAL_MACHINE, &hKey);
1370:
1371: if (dwR == ERROR_SUCCESS)
1372: ghMachineKey = hKey;
1373: else
1374: // unable to connect, so we'll use our own indexes.
1375: //
1376: ghMachineKey = HKEY_LOCAL_MACHINE;
1377: }
1378: }
1379:
1380: SetCursor (ghCursor[0]);
1381:
1382:
1383: EnableWindow (GetDlgItem (hWnd, PVIEW_CONNECT), FALSE);
1384:
1385:
1386: return bResult;
1387:
1388: }
1389:
1390:
1391:
1392:
1393: //********************************************************
1394: //
1395: // DisableControls --
1396: //
1397: // Disable controls that don't make sense on remote machine
1398: //
1399: void DisableControls (HWND hPviewDlg)
1400: {
1401: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_TERMINATE), FALSE);
1402: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_HIGH), FALSE);
1403: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_NORMAL), FALSE);
1404: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_IDL), FALSE);
1405: }
1406:
1407:
1408:
1409:
1410: //********************************************************
1411: //
1412: // EnableControls --
1413: //
1414: // Enable controls disabled by DisableControl().
1415: //
1416: void EnableControls (HWND hPviewDlg)
1417: {
1418: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_TERMINATE), TRUE);
1419: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_HIGH), TRUE);
1420: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_NORMAL), TRUE);
1421: EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_IDL), TRUE);
1422: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.