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

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. #include "pwalk.h"
  11. #define BYTE_WIN_WIDTH     77
  12. #define CLINESSHOW   8
  13. #define ABS(x) ((x) < 0? -(x) : (x))
  14. /* externally defined system constants */
  15. extern int     xChar,
  16.     yChar,
  17.     xScreen,
  18.     yScreen,
  19.     yFrame,
  20.     xFrame,
  21.     yCaption,
  22.     xVScrollBar;
  23. extern HFONT hFont;
  24. extern HWND  hMemWnd;
  25. void WINAPI VScrollBytes (HWND, int, int, LPMEMVIEW);
  26. void WINAPI KeyToScrollMsg (HWND, WPARAM);
  27. void WINAPI DisplayBytes (HDC, LPRECT, LPMEMVIEW, LPMEMVIEW);
  28. void WINAPI GetBytesLine (LPBYTE, UINT, DWORD, int, char *);
  29. BOOL WINAPI parcmp (LPBYTE, LPBYTE, int, LPBYTE);
  30. HWND   WINAPI EnumViewWindows (
  31.     HWND    hWndParent,
  32.     HWND    hWndLast)
  33. {
  34.     HMENU   hMenu = GetMenu (hWndParent);
  35.     HMENU   hViewMenu = GetSubMenu (hMenu, 2);
  36.     char    szClass[MAX_PATH];
  37.     char    szCaption[MAX_PATH];
  38.     HWND    hWnd;
  39.     int     i;
  40. static   int   nWindows;
  41. static   ATOM   *aMenuItems = NULL;
  42. static   int   iWnd;
  43.     /* load window class name */
  44.     LoadString (GetModuleHandle (NULL), IDS_MEMVIEWCLASS, szClass, MAX_PATH);
  45.     if (hWndLast == NULL)
  46. {
  47. /* start with first window in menu list */
  48. iWnd = 0;
  49. /* determine number of windows */
  50. nWindows = GetMenuItemCount (hViewMenu) - 5;
  51. /* if no popup windows, just return */
  52. if (nWindows <= 0)
  53.     return NULL;
  54. /* free memory from last time, if any */
  55. if (aMenuItems != NULL)
  56.     LocalFree ((HANDLE)aMenuItems);
  57. /* get menuitem IDs */
  58. aMenuItems = (ATOM *)LocalAlloc (LPTR, nWindows*sizeof (ATOM));
  59. for (i=5; i-5<nWindows; i++)
  60.     aMenuItems[i-5] = (ATOM)GetMenuItemID (hViewMenu, i);
  61. }
  62.     else
  63. if (iWnd >= nWindows)
  64.     return (NULL);
  65.     GetAtomName (aMenuItems[iWnd], szCaption, MAX_PATH);
  66.     hWnd = FindWindow (szClass, szCaption);
  67.     iWnd++;
  68.     return (hWnd);
  69. }
  70. /* activate view window identified by atom */
  71. void   WINAPI ActivateViewWindow (
  72.     ATOM    aCaption)
  73. {
  74.     char    szClass[MAX_PATH];
  75.     char    szCaption[MAX_PATH];
  76.     HWND    hWnd;
  77.     GetAtomName (aCaption, szCaption, MAX_PATH);
  78.     LoadString (GetModuleHandle (NULL), IDS_MEMVIEWCLASS, szClass, MAX_PATH);
  79.     hWnd = FindWindow (szClass, szCaption);
  80.     BringWindowToTop (hWnd);
  81. }
  82. /* function creates a window for viewing memory */
  83. HWND  WINAPI ViewMemory (
  84.     HWND      hWndParent,
  85.     char      *lpszObject,
  86.     LPVOID    lpMem,
  87.     int       nSize,
  88.     int       nBase)
  89. {
  90.     char      szClass[MAX_PATH];
  91.     /* load resource strings for class and window title */
  92.     LoadString (GetModuleHandle (NULL), IDS_MEMVIEWCLASS, szClass, MAX_PATH);
  93.     /* create memory view window */
  94.     return (CreateWindow (szClass,
  95.   lpszObject,
  96.   WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION |
  97.   WS_VSCROLL | WS_THICKFRAME | WS_MAXIMIZEBOX,
  98.   nSize,   /* use xposition to pass memory size to window */
  99.   nBase,   /* use yposition to pass base memory location  */
  100.   BYTE_WIN_WIDTH * xChar + xVScrollBar + 2*xFrame + xChar,
  101.   yScreen/2,
  102.   hWndParent,
  103.   NULL,
  104.   GetModuleHandle (NULL),
  105.   lpMem));
  106. }
  107. LONG WINAPI MemWndProc (
  108.     HWND      hWnd,
  109.     UINT      uMsg,
  110.     WPARAM    wParam,
  111.     LPARAM    lParam)
  112. {
  113.     LONG       lRet = 1;
  114.     MEMVIEW    *pmv = (LPMEMVIEW)GetWindowLong (hWnd, WXB_LPMEMVIEW);
  115.     
  116.     switch (uMsg)
  117. {
  118. case WM_CREATE:
  119.     pmv = (LPMEMVIEW)LocalAlloc (LPTR, sizeof (MEMVIEW));
  120.     SetWindowLong (hWnd, WXB_LPMEMVIEW, (LONG)pmv);
  121.     SetWindowLong (hWnd, WXB_LPOLDMEMVIEW, 0);
  122.     pmv->lpMem = ((LPCREATESTRUCT)lParam)->lpCreateParams;
  123.     pmv->nSize = ((LPCREATESTRUCT)lParam)->x;
  124.     pmv->nBase = ((LPCREATESTRUCT)lParam)->y;
  125.     pmv->nLines = (pmv->nSize+15)/16;
  126.     pmv->nExtraBytes = (pmv->nSize & 0x0000000F);
  127.     pmv->PosV = 0;
  128.     /* reposition window with proper x,y positions */
  129.     MoveWindow (hWnd,
  130. 15,
  131. 15,
  132. ((LPCREATESTRUCT)lParam)->cx,
  133. ((LPCREATESTRUCT)lParam)->cy,
  134. TRUE);
  135.             break;
  136. case WM_SIZE:
  137.     pmv->xWin = LOWORD (lParam);
  138.     pmv->yWin = HIWORD (lParam);
  139.     pmv->RangeV = pmv->nLines-pmv->yWin/yChar;
  140.     if (pmv->RangeV < 0)
  141. pmv->RangeV = 0;
  142.     if (pmv->PosV > pmv->RangeV)
  143. pmv->PosV = pmv->RangeV;
  144.     SetScrollRange (hWnd, SB_VERT, 0, pmv->RangeV, FALSE);
  145.     SetScrollPos (hWnd, SB_VERT, pmv->PosV, TRUE);
  146.             break;
  147. case WM_PAINT:
  148.     {
  149.     PAINTSTRUCT    ps;
  150.     BeginPaint (hWnd, &ps);
  151.     DisplayBytes (ps.hdc,
  152.   &(ps.rcPaint),
  153.   pmv,
  154.   (LPMEMVIEW)GetWindowLong (hWnd, WXB_LPOLDMEMVIEW));
  155.     EndPaint (hWnd, &ps);
  156.     }
  157.             break;
  158. case UM_UPDATE:
  159.     InvalidateRect (hWnd, NULL, TRUE);
  160.     UpdateWindow (hWnd);
  161.     break;
  162.         case WM_KEYDOWN:
  163.     KeyToScrollMsg (hWnd, wParam);
  164.             break;
  165.         case WM_VSCROLL:
  166.     VScrollBytes (hWnd, LOWORD (wParam), GetScrollPos (hWnd, SB_VERT), pmv);
  167.             break;
  168. case WM_DESTROY:
  169.     {
  170.     char  szCaption[MAX_PATH];
  171.     LPMEMVIEW  lpmv;
  172.     /* free virtual memory block  and local memory buffer */
  173.     VirtualFree (pmv->lpMem, 0, MEM_RELEASE);
  174.     LocalFree ((HANDLE)pmv);
  175.     /* remove any old view memory */
  176.     if ((lpmv = (LPMEMVIEW)GetWindowLong (hWnd, WXB_LPOLDMEMVIEW)) != NULL)
  177. {
  178. VirtualFree (lpmv->lpMem, 0, MEM_RELEASE);
  179. LocalFree ((HANDLE)lpmv);
  180. }
  181.     /* send message to parent to remove menuitem */
  182.     GetWindowText (hWnd, szCaption, MAX_PATH);
  183.     SendMessage (GetParent (hWnd), WM_COMMAND, IDM_REMOVEVIEWWND, (LONG)szCaption);
  184.     }
  185.             break;
  186.         default:
  187.     return (DefWindowProc(hWnd, uMsg, wParam, lParam));
  188.             break;
  189. }
  190.     return 0L;
  191. }
  192. void  WINAPI VScrollBytes (
  193.     HWND  hWnd,
  194.     int   cmd,
  195.     int   pos,
  196.     LPMEMVIEW  lpmv)
  197. {
  198.     int    nScrollInc;
  199.     switch (cmd)
  200. {
  201.         case SB_TOP:
  202.     nScrollInc = -lpmv->PosV;
  203.             break ;
  204.         case SB_BOTTOM:
  205.     nScrollInc = lpmv->RangeV - lpmv->PosV;
  206.             break ;
  207.         case SB_LINEUP:
  208.             nScrollInc = -1;
  209.             break;
  210.         case SB_LINEDOWN:
  211.             nScrollInc = 1;
  212.             break;
  213.         case SB_PAGEDOWN:
  214.     nScrollInc = max (1, lpmv->yWin/yChar);
  215.             break;
  216.         case SB_PAGEUP:
  217.     nScrollInc = min (-1, -(lpmv->yWin/yChar));
  218.             break;
  219.     
  220.         case SB_THUMBPOSITION:
  221.     nScrollInc = pos - lpmv->PosV;
  222.             break;
  223. case SB_THUMBTRACK:
  224.     nScrollInc = pos - lpmv->PosV;
  225.             break;
  226.         default:
  227.             nScrollInc = 0;
  228. }
  229.     if (nScrollInc > lpmv->RangeV-lpmv->PosV)
  230. nScrollInc = lpmv->RangeV-lpmv->PosV;
  231.     if (nScrollInc < -lpmv->PosV)
  232. nScrollInc = -lpmv->PosV;
  233.     if (nScrollInc)
  234. {
  235. lpmv->PosV += nScrollInc;
  236. if (ABS (nScrollInc) < lpmv->yWin/yChar)
  237.     ScrollWindow (hWnd, 0, -(yChar*nScrollInc), NULL, NULL);
  238. else
  239.     InvalidateRect (hWnd, NULL, TRUE);
  240. SetScrollPos (hWnd, SB_VERT, lpmv->PosV, TRUE);
  241. UpdateWindow(hWnd);
  242. }
  243. }
  244. void  WINAPI KeyToScrollMsg (
  245.     HWND      hWnd,
  246.     WPARAM    wParam)
  247. {
  248.     int       i, nKeys;
  249.     static    struct
  250. {
  251.         WORD wVirtKey;
  252.         int  iMessage;
  253.         WORD wRequest;
  254. }key2scroll [] = {
  255.  VK_HOME,  WM_VSCROLL, SB_TOP,   VK_END,   WM_VSCROLL,
  256.  SB_BOTTOM, VK_PRIOR, WM_VSCROLL, SB_PAGEUP, VK_NEXT,
  257.  WM_VSCROLL, SB_PAGEDOWN, VK_UP,    WM_VSCROLL, SB_LINEUP,
  258.  VK_DOWN,  WM_VSCROLL, SB_LINEDOWN, VK_LEFT,  WM_HSCROLL,
  259.  SB_LINEUP, VK_RIGHT, WM_HSCROLL, SB_LINEDOWN,
  260.  };
  261.     nKeys = sizeof key2scroll / sizeof key2scroll[0];
  262.     for (i=0; i<nKeys; i++)
  263. {
  264.         if (wParam == key2scroll[i].wVirtKey)   
  265.     {
  266.             SendMessage (hWnd, key2scroll[i].iMessage, key2scroll[i].wRequest, 0L);
  267.             return;
  268.     }
  269. }
  270. }
  271. void  WINAPI DisplayBytes (
  272.     HDC   hDC,
  273.     RECT  *pRect,
  274.     LPMEMVIEW  lpmv,
  275.     LPMEMVIEW  lpmvOld)
  276. {
  277.     UINT      i, r, iFirst, iLast, y;
  278.     char      szBuf[MAX_PATH], szText[MAX_PATH];
  279.     LPBYTE    pMem = (LPBYTE)lpmv->lpMem;
  280.     LPBYTE    pOldMem;
  281.     BYTE      bRes[16];
  282.     COLORREF  crOldColor = 0;
  283.     SIZE      sz;
  284.     int       cx;
  285.     if (lpmvOld != NULL)
  286. {
  287. pOldMem = (LPBYTE)lpmvOld->lpMem;
  288. /* normalize to beginning of section relative to current memory */
  289. (int)pOldMem += lpmvOld->nBase - lpmv->nBase;
  290. }
  291.     SelectObject (hDC, hFont);
  292.     SetTextColor (hDC, GetSysColor (COLOR_WINDOWTEXT));
  293.     SetBkColor (hDC, GetSysColor (COLOR_WINDOW));
  294.     y = lpmv->PosV;
  295.     iFirst = y + pRect->top/yChar-1;
  296.     if (iFirst == 0xFFFFFFFFL)
  297. iFirst = 0;
  298.     iLast = min (y + pRect->bottom/yChar+1, (UINT)lpmv->nLines-1);
  299.     pMem += iFirst << 4;
  300.     pOldMem += iFirst << 4;
  301.     if (lpmv->nExtraBytes)
  302.         iLast--;
  303.     /* paint complete lines (lines with 16 bytes) */
  304.     GetBytesLine (NULL, 0, 0, 0, NULL);
  305.     y = (iFirst - y) * yChar;
  306.     for (i = iFirst; i<iLast; i++)
  307. {
  308. GetBytesLine (pMem, i, lpmv->nBase, 16, szBuf);
  309. if (lpmvOld != NULL &&
  310.     ((int)pMem-(int)lpmv->lpMem + lpmv->nBase) >= lpmvOld->nBase &&
  311.     ((int)pMem-(int)lpmv->lpMem + lpmv->nBase) < (lpmvOld->nBase + lpmvOld->nSize) &&
  312.     !parcmp (pMem, pOldMem, 16, bRes))
  313.     {
  314.     /* write line number and leading space */
  315.     strncpy (szText, szBuf, 12);
  316.     szText[12] = 0;
  317.     GetTextExtentPoint (hDC, szText, 12, &sz);
  318.     cx = xChar;
  319.     SetTextColor (hDC, GetSysColor (COLOR_HIGHLIGHTTEXT));
  320.     TextOut (hDC, cx, LOWORD (y), szText, 12);
  321.     /* check each hex byte for change */
  322.     for (r=0; r<16; r++)
  323. {
  324. if (bRes[r])
  325.     SetTextColor (hDC, RGB (191, 0, 0));
  326. else
  327.     SetTextColor (hDC, GetSysColor(COLOR_WINDOWTEXT));
  328. /* draw next byte */
  329. szText[0] = szBuf[3*r+12];
  330. szText[1] = szBuf[3*r+1+12];
  331. szText[2] = szBuf[3*r+2+12];
  332. szText[3] = 0;
  333. cx += sz.cx;
  334. GetTextExtentPoint (hDC, szText, 3, &sz);
  335. TextOut (hDC, cx, LOWORD (y), szText, 3);
  336. }
  337.     /* check each ascii byte */
  338.     for (r=0; r<16; r++)
  339. {
  340. if (bRes[r])
  341.     SetTextColor (hDC, RGB (191, 0, 0));
  342. else
  343.     SetTextColor (hDC, GetSysColor(COLOR_WINDOWTEXT));
  344. /* draw next byte */
  345. szText[0] = szBuf[r+60];
  346. szText[1] = 0;
  347. cx += sz.cx;
  348. GetTextExtentPoint (hDC, szText, 1, &sz);
  349. TextOut (hDC, cx, LOWORD (y), szText, 3);
  350. }
  351.     }
  352. else
  353.     {
  354.     SetTextColor (hDC, GetSysColor(COLOR_WINDOWTEXT));
  355.     TextOut (hDC, xChar, LOWORD (y), szBuf, lstrlen (szBuf));
  356.     }
  357. pMem += 16;
  358. pOldMem += 16;
  359. y += yChar;
  360. }
  361.     /* paint last partial line if any (line with less than 16 bytes) */
  362.     if (lpmv->nExtraBytes)
  363. {
  364. GetBytesLine (pMem, i, lpmv->nBase, lpmv->nExtraBytes, szBuf);
  365. if (lpmvOld != NULL &&
  366.     ((int)pMem-(int)lpmv->lpMem + lpmv->nBase) >= lpmvOld->nBase &&
  367.     ((int)pMem-(int)lpmv->lpMem + lpmv->nBase) < (lpmvOld->nBase + lpmvOld->nSize) &&
  368.     !parcmp (pMem, pOldMem, lpmv->nExtraBytes, bRes))
  369.     {
  370.     /* write line number and leading space */
  371.     strncpy (szText, szBuf, 12);
  372.     szText[12] = 0;
  373.     GetTextExtentPoint (hDC, szText, 12, &sz);
  374.     cx = xChar;
  375.     SetTextColor (hDC, RGB (191, 0, 0));
  376.     TextOut (hDC, cx, LOWORD (y), szText, 12);
  377.     /* check each hex byte for change */
  378.     for (r=0; r<(UINT)lpmv->nExtraBytes; r++)
  379. {
  380. if (bRes[r])
  381.     SetTextColor (hDC, RGB (191, 0, 0));
  382. else
  383.     SetTextColor (hDC, GetSysColor(COLOR_WINDOWTEXT));
  384. /* draw next byte */
  385. szText[0] = szBuf[3*r+12];
  386. szText[1] = szBuf[3*r+1+12];
  387. szText[2] = szBuf[3*r+2+12];
  388. szText[3] = 0;
  389. cx += sz.cx;
  390. GetTextExtentPoint (hDC, szText, 3, &sz);
  391. TextOut (hDC, cx, LOWORD (y), szText, 3);
  392. }
  393.     /* check each ascii byte */
  394.     for (r=0; r<(UINT)lpmv->nExtraBytes; r++)
  395. {
  396. if (bRes[r])
  397.     SetTextColor (hDC, RGB (191, 0, 0));
  398. else
  399.     SetTextColor (hDC, GetSysColor(COLOR_WINDOWTEXT));
  400. /* draw next byte */
  401. szText[0] = szBuf[r+60];
  402. szText[1] = 0;
  403. cx += sz.cx;
  404. GetTextExtentPoint (hDC, szText, 1, &sz);
  405. TextOut (hDC, cx, LOWORD (y), szText, 1);
  406. }
  407.     }
  408. else
  409.     {
  410.     SetTextColor (hDC, GetSysColor(COLOR_WINDOWTEXT));
  411.     TextOut(hDC, xChar, y, szBuf, lstrlen (szBuf));
  412.     }
  413. }
  414.     SelectObject(hDC, GetStockObject(SYSTEM_FONT));
  415. }
  416. void  WINAPI GetBytesLine (
  417.     LPBYTE   pBytes,
  418.     UINT     LineNum,
  419.     DWORD    dwBase,
  420.     int      nBytes,
  421.     char     *szLine)
  422. {
  423.     int       j;
  424.     unsigned char    ch;
  425.     char      szAscii[18];
  426.     static BOOL      bDBCS;
  427.     if (NULL == pBytes) {
  428. bDBCS = FALSE;
  429. return;
  430.     }
  431.     wsprintf (szLine, "%#08lx  ", dwBase + (LineNum*16));
  432.         
  433.     for (j = 0; j < nBytes; j++)
  434. {
  435. ch = *pBytes++;
  436. wsprintf (szLine, "%s%02X ", (LPSTR)szLine, (WORD)ch);
  437. if (bDBCS)
  438.     {
  439.     szAscii[j] = (0 == j) ? '.' : ch;
  440.     bDBCS = FALSE;
  441.     }
  442. else if (IsDBCSLeadByte(ch))
  443.     {
  444.     szAscii[j] = ch;
  445.     bDBCS = TRUE;
  446.     }
  447. else
  448.     {
  449.     szAscii[j] = ((ch & 0x7F) >= ' ') ? ch : '.';
  450.     }
  451. }
  452.     if (bDBCS && 16 == nBytes)
  453. szAscii[j++] = *pBytes;
  454.     szAscii[j] = 0;
  455.     wsprintf(szLine, "%-59s%s", (LPSTR)szLine, (LPSTR)szAscii);
  456. }
  457. BOOL WINAPI parcmp (
  458.     LPBYTE    pMem,
  459.     LPBYTE    pOldMem,
  460.     int       nWidth,
  461.     LPBYTE    pRes)
  462. {
  463.     BOOL    bResult = TRUE;
  464.     int     i;
  465.     /* clear result array */
  466.     for (i=0; i<16; i++)
  467. pRes[i] = 0;
  468.     for (i=0; i<nWidth; i++)
  469. {
  470. if (pMem[i] ^ pOldMem[i])
  471.     {
  472.     pRes[i] = 1;
  473.     bResult = FALSE;
  474.     }
  475. }
  476.     return bResult;
  477. }
  478. BOOL WINAPI AddrDlgProc (
  479.     HWND      hDlg,
  480.     UINT      uMsg,
  481.     WPARAM    wParam,
  482.     LPARAM    lParam)
  483. {
  484.     BOOL    bRet = TRUE;
  485.     char    szAddr[MAX_PATH];
  486.     int     nAddr;
  487.     HWND    hAddr = GetDlgItem (hDlg, IDC_ADDR);
  488.     switch (uMsg)
  489. {
  490. case WM_INITDIALOG:
  491.     SetFocus (hAddr);
  492.     bRet = FALSE;
  493.     break;
  494. case WM_COMMAND:
  495.     switch (LOWORD (wParam))
  496. {
  497. case IDC_HEX:
  498.     if (HIWORD (wParam) == BN_CLICKED)
  499. {
  500. GetWindowText (hAddr, szAddr, MAX_PATH);
  501. if (SendMessage (GetDlgItem (hDlg, IDC_HEX), BM_GETCHECK, 0, 0))
  502.     {
  503.     /* convert to hex and return to control */
  504.     nAddr = atoi (szAddr);
  505.     wsprintf (szAddr, "%16x", nAddr);
  506.     SetWindowText (hAddr, szAddr);
  507.     }
  508. else
  509.     {
  510.     /* convert to decimal and return to control */
  511.     sscanf (szAddr, "%16x", &nAddr);
  512.     SetWindowText (hAddr, itoa (nAddr, szAddr, 10));
  513.     }
  514. /* select entire string for easy change */
  515. SendMessage (hAddr, EM_SETSEL, 0, (LONG)-1);
  516. SetFocus (hAddr);
  517. }
  518.     break;
  519. case IDOK:
  520.     GetWindowText (hAddr, szAddr, MAX_PATH);
  521.     /* if hex, convert to decimal integer */
  522.     if (SendMessage (GetDlgItem (hDlg, IDC_HEX), BM_GETCHECK, 0, 0))
  523. sscanf (szAddr, "%16x", &nAddr);
  524.     else
  525. nAddr = atoi (szAddr);
  526.     EndDialog (hDlg, nAddr);
  527.     break;
  528. case IDCANCEL:
  529.     EndDialog (hDlg, 0);
  530.     break;
  531. }
  532.     break;
  533. default:
  534.     bRet = FALSE;
  535. }
  536.     return (bRet);
  537. }