MISC.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:13k
源码类别:

Windows编程

开发平台:

Visual C++

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