|
|
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: * Module: misc.c
15: *
16: * Contains miscellaneous routines for the Windows debugging Spy SDK applet.
17: *
18: * Functions:
19: *
20: * ReadRegistry()
21: * WriteRegistry()
22: * Message()
23: * SetSpyCaption()
24: * GetWindowName()
25: * StripExtension()
26: *
27: * Comments:
28: *
29: \*****************************************************************************/
30:
31: #include "spy.h"
32: #include <string.h>
33:
34:
35: //
36: // Registry flags for the "Flags" value.
37: //
38: #define REGFLAG_OUTPUTWIN 0x00000001
39: #define REGFLAG_OUTPUTCOM1 0x00000002
40: #define REGFLAG_OUTPUTFILE 0x00000004
41: #define REGFLAG_MSGSUSER 0x00000010
42: #define REGFLAG_MSGSUNKNOWN 0x00000020
43:
44:
45: PRIVATE HKEY ghkeySpy = NULL;
46: PRIVATE CHAR gszSpyAppKey[] = "Software\\Microsoft\\Spy";
47: PRIVATE CHAR gszKeyPosition[] = "Position";
48: PRIVATE CHAR gszKeyFont[] = "Font";
49: PRIVATE CHAR gszKeyMessages[] = "Messages";
50: PRIVATE CHAR gszKeyFileName[] = "FileName";
51: PRIVATE CHAR gszKeyLines[] = "Lines";
52: PRIVATE CHAR gszKeyFlags[] = "Flags";
53: PRIVATE CHAR gszDefFileName[] = "spy.log";
54: PRIVATE BYTE BitTable[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
55:
56:
57: PRIVATE VOID GetWindowName(HWND hwnd, PSTR sz);
58: PRIVATE LPSTR StripExtension(LPSTR pszFileName);
59:
60:
61:
62:
63: /*****************************************************************************\
64: * ReadRegistry
65: *
66: * Opens (creates if necessary) the registry key for spy preferences and then
67: * reads the last saved values.
68: *
69: * Arguments:
70: * none
71: *
72: * Returns:
73: * VOID
74: \*****************************************************************************/
75:
76: VOID
77: ReadRegistry(
78: VOID
79: )
80: {
81: LOGFONT lf;
82: BYTE abMsgs[128];
83: DWORD fFlags;
84: HDC hdc;
85: INT i;
86: DWORD dwType;
87: DWORD cbData;
88:
89: RegCreateKey(HKEY_CURRENT_USER, gszSpyAppKey, &ghkeySpy);
90:
91: cbData = sizeof(gwndpl);
92: if (!ghkeySpy || RegQueryValueEx(ghkeySpy, gszKeyPosition, NULL, &dwType,
93: (LPVOID)&gwndpl, &cbData) != ERROR_SUCCESS)
94: {
95: gwndpl.length = sizeof(gwndpl);
96: gwndpl.flags = 0;
97: gwndpl.showCmd = SW_SHOWNORMAL;
98: gwndpl.ptMinPosition.x = 0;
99: gwndpl.ptMinPosition.y = 0;
100: gwndpl.ptMaxPosition.x = 0;
101: gwndpl.ptMaxPosition.y = 0;
102: gwndpl.rcNormalPosition.left = 10;
103: gwndpl.rcNormalPosition.top = 10;
104: gwndpl.rcNormalPosition.right =
105: 10 + (GetSystemMetrics(SM_CXSCREEN) / 3);
106: gwndpl.rcNormalPosition.bottom =
107: 10 + (GetSystemMetrics(SM_CYSCREEN) / 3);
108: }
109:
110: cbData = sizeof(lf);
111: if (!ghkeySpy || RegQueryValueEx(ghkeySpy, gszKeyFont, NULL, &dwType,
112: (LPVOID)&lf, &cbData) != ERROR_SUCCESS)
113: {
114: hdc = GetDC(NULL);
115: GetObject(GetStockObject(SYSTEM_FONT), sizeof(lf), &lf);
116: ReleaseDC(NULL, hdc);
117: }
118:
119: ghfontPrintf = CreateFontIndirect(&lf);
120:
121: cbData = sizeof(abMsgs);
122: if (!ghkeySpy || RegQueryValueEx(ghkeySpy, gszKeyMessages, NULL, &dwType,
123: (LPVOID)abMsgs, &cbData) != ERROR_SUCCESS)
124: {
125: //
126: // Select all messages by default
127: //
128: for (i = 0; i < gcMessages; i++)
129: {
130: gaMsgs[i].Flags |= MTF_SELECTED;
131: }
132: }
133: else
134: {
135: for (i = 0; i < gcMessages; i++)
136: {
137: if (abMsgs[gaMsgs[i].msg >> 3] & BitTable[gaMsgs[i].msg & 0x07])
138: gaMsgs[i].Flags |= MTF_SELECTED;
139: }
140: }
141:
142: cbData = MAXSTRING * sizeof(TCHAR);
143: if (!ghkeySpy || RegQueryValueEx(ghkeySpy, gszKeyFileName, NULL, &dwType,
144: (LPVOID)gszFile, &cbData) != ERROR_SUCCESS)
145: {
146: lstrcpy(gszFile, gszDefFileName);
147: }
148:
149: cbData = sizeof(DWORD);
150: if (!ghkeySpy || RegQueryValueEx(ghkeySpy, gszKeyLines, NULL, &dwType,
151: (LPVOID)&gnLines, &cbData) != ERROR_SUCCESS ||
152: gnLines > LINES_MAX)
153: {
154: gnLines = LINES_MAX;
155: }
156:
157: cbData = sizeof(DWORD);
158: if (!ghkeySpy || RegQueryValueEx(ghkeySpy, gszKeyFlags, NULL, &dwType,
159: (LPVOID)&fFlags, &cbData) != ERROR_SUCCESS)
160: {
161: gfOutputWin = TRUE;
162: gfOutputCom1 = FALSE;
163: gfOutputFile = FALSE;
164: gfMsgsUser = TRUE;
165: gfMsgsUnknown = TRUE;
166: }
167: else
168: {
169: if (fFlags & REGFLAG_OUTPUTWIN)
170: gfOutputWin = TRUE;
171:
172: if (fFlags & REGFLAG_OUTPUTCOM1)
173: gfOutputCom1 = TRUE;
174:
175: if (fFlags & REGFLAG_OUTPUTFILE)
176: gfOutputFile = TRUE;
177:
178: if (fFlags & REGFLAG_MSGSUSER)
179: gfMsgsUser = TRUE;
180:
181: if (fFlags & REGFLAG_MSGSUNKNOWN)
182: gfMsgsUnknown = TRUE;
183: }
184:
185: if (gfOutputFile)
186: {
187: gfhFile = _lcreat(gszFile, 0);
188: if (gfhFile == (HFILE)-1) //BUGBUG put up a message here.
189: gfhFile = 0;
190: }
191: }
192:
193:
194:
195: /*****************************************************************************\
196: * WriteRegistry
197: *
198: * Writes out preference data to the registry when the app exits, then
199: * closes the registry key.
200: *
201: * Arguments:
202: * none
203: *
204: * Returns:
205: * VOID
206: \*****************************************************************************/
207:
208: VOID
209: WriteRegistry(
210: VOID
211: )
212: {
213: LOGFONT lf;
214: BYTE abMsgs[128];
215: INT i;
216: DWORD fFlags;
217: WINDOWPLACEMENT wndpl;
218:
219: if (ghkeySpy)
220: {
221: GetWindowPlacement(ghwndSpyApp, &wndpl);
222: RegSetValueEx(ghkeySpy, gszKeyPosition, 0, REG_BINARY,
223: (LPBYTE)&wndpl, sizeof(wndpl));
224:
225: GetObject(ghfontPrintf, sizeof(lf), &lf);
226: RegSetValueEx(ghkeySpy, gszKeyFont, 0, REG_BINARY,
227: (LPBYTE)&lf, sizeof(lf));
228:
229: memset(abMsgs, 0, sizeof(abMsgs));
230: for (i = 0; i < gcMessages; i++)
231: {
232: if (gaMsgs[i].Flags & MTF_SELECTED)
233: abMsgs[gaMsgs[i].msg >> 3] |= BitTable[gaMsgs[i].msg & 0x07];
234: }
235:
236: RegSetValueEx(ghkeySpy, gszKeyMessages, 0, REG_BINARY,
237: (LPBYTE)&abMsgs, sizeof(abMsgs));
238:
239: RegSetValueEx(ghkeySpy, gszKeyFileName, 0, REG_SZ,
240: (LPBYTE)gszFile, (lstrlen(gszFile) + 1) * sizeof(TCHAR));
241:
242: RegSetValueEx(ghkeySpy, gszKeyLines, 0, REG_DWORD,
243: (LPBYTE)&gnLines, sizeof(DWORD));
244:
245: fFlags = 0;
246: if (gfOutputWin)
247: fFlags |= REGFLAG_OUTPUTWIN;
248:
249: if (gfOutputCom1)
250: fFlags |= REGFLAG_OUTPUTCOM1;
251:
252: if (gfOutputFile)
253: fFlags |= REGFLAG_OUTPUTFILE;
254:
255: if (gfMsgsUser)
256: fFlags |= REGFLAG_MSGSUSER;
257:
258: if (gfMsgsUnknown)
259: fFlags |= REGFLAG_MSGSUNKNOWN;
260:
261: RegSetValueEx(ghkeySpy, gszKeyFlags, 0, REG_DWORD,
262: (LPBYTE)&fFlags, sizeof(DWORD));
263:
264: RegCloseKey(ghkeySpy);
265: }
266: }
267:
268:
269:
270: /*****************************************************************************\
271: * Message
272: *
273: * Puts up a message box.
274: *
275: * Arguments:
276: * UINT fuStyle - Flags for MessageBox (MB_YESNOCANCEL, etc).
277: * LPSTR pszFormat - Format string for the message.
278: *
279: * Returns:
280: * Whatever MessageBox returns.
281: *
282: \*****************************************************************************/
283:
284: INT
285: Message(
286: UINT fuStyle,
287: LPSTR pszFormat,
288: ...
289: )
290: {
291: va_list marker;
292: INT RetCode;
293: TCHAR szT[MAXSTRING];
294:
295: va_start(marker, pszFormat);
296: wvsprintf(szT, pszFormat, marker);
297: RetCode = MessageBox(ghwndSpyApp, szT, gszAppName, fuStyle | MB_TASKMODAL);
298: va_end(marker);
299:
300: return RetCode;
301: }
302:
303:
304:
305: /*****************************************************************************\
306: * SetSpyCaption
307: *
308: * This routine sets the Spy app's caption bar to display info on the window
309: * that is currently being spy'ed upon.
310: *
311: * Arguments:
312: * none
313: *
314: * Returns:
315: * VOID
316: \*****************************************************************************/
317:
318: VOID
319: SetSpyCaption(
320: VOID
321: )
322: {
323: CHAR szText[MAXSTRING];
324: CHAR szTemp[MAXSTRING];
325:
326: if (ghwndSpyingOn != NULL && ghwndSpyingOn != HWND_ALL)
327: {
328: GetWindowName(ghwndSpyingOn, szTemp);
329:
330: if (lstrlen(gszAppName) + lstrlen(szTemp) + 3 > MAXSTRING)
331: szTemp[MAXSTRING - 3 - lstrlen(szTemp)] = 0;
332:
333: if (gfSpyOn)
334: wsprintf(szText, "%s - %s", gszAppName, szTemp);
335: else
336: wsprintf(szText, "<%s - %s>", gszAppName, szTemp);
337: }
338: else
339: {
340: lstrcpy(szText, gszAppName);
341: }
342:
343: SetWindowText(ghwndSpyApp, szText);
344: }
345:
346:
347:
348: /*****************************************************************************\
349: * GetWindowName
350: *
351: * Builds the name of the window being spy'd on in the specified buffer.
352: * This will be something like "EXENAME!WindowText" or "EXENAME!Class".
353: *
354: * Arguments:
355: *
356: * HWND hwnd - handle to the window being spy'd on.
357: * PSTR pstr - pointer to string to return.
358: *
359: * Returns:
360: * VOID
361: \*****************************************************************************/
362:
363: PRIVATE VOID
364: GetWindowName(
365: HWND hwnd,
366: PSTR sz
367: )
368: {
369: PSTR szSave = sz;
370:
371: if (hwnd != NULL && IsWindow(hwnd))
372: {
373: /*
374: * Get the module name
375: */
376: GetModuleFileName((HANDLE)GetWindowLong(hwnd, GWL_HINSTANCE),
377: sz, MAXSTRING);
378: lstrcpy(sz, StripExtension(sz));
379: sz += lstrlen(sz);
380: *sz++ = '!';
381: *sz = 0;
382:
383: GetWindowText(hwnd, sz, MAXSTRING - (sz - szSave));
384:
385: /*
386: * If the window has no caption string then use the Class name
387: */
388: if (*sz == 0)
389: GetClassName(hwnd, sz, MAXSTRING - (sz - szSave));
390: }
391: else
392: {
393: *sz = 0;
394: }
395: }
396:
397:
398:
399: /*****************************************************************************\
400: * StripExtension
401: *
402: * Strips the extension off of a filename.
403: *
404: * Arguments:
405: * LPSTR pszFileName - File name to process.
406: *
407: * Returns:
408: * Returns a pointer to the beginning of the filename. The extension
409: * will have been stripped off.
410: *
411: \*****************************************************************************/
412:
413: PRIVATE LPSTR
414: StripExtension(
415: LPSTR pszFileName
416: )
417: {
418: LPSTR p = pszFileName;
419:
420: while (*p)
421: p++;
422:
423: while (p >= pszFileName && *p != '\\')
424: {
425: if (*p == '.')
426: *p = 0;
427:
428: p--;
429: }
430:
431: return ++p;
432: }
433:
434:
435:
436:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.