|
|
1.1 root 1: //
2: // Foreign computer support needs more work (a-robw)
3: //
4: #ifdef FOREIGN_COMPUTER_SUPPORT
5: #undef FOREIGN_COMPUTER_SUPPORT
6: #endif
7:
8: #include "perfmon.h"
9: #include "system.h" // external declarations for this file
10:
11: #include "perfdata.h"
12: #include "perfmops.h"
13: #include "playback.h" // for PlayingBackLog
14: #include "pmemory.h"
15: #include "utils.h" // for strsame, et al
16: #include "sizes.h"
17:
18: DWORD
19: SystemCount(
20: PPERFSYSTEM pSystemFirst
21: )
22: {
23: PPERFSYSTEM pSystem ;
24: DWORD iNumSystems ;
25:
26: iNumSystems = 0 ;
27:
28: for (pSystem = pSystemFirst ;
29: pSystem ;
30: pSystem = pSystem->pSystemNext) {
31: iNumSystems++ ;
32: }
33:
34: return iNumSystems ;
35: }
36:
37: PPERFSYSTEM
38: SystemCreate (
39: LPCTSTR lpszSystemName
40: )
41: {
42: PPERFSYSTEM pSystem ;
43: PPERFDATA pLocalPerfData;
44: DWORD Status ;
45: DWORD dwMemSize;
46: TCHAR GlobalValueBuffer[] = L"Global" ;
47: TCHAR ForeignValueBuffer[8+MAX_COMPUTERNAME_LENGTH+1] =
48: L"Foreign " ;
49:
50: // attempt to allocate system data structure
51:
52: pSystem = MemoryAllocate (sizeof (PERFSYSTEM)) ;
53: if (!pSystem) {
54: SetLastError (ERROR_OUTOFMEMORY);
55: return (NULL) ;
56: }
57:
58: // initialize name and help table pointers
59:
60: pSystem->CounterInfo.pNextTable = NULL;
61: pSystem->CounterInfo.dwLangId = 0;
62: pSystem->CounterInfo.dwLastId = 0;
63: pSystem->CounterInfo.TextString = NULL;
64:
65: lstrcpy (pSystem->sysName, lpszSystemName) ;
66:
67: // try to open key to registry, error code is in GetLastError()
68:
69: pSystem->sysDataKey = OpenSystemPerfData(lpszSystemName);
70:
71: // if a Null Key was returned then:
72: // a) there's no such computer
73: // b) the system is a foreign computer
74: //
75: // before giving up, then see if it's a foreign computer
76:
77: if (!pSystem->sysDataKey) {
78:
79: // build foreign computer string
80:
81: lstrcat(ForeignValueBuffer, lpszSystemName) ;
82:
83: // assign System value name pointer to the local variable for trial
84:
85: pSystem->lpszValue = ForeignValueBuffer;
86:
87: // try to get data from the computer to see if it's for real
88: // otherwise, give up and return NULL
89:
90: pLocalPerfData = MemoryAllocate (STARTING_SYSINFO_SIZE);
91: if (pLocalPerfData == NULL) { // no mem so give up
92: SetLastError (ERROR_OUTOFMEMORY);
93: SystemFree (pSystem, TRUE);
94: return (NULL);
95: } else {
96: pSystem->sysDataKey = HKEY_PERFORMANCE_DATA; // local machine
97:
98: dwMemSize = STARTING_SYSINFO_SIZE;
99: Status = GetSystemPerfData (
100: pSystem->sysDataKey,
101: pSystem->lpszValue,
102: pLocalPerfData,
103: &dwMemSize);
104:
105: // success means a valid buffer came back
106: // more data means someone tried (so it's probably good (?)
107:
108: if (!((Status == ERROR_MORE_DATA) || (Status == ERROR_SUCCESS)) ||
109: !((pLocalPerfData->Signature[0] == (WCHAR)'P') &&
110: (pLocalPerfData->Signature[1] == (WCHAR)'E') &&
111: (pLocalPerfData->Signature[2] == (WCHAR)'R') &&
112: (pLocalPerfData->Signature[3] == (WCHAR)'F'))) {
113: SetLastError (ERROR_BAD_NET_NAME); // unable to find name
114: SystemFree (pSystem, TRUE);
115: MemoryFree (pLocalPerfData); // don't really need anything from it
116: return NULL;
117: }
118:
119: MemoryFree (pLocalPerfData); // don't really need anything from it
120:
121: // ok, so we've established that a foreign data provider
122: // exists, now to finish the initialization.
123:
124: // change system name in structure to get counter names
125:
126: lstrcpy (pSystem->sysName, LocalComputerName);
127:
128: Status = GetSystemNames(pSystem); // get counter names & explain text
129: if (Status != ERROR_SUCCESS) {
130: // unable to get names so bail out
131: SetLastError (Status);
132: SystemFree (pSystem, TRUE);
133: return (NULL) ;
134: }
135:
136: // restore computer name for displays, etc.
137:
138: lstrcpy (pSystem->sysName, lpszSystemName);
139:
140: // allocate value string buffer
141: pSystem->lpszValue = MemoryAllocate (TEMP_BUF_LEN*sizeof(WCHAR));
142: if (!pSystem->lpszValue) {
143: // unable to allocate memory
144: SetLastError (ERROR_OUTOFMEMORY);
145: SystemFree (pSystem, TRUE);
146: return (NULL) ;
147: } else {
148: lstrcpy (pSystem->lpszValue, ForeignValueBuffer);
149: }
150: }
151: } else {
152: // if here, then a connection to the system's registry was established
153: // so continue with the system data structure initialization
154:
155: // get counter names & explain text from local computer
156:
157: Status = GetSystemNames(pSystem);
158: if (Status != ERROR_SUCCESS) {
159: // unable to get names so bail out
160: SetLastError (Status);
161: SystemFree (pSystem, TRUE);
162: return (NULL) ;
163: }
164:
165: // allocate value string buffer
166: pSystem->lpszValue = MemoryAllocate(TEMP_BUF_LEN*sizeof(WCHAR));
167:
168: if (!pSystem->lpszValue) {
169: // unable to allocate memory
170: SetLastError (ERROR_OUTOFMEMORY);
171: SystemFree (pSystem, TRUE);
172: return (NULL) ;
173: } else {
174: SetSystemValueNameToGlobal (pSystem);
175: }
176: }
177:
178: // initialize remaining system pointers
179:
180: pSystem->pSystemNext = NULL ;
181: pSystem->FailureTime = 0;
182:
183: SetLastError (ERROR_SUCCESS);
184:
185: return (pSystem) ;
186: } // SystemCreate
187:
188: PPERFSYSTEM
189: SystemGet (
190: PPERFSYSTEM pSystemFirst,
191: LPCTSTR lpszSystemName
192: )
193: {
194: PPERFSYSTEM pSystem ;
195:
196: if (!pSystemFirst) {
197: return (NULL) ;
198: }
199:
200: for (pSystem = pSystemFirst ;
201: pSystem ;
202: pSystem = pSystem->pSystemNext) {
203: if (strsamei (pSystem->sysName, lpszSystemName)) {
204: return (pSystem) ;
205: }
206: } // for
207:
208: return (NULL) ;
209: }
210:
211: PPERFSYSTEM
212: SystemAdd (
213: PPPERFSYSTEM ppSystemFirst,
214: LPCTSTR lpszSystemName
215: )
216: {
217: PPERFSYSTEM pSystem ;
218: PPERFSYSTEM pSystemPrev ;
219:
220:
221: if (!*ppSystemFirst) {
222: *ppSystemFirst = SystemCreate (lpszSystemName) ;
223: return (*ppSystemFirst) ;
224: }
225:
226: for (pSystem = *ppSystemFirst ;
227: pSystem ;
228: pSystem = pSystem->pSystemNext) {
229: pSystemPrev = pSystem ;
230: if (strsamei (pSystem->sysName, lpszSystemName)) {
231: return (pSystem) ;
232: }
233: } // for
234:
235: pSystemPrev->pSystemNext = SystemCreate (lpszSystemName) ;
236: return (pSystemPrev->pSystemNext) ;
237: }
238:
239: void
240: SystemFree (
241: PPERFSYSTEM pSystem,
242: BOOL bDeleteTheSystem
243: )
244: { // SystemFree
245:
246: PCOUNTERTEXT pCounter, pNextCounter;
247:
248: if (!pSystem) {
249: // can't proceed
250: return ;
251: }
252:
253: if (pSystem->sysDataKey && pSystem->sysDataKey != HKEY_PERFORMANCE_DATA) {
254: // close the remote computer key
255: RegCloseKey (pSystem->sysDataKey);
256: pSystem->sysDataKey = 0 ;
257: }
258:
259: for (pCounter = pSystem->CounterInfo.pNextTable, pNextCounter = NULL;
260: pCounter;
261: pCounter = pNextCounter) {
262: pNextCounter = pCounter->pNextTable;
263: MemoryFree (pCounter);
264: }
265: pSystem->CounterInfo.pNextTable = NULL ;
266:
267: if (pSystem->CounterInfo.TextString) {
268: MemoryFree (pSystem->CounterInfo.TextString);
269: pSystem->CounterInfo.TextString = NULL ;
270: }
271:
272: if (pSystem->CounterInfo.HelpTextString) {
273: MemoryFree (pSystem->CounterInfo.HelpTextString);
274: pSystem->CounterInfo.HelpTextString = NULL ;
275: }
276: pSystem->CounterInfo.dwLastId = 0 ;
277: pSystem->CounterInfo.dwHelpSize = 0 ;
278: pSystem->CounterInfo.dwCounterSize = 0 ;
279:
280: if (bDeleteTheSystem) {
281: if (pSystem->lpszValue) {
282: MemoryFree (pSystem->lpszValue);
283: pSystem->lpszValue = NULL ;
284: }
285: MemoryFree (pSystem) ;
286: }
287: }
288:
289: void
290: DeleteUnusedSystems (
291: PPPERFSYSTEM ppSystemFirst ,
292: int iNoUseSystems
293: )
294: {
295: PPERFSYSTEM pPrevSys, pCurrentSys, pNextSys ;
296:
297: // delete all the marked system from the list header until
298: // we hit one that is not marked
299: while ((*ppSystemFirst)->bSystemNoLongerNeeded) {
300: // delect from the list header
301: pCurrentSys = *ppSystemFirst ;
302: *ppSystemFirst = pCurrentSys->pSystemNext ;
303: SystemFree (pCurrentSys, TRUE) ;
304: iNoUseSystems-- ;
305: if (iNoUseSystems <= 0 || !(*ppSystemFirst)) {
306: // done
307: break ;
308: }
309: }
310:
311: if (iNoUseSystems <= 0 || !(*ppSystemFirst)) {
312: return ;
313: }
314:
315: // now walk the list and delete each marked system
316: for (pPrevSys = *ppSystemFirst, pCurrentSys = pPrevSys->pSystemNext ;
317: pCurrentSys && iNoUseSystems > 0 ;
318: pCurrentSys = pNextSys, iNoUseSystems--) {
319:
320: if (pCurrentSys->bSystemNoLongerNeeded) {
321: // the current system is marked, updated the list and free
322: // this system. No need to change pPrevSys here
323: pNextSys = pPrevSys->pSystemNext = pCurrentSys->pSystemNext ;
324: SystemFree (pCurrentSys, TRUE) ;
325: } else {
326: // pCurrentSys is OK, update the 2 list pointers and
327: // carry on looping
328: pPrevSys = pCurrentSys ;
329: pNextSys = pCurrentSys->pSystemNext ;
330: }
331: }
332: }
333:
334: void
335: FreeSystems (
336: PPERFSYSTEM pSystemFirst
337: )
338: {
339: PPERFSYSTEM pSystem, pSystemNext ;
340:
341:
342: for (pSystem = pSystemFirst;
343: pSystem;
344: pSystem = pSystemNext) {
345: pSystemNext = pSystem->pSystemNext ;
346: SystemFree (pSystem, TRUE) ;
347: }
348: } // FreeSystems
349:
350: PPERFSYSTEM
351: GetComputer (
352: HDLG hDlg,
353: WORD wControlID,
354: BOOL bWarn,
355: PPERFDATA *ppPerfData,
356: PPERFSYSTEM *ppSystemFirst
357: )
358: /*
359: Effect: Attempt to set the current computer to the one in the
360: hWndComputers dialog edit box. If this computer system
361: can be found, load the objects, etc. for the computer
362: and set pSystem and ppPerfdata to the values for this
363: system.
364: */
365: { // GetComputer
366: TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 1] ;
367: PPERFSYSTEM pSystem;
368: TCHAR tempBuffer [LongTextLen] ;
369: DWORD dwBufferSize ;
370: LPTSTR pBuffer = NULL ;
371:
372: DialogText (hDlg, wControlID, szComputer) ;
373:
374: // If necessary, add the system to the lists for this view.
375: pSystem = SystemGet (*ppSystemFirst, szComputer) ;
376: if (!pSystem) {
377: pSystem = SystemAdd (ppSystemFirst, szComputer) ;
378: }
379:
380: if (!pSystem && bWarn) {
381: DialogSetString (hDlg, wControlID, LocalComputerName) ;
382:
383: // Note: this will succeed since the local computer is always
384: // available
385: EditSetModified (GetDlgItem(hDlg, wControlID), FALSE) ;
386:
387: pSystem = SystemGet (*ppSystemFirst, LocalComputerName) ;
388: if (!pSystem) {
389: pSystem = SystemAdd (ppSystemFirst, LocalComputerName) ;
390: }
391:
392: // MessageBoxResource (hDlg, IDS_COMPUTERNOTFOUND, IDS_APPNAME, MB_OK) ;
393: DlgErrorBox (hDlg, ERR_COMPUTERNOTFOUND) ;
394:
395: SetFocus (DialogControl(hDlg, wControlID)) ;
396: }
397:
398: if (pSystem) {
399: if (PlayingBackLog ()) {
400: *ppPerfData =
401: LogDataFromPosition (pSystem, &(PlaybackLog.StartIndexPos)) ;
402: } else {
403:
404: if (pSystem->lpszValue) {
405: // save the previous lpszValue string before
406: // SetSystemValueNameToGlobal screw it up
407: dwBufferSize = MemorySize (pSystem->lpszValue) ;
408: if (dwBufferSize <= sizeof(tempBuffer)) {
409: pBuffer = tempBuffer ;
410: } else {
411: pBuffer = MemoryAllocate (dwBufferSize) ;
412: }
413: memcpy (pBuffer, pSystem->lpszValue, dwBufferSize) ;
414: }
415:
416: SetSystemValueNameToGlobal (pSystem);
417: UpdateSystemData (pSystem, ppPerfData) ;
418:
419: if (pSystem->lpszValue) {
420: // retore the previous lpszValue string
421: memcpy (pSystem->lpszValue, pBuffer, dwBufferSize) ;
422: if (pBuffer != tempBuffer) {
423: MemoryFree (pBuffer) ;
424: }
425: }
426: }
427: }
428: return (pSystem) ;
429:
430: } // GetComputer
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.