|
|
1.1 ! root 1: #include "pwalk.h" ! 2: ! 3: #define MAX_DRIVES 26 /* maximum number of logical drives */ ! 4: ! 5: /* system constants used externally */ ! 6: int xChar, ! 7: yChar, ! 8: xScreen, ! 9: yScreen, ! 10: yFrame, ! 11: xFrame, ! 12: yCaption, ! 13: xVScrollBar; ! 14: ! 15: char szCaptionText[] ="Address\0State\0Prot\0Size\0BaseAddr\0Object\0Section\0Name\0"; ! 16: char szFormat[] = "%08lX~%s ~%s ~%lu~%08lX~%s ~%s ~%s ~"; ! 17: SIZE sChar0; ! 18: char szFormatPages[] = "%05lX~%s ~%s ~%lu~%05lX~%s ~%s ~%s ~"; ! 19: int taColumns[] = {TA_RIGHT, TA_LEFT, TA_LEFT, TA_RIGHT, ! 20: TA_RIGHT, TA_RIGHT, TA_LEFT, TA_LEFT, ! 21: }; ! 22: int xColumns[] = { 8, 9, 17, 31, ! 23: 40, 46, 47, 55, ! 24: }; ! 25: BOOL bNumbersAsBytes = TRUE; ! 26: HFONT hFontVar; ! 27: ! 28: char szFilePath[MAX_PATH] = ""; ! 29: char szFilename[MAX_PATH] = ""; ! 30: HFONT hFont; ! 31: LPVOID lpWalkerList = NULL; ! 32: int *Objects; ! 33: int nSortType = IDM_SORTADDRESS; ! 34: HWND hWndSysStat, hWndProStat, hInitDlg, hMemWnd; ! 35: HANDLE hChildEvents[nDEBUGEVENTS]; ! 36: DBGPROCESS *lpChildProcess = NULL; ! 37: HMENU hPopup[MENUPOPUPS]; ! 38: char szCurPath[MAX_PATH]; ! 39: ! 40: ! 41: /* local functions */ ! 42: BOOL WINAPI InitEnvironment (HANDLE, int, char *); ! 43: void WINAPI InitMenu (HWND); ! 44: void WINAPI DrawListItem (DRAWITEMSTRUCT *); ! 45: int WINAPI MakeVMQString (int, char *); ! 46: DWORD WINAPI VMExceptionFilter (EXCEPTION_POINTERS *); ! 47: void WINAPI SortList (HWND, int); ! 48: BOOL WINAPI ViewableMemorySelection (HWND); ! 49: static void TextOutFields (HDC, int, LPRECT, LPSTR); ! 50: ! 51: ! 52: /* entry point of this executable */ ! 53: int WINAPI WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow) ! 54: HINSTANCE hInstance; ! 55: HINSTANCE hPrevInstance; ! 56: LPSTR lpCmdLine; ! 57: int nCmdShow; ! 58: { ! 59: MSG msg; ! 60: char *lpszCmdLine = NULL; ! 61: char *lpCL; ! 62: BOOL bSwitch; ! 63: ! 64: /* set current path for use later */ ! 65: GetCurrentDirectory (MAX_PATH, szCurPath); ! 66: ! 67: // parse and copy command line parameters to local memory ! 68: lpCL = GetCommandLine (); ! 69: if (lpszCmdLine = (char *)LocalAlloc (LPTR, strlen (lpCL) + 1)) ! 70: GetCmdLine (lpCL, lpszCmdLine, &bSwitch); ! 71: ! 72: /* start window environment */ ! 73: if (!InitEnvironment (hInstance, nCmdShow, IsValidFile (lpszCmdLine) ? lpszCmdLine : NULL)) ! 74: return FALSE; ! 75: ! 76: /* free memory allocated for lpCmdLine */ ! 77: if (lpszCmdLine) ! 78: LocalFree ((HLOCAL)lpszCmdLine); ! 79: ! 80: /* main window message loop */ ! 81: while (GetMessage (&msg, NULL, 0, 0)) ! 82: { ! 83: TranslateMessage (&msg); ! 84: DispatchMessage (&msg); ! 85: } ! 86: ! 87: /* return success of application */ ! 88: return TRUE; ! 89: } ! 90: ! 91: ! 92: ! 93: /* start app */ ! 94: BOOL WINAPI InitEnvironment ( ! 95: HANDLE hInstance, ! 96: int nCmdShow, ! 97: char *lpszCmdLine) ! 98: { ! 99: WNDCLASS wc; ! 100: char szClass[MAX_PATH]; ! 101: char szTitle[MAX_PATH]; ! 102: char szFilename[MAX_PATH]; ! 103: HWND hWnd; ! 104: ! 105: ! 106: /* register system statistics window class */ ! 107: LoadString (hInstance, IDS_SYSSTATCLASS, szClass, sizeof (szClass)); ! 108: wc.style = 0; ! 109: wc.lpfnWndProc = (WNDPROC)SysStatWndProc; ! 110: wc.cbClsExtra = 0; ! 111: wc.cbWndExtra = 0; ! 112: wc.hInstance = hInstance; ! 113: wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDR_SYSSTATICON)); ! 114: wc.hCursor = LoadCursor (0, IDC_ARROW); ! 115: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ! 116: wc.lpszMenuName = NULL; ! 117: wc.lpszClassName = szClass; ! 118: if (!RegisterClass (&wc) ) ! 119: return FALSE; ! 120: ! 121: /* register process statistics window class */ ! 122: LoadString (hInstance, IDS_PROSTATCLASS, szClass, sizeof (szClass)); ! 123: wc.style = 0; ! 124: wc.lpfnWndProc = (WNDPROC)ProStatWndProc; ! 125: wc.cbClsExtra = 0; ! 126: wc.cbWndExtra = 0; ! 127: wc.hInstance = hInstance; ! 128: wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDR_PROSTATICON)); ! 129: wc.hCursor = LoadCursor (0, IDC_ARROW); ! 130: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ! 131: wc.lpszMenuName = NULL; ! 132: wc.lpszClassName = szClass; ! 133: if (!RegisterClass (&wc) ) ! 134: return FALSE; ! 135: ! 136: /* register the status bar window class */ ! 137: LoadString (hInstance, IDS_STATUSCLASS, szClass, sizeof (szClass)); ! 138: wc.style = 0; ! 139: wc.lpfnWndProc = (WNDPROC)StatusWndProc; ! 140: wc.cbClsExtra = 0; ! 141: wc.cbWndExtra = STATUSWXB; ! 142: wc.hInstance = hInstance; ! 143: wc.hIcon = (HICON)NULL; ! 144: wc.hCursor = LoadCursor (0, IDC_ARROW); ! 145: wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); ! 146: wc.lpszMenuName = NULL; ! 147: wc.lpszClassName = szClass; ! 148: if (!RegisterClass (&wc) ) ! 149: return FALSE; ! 150: ! 151: /* register the main frame window class */ ! 152: LoadString (hInstance, IDS_MEMVIEWCLASS, szClass, sizeof (szClass)); ! 153: wc.style = 0; ! 154: wc.lpfnWndProc = (WNDPROC)MemWndProc; ! 155: wc.cbClsExtra = 0; ! 156: wc.cbWndExtra = VIEWWXB; ! 157: wc.hInstance = hInstance; ! 158: wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDR_MAINICON)); ! 159: wc.hCursor = LoadCursor (0, IDC_ARROW); ! 160: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ! 161: wc.lpszMenuName = NULL; ! 162: wc.lpszClassName = szClass; ! 163: if (!RegisterClass (&wc) ) ! 164: return FALSE; ! 165: ! 166: /* register the main frame window class */ ! 167: LoadString (hInstance, IDS_WALKERCLASS, szClass, sizeof (szClass)); ! 168: wc.style = 0; ! 169: wc.lpfnWndProc = (WNDPROC)WalkerWndProc; ! 170: wc.cbClsExtra = 0; ! 171: wc.cbWndExtra = 0; ! 172: wc.hInstance = hInstance; ! 173: wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDR_MAINICON)); ! 174: wc.hCursor = LoadCursor (0, IDC_ARROW); ! 175: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ! 176: wc.lpszMenuName = MAKEINTRESOURCE (IDR_WALKERMENU); ! 177: wc.lpszClassName = szClass; ! 178: if (!RegisterClass (&wc) ) ! 179: return FALSE; ! 180: ! 181: /* create window caption */ ! 182: LoadString (hInstance, IDS_CAPTION, szTitle, sizeof (szTitle)); ! 183: if (lpszCmdLine != NULL && ! 184: ((lpChildProcess = StartChildProcess (NULL, lpszCmdLine, hChildEvents)) != NULL)) ! 185: GetFileFromPath (lpszCmdLine, szFilename); ! 186: else ! 187: LoadString (hInstance, IDS_SELF, szFilename, MAX_PATH); ! 188: strcat (szTitle, szFilename); ! 189: ! 190: /* create main frame window */ ! 191: hWnd = CreateWindow (szClass, ! 192: szTitle, ! 193: WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, ! 194: CW_USEDEFAULT, ! 195: 0, ! 196: CW_USEDEFAULT, ! 197: 0, ! 198: NULL, ! 199: NULL, ! 200: hInstance, ! 201: NULL); ! 202: ! 203: /* update parent window handle in child process information structure */ ! 204: if (lpChildProcess != NULL) ! 205: lpChildProcess->hWnd = hWnd; ! 206: ! 207: if (!hWnd) ! 208: return 0; ! 209: ! 210: ShowWindow (hWnd, nCmdShow); ! 211: UpdateWindow (hWnd); ! 212: } ! 213: ! 214: ! 215: /* main window procedure */ ! 216: LONG WINAPI WalkerWndProc ( ! 217: HWND hWnd, ! 218: UINT uMsg, ! 219: WPARAM wParam, ! 220: LPARAM lParam) ! 221: { ! 222: LONG lRet = 1; ! 223: static LOGFONT lf_Font = { ! 224: -10, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, ! 225: OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ! 226: DEFAULT_QUALITY, FIXED_PITCH | FF_DONTCARE, ! 227: "Courier", ! 228: }; ! 229: static LOGFONT lf_FontVar = { ! 230: -10, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, ! 231: OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ! 232: DEFAULT_QUALITY, 0, // FIXED_PITCH | FF_DONTCARE, ! 233: "MS Sans Serif", ! 234: }; ! 235: ! 236: switch (uMsg) ! 237: { ! 238: /* initialize menu before drawing */ ! 239: case WM_INITMENU: ! 240: InitMenu (hWnd); ! 241: break; ! 242: ! 243: /* display status messages for menu commands */ ! 244: case WM_MENUSELECT: ! 245: { ! 246: char *lpszMenuString; ! 247: ! 248: lpszMenuString = LocalAlloc (LPTR, MAX_PATH); ! 249: ! 250: if (HIWORD (wParam) == 0xFFFF) ! 251: { ! 252: LocalFree (lpszMenuString); ! 253: lpszMenuString = NULL; ! 254: } ! 255: ! 256: else if (HIWORD (wParam) & MF_POPUP) ! 257: { ! 258: int i; ! 259: HMENU hPopupMenu = GetSubMenu ((HMENU)lParam, LOWORD (wParam)); ! 260: ! 261: lpszMenuString = LocalAlloc (LPTR, MAX_PATH); ! 262: ! 263: for (i=0; i<MENUPOPUPS; i++) ! 264: { ! 265: if (hPopup[i] == hPopupMenu) ! 266: { ! 267: LoadString (GetModuleHandle (NULL), ! 268: i+IDM_POPUPMENUS, ! 269: lpszMenuString, ! 270: MAX_PATH); ! 271: break; ! 272: } ! 273: } ! 274: } ! 275: else ! 276: LoadString (GetModuleHandle (NULL), ! 277: LOWORD (wParam), ! 278: lpszMenuString, ! 279: MAX_PATH); ! 280: ! 281: /* send the status string, gray if necessary */ ! 282: SendMessage (GetDlgItem (hWnd, IDC_STATUSWND), ! 283: WM_SETTEXT, ! 284: (HIWORD (wParam) & MF_GRAYED) ? ! 285: (LPARAM)GetSysColor (COLOR_GRAYTEXT): ! 286: 0, ! 287: (WPARAM)lpszMenuString); ! 288: ! 289: LocalFree (lpszMenuString); ! 290: } ! 291: break; ! 292: ! 293: case WM_CREATE: ! 294: { ! 295: HCURSOR hOldCursor; ! 296: HDC hDC; ! 297: TEXTMETRIC tm; ! 298: char szWndClass[MAX_PATH]; ! 299: HWND hList, hStatus; ! 300: int i=0, j, k; ! 301: HMENU hMenu; ! 302: ! 303: /* build array of popup menu handles */ ! 304: hMenu = GetMenu (hWnd); ! 305: for (k=0; k<MENUPOPUPS-(i-1); k++) ! 306: { ! 307: hPopup[i] = GetSubMenu (hMenu, k); ! 308: j=0; ! 309: while ((hPopup[i+j+1] = GetSubMenu (hPopup[i], j)) != NULL) ! 310: j++; ! 311: if (j) ! 312: i+=j; ! 313: i++; ! 314: } ! 315: ! 316: /* put hourglass cursor up */ ! 317: hOldCursor = (HCURSOR)SetClassLong (hWnd, GCL_HCURSOR, 0); ! 318: SetCursor (LoadCursor (0, IDC_WAIT)); ! 319: ! 320: hDC = GetDC(hWnd); ! 321: ! 322: /* want a font with point size of 10 (smallest size it comes in) */ ! 323: lf_Font.lfHeight = -(10 * GetDeviceCaps(hDC, LOGPIXELSY)/72); ! 324: hFont = CreateFontIndirect(&lf_Font); ! 325: hFontVar = CreateFontIndirect(&lf_FontVar); ! 326: ! 327: ! 328: // find the width of a '0' in the variable font ! 329: // ! 330: SelectObject(hDC, hFontVar); ! 331: GetTextExtentPoint (hDC, "0", 1, &sChar0); ! 332: ! 333: SelectObject(hDC, hFont); ! 334: ! 335: /* initialize system constants */ ! 336: GetTextMetrics(hDC, &tm); ! 337: yChar = tm.tmHeight; ! 338: xChar = tm.tmAveCharWidth; ! 339: xScreen = GetSystemMetrics(SM_CXSCREEN); ! 340: yScreen = GetSystemMetrics(SM_CYSCREEN); ! 341: yFrame = GetSystemMetrics(SM_CYFRAME); ! 342: xFrame = GetSystemMetrics(SM_CXFRAME); ! 343: yCaption = GetSystemMetrics(SM_CYCAPTION); ! 344: xVScrollBar = GetSystemMetrics(SM_CXVSCROLL); ! 345: ! 346: SelectObject(hDC, GetStockObject(SYSTEM_FONT)); ! 347: ReleaseDC(hWnd, hDC); ! 348: ! 349: /* create listbox for client area */ ! 350: LoadString (GetModuleHandle (NULL), ! 351: IDS_LISTBOX, ! 352: szWndClass, ! 353: sizeof (szWndClass)); ! 354: hList = CreateWindow (szWndClass, ! 355: NULL, ! 356: WS_CHILD | WS_VISIBLE | WS_VSCROLL | ! 357: LBS_EXTENDEDSEL | LBS_NOTIFY | LBS_OWNERDRAWFIXED | ! 358: LBS_WANTKEYBOARDINPUT | LBS_NOINTEGRALHEIGHT, ! 359: 0, 0, 0, 0, ! 360: hWnd, ! 361: (HMENU)IDC_LISTBOX, ! 362: GetModuleHandle (NULL), ! 363: NULL); ! 364: ! 365: /* if listbox failed, abort app */ ! 366: if (!IsWindow (hList)) ! 367: DestroyWindow(hWnd); ! 368: SendMessage (hList, WM_SETFONT, (WPARAM)hFontVar, 0L); ! 369: ! 370: /* create status window for client area */ ! 371: LoadString (GetModuleHandle (NULL), ! 372: IDS_STATUSCLASS, ! 373: szWndClass, ! 374: sizeof (szWndClass)); ! 375: if (!(hStatus = CreateWindow (szWndClass, ! 376: NULL, ! 377: WS_CHILD | WS_VISIBLE | WS_BORDER, ! 378: 0, 0, 0, 0, ! 379: hWnd, ! 380: (HMENU)IDC_STATUSWND, ! 381: GetModuleHandle (NULL), ! 382: NULL))) ! 383: ReportError (IDS_ERRCREATEWINDOW); ! 384: ! 385: /* initialize status window */ ! 386: SendMessage (GetDlgItem (hWnd, IDC_STATUSWND), ! 387: UM_UPDATE, ! 388: (WPARAM)lpChildProcess, ! 389: 0); ! 390: ! 391: /* if child process post message to display initialization dialog */ ! 392: if (lpChildProcess != NULL) ! 393: PostMessage (hWnd, UM_STARTINITDIALOG, 0, 0); ! 394: ! 395: /* remove hourglass cursor */ ! 396: SetClassLong (hWnd, GCL_HCURSOR, (LONG)hOldCursor); ! 397: SetCursor (hOldCursor); ! 398: } ! 399: break; ! 400: ! 401: case UM_STARTINITDIALOG: ! 402: /* start modal initializing information window */ ! 403: DialogBoxParam (GetModuleHandle (NULL), ! 404: (char *)IDD_INITIALIZING, ! 405: hWnd, ! 406: InitDlgProc, ! 407: (LPARAM)&hInitDlg); ! 408: hInitDlg = NULL; ! 409: break; ! 410: ! 411: case WM_SETFOCUS: ! 412: /* keep focus in listbox when possible */ ! 413: SetFocus (GetDlgItem (hWnd, IDC_LISTBOX)); ! 414: break; ! 415: ! 416: case WM_MEASUREITEM: ! 417: ((MEASUREITEMSTRUCT FAR *)lParam)->itemHeight = yChar; ! 418: break; ! 419: ! 420: case WM_DRAWITEM: ! 421: DrawListItem ((DRAWITEMSTRUCT FAR *)lParam); ! 422: break; ! 423: ! 424: case WM_PAINT: ! 425: { ! 426: PAINTSTRUCT ps; ! 427: RECT rc; ! 428: ! 429: /* draw the caption line above the list box */ ! 430: BeginPaint(hWnd, &ps); ! 431: SetRect(&rc, 0, 0, GetSystemMetrics (SM_CXSCREEN), yChar); ! 432: ! 433: SelectObject(ps.hdc, hFontVar); ! 434: SetTextColor(ps.hdc, GetSysColor(COLOR_CAPTIONTEXT)); ! 435: SetBkColor(ps.hdc, GetSysColor(COLOR_ACTIVECAPTION)); ! 436: TextOutFields (ps.hdc, 6, &rc, szCaptionText); ! 437: SelectObject(ps.hdc, GetStockObject(SYSTEM_FONT)); ! 438: EndPaint(hWnd, &ps); ! 439: } ! 440: break; ! 441: ! 442: case WM_SIZE: ! 443: /* size listbox and status bar */ ! 444: if ((wParam == SIZE_RESTORED) || (wParam == SIZE_MAXIMIZED)) ! 445: { ! 446: int yBorder = GetSystemMetrics (SM_CYBORDER); ! 447: int xBorder = GetSystemMetrics (SM_CXBORDER); ! 448: int yStatus = yChar + 10*yBorder; ! 449: ! 450: /* size listbox */ ! 451: MoveWindow(GetDlgItem (hWnd, IDC_LISTBOX), ! 452: 0, ! 453: yChar, ! 454: LOWORD(lParam), ! 455: HIWORD(lParam)-(yChar + yStatus - yBorder), ! 456: TRUE); ! 457: ! 458: /* size status bar */ ! 459: MoveWindow(GetDlgItem (hWnd, IDC_STATUSWND), ! 460: 0-xBorder, ! 461: HIWORD(lParam)-yStatus+yBorder, ! 462: LOWORD(lParam) + 2*xBorder, ! 463: yStatus, ! 464: TRUE); ! 465: } ! 466: break; ! 467: ! 468: case WM_COMMAND: ! 469: { ! 470: switch (LOWORD (wParam)) ! 471: { ! 472: case IDM_EXIT: ! 473: SendMessage (hWnd, WM_CLOSE, 0, 0); ! 474: break; ! 475: ! 476: case IDM_PROCESSUNLOAD: ! 477: { ! 478: char szFilename[MAX_PATH]; ! 479: char szTitle[MAX_PATH]; ! 480: HWND hViewWnd = NULL; ! 481: ! 482: /* close child process */ ! 483: CloseChildProcess (lpChildProcess, hChildEvents); ! 484: lpChildProcess = NULL; ! 485: SendMessage (GetDlgItem (hWnd, IDC_LISTBOX), LB_RESETCONTENT, 0, 0); ! 486: SendMessage (GetDlgItem (hWnd, IDC_STATUSWND), ! 487: UM_UPDATE, ! 488: 0, ! 489: 0); ! 490: ! 491: /* reset caption */ ! 492: LoadString (GetModuleHandle (NULL), ! 493: IDS_CAPTION, ! 494: szTitle, ! 495: MAX_PATH); ! 496: LoadString (GetModuleHandle (NULL), ! 497: IDS_SELF, ! 498: szFilename, ! 499: MAX_PATH); ! 500: strcat (szTitle, szFilename); ! 501: SetWindowText (hWnd, szTitle); ! 502: ! 503: if (IsWindow (hWndSysStat)) ! 504: { ! 505: InvalidateRect (hWndSysStat, NULL, TRUE); ! 506: UpdateWindow (hWndSysStat); ! 507: } ! 508: ! 509: if (IsWindow (hWndProStat)) ! 510: DestroyWindow (hWndProStat); ! 511: ! 512: while ((hViewWnd = EnumViewWindows (hWnd, hViewWnd)) != NULL) ! 513: DestroyWindow (hViewWnd); ! 514: } ! 515: break; ! 516: ! 517: case IDM_PROCESSLOAD: ! 518: { ! 519: char szTitle[MAX_PATH]; ! 520: char szFilePath[MAX_PATH]; ! 521: HWND hViewWnd = NULL; ! 522: ! 523: /* detaching from old process, okay?? */ ! 524: if (lpChildProcess != NULL) ! 525: { ! 526: strcpy (szTitle, "Detach from process "); ! 527: strcat (szTitle, lpChildProcess->szModule); ! 528: strcat (szTitle, "?"); ! 529: ! 530: LoadString (GetModuleHandle (NULL), ! 531: IDS_WALKERCLASS, ! 532: szFilePath, ! 533: MAX_PATH); ! 534: if (IDYES != MessageBox (hWnd, ! 535: szTitle, ! 536: szFilePath, ! 537: MB_YESNO | MB_ICONQUESTION)) ! 538: break; ! 539: } ! 540: ! 541: /* call open file dialog to get filename of exe, and validate */ ! 542: *szFilePath = 0; ! 543: if (GetFileName (hWnd, szFilePath, NULL)) ! 544: { ! 545: if (IsValidFile (szFilePath)) ! 546: { ! 547: if (lpChildProcess != NULL) ! 548: { ! 549: /* close any open view windows for this process */ ! 550: while ((hViewWnd = EnumViewWindows (hWnd, hViewWnd)) != NULL) ! 551: DestroyWindow (hViewWnd); ! 552: ! 553: CloseChildProcess (lpChildProcess, hChildEvents); ! 554: SendMessage (GetDlgItem (hWnd, IDC_LISTBOX), ! 555: LB_RESETCONTENT, ! 556: 0, ! 557: 0); ! 558: SendMessage (GetDlgItem (hWnd, IDC_STATUSWND), ! 559: UM_UPDATE, ! 560: 0, ! 561: 0); ! 562: } ! 563: ! 564: if ((lpChildProcess = ! 565: StartChildProcess (hWnd, szFilePath, hChildEvents)) != NULL) ! 566: { ! 567: /* force rewalk of process */ ! 568: PostMessage (hWnd, UM_STARTINITDIALOG, 0, 0); ! 569: SendMessage (GetDlgItem (hWnd, IDC_STATUSWND), ! 570: UM_UPDATE, ! 571: (WPARAM)lpChildProcess, ! 572: 0); ! 573: ! 574: /* load new window caption */ ! 575: LoadString (GetModuleHandle (NULL), ! 576: IDS_CAPTION, ! 577: szTitle, ! 578: MAX_PATH); ! 579: ! 580: GetFileFromPath (szFilePath, szFilename); ! 581: strcat (szTitle, szFilename); ! 582: SetWindowText (hWnd, szTitle); ! 583: } ! 584: } ! 585: } ! 586: } ! 587: break; ! 588: ! 589: case IDM_PROCESSREWALK: ! 590: { ! 591: HWND hList = GetDlgItem (hWnd, IDC_LISTBOX); ! 592: int nCnt, nNewCnt, i; ! 593: LPVOID lpNewList=NULL, lpTempList=NULL; ! 594: HWND hViewWnd = NULL; ! 595: ! 596: ! 597: /* clear listbox of current contents, but first find out how many exist */ ! 598: nCnt = SendMessage (hList, LB_GETCOUNT, 0, 0); ! 599: SendMessage (hList, WM_SETREDRAW, 0, 0); ! 600: SendMessage (hList, LB_RESETCONTENT, 0, 0); ! 601: ! 602: /* walk process address space */ ! 603: if (lpChildProcess != NULL) ! 604: { ! 605: nNewCnt = WalkProcess (lpChildProcess->hProcess, &lpNewList, &Objects); ! 606: AnalyzeProcess (lpChildProcess, (LPVMOBJECT)lpNewList, nNewCnt); ! 607: ! 608: /* indentify which objects are new */ ! 609: if (nCnt) ! 610: IdentifyNewObjects (lpWalkerList, nCnt, lpNewList, nNewCnt); ! 611: ! 612: /* free old list and update cnt */ ! 613: lpTempList = lpWalkerList; ! 614: lpWalkerList = lpNewList; ! 615: VirtualFree (lpTempList, TOTALVMRESERVE, MEM_DECOMMIT); ! 616: VirtualFree (lpTempList, 0, MEM_RELEASE); ! 617: nCnt = nNewCnt; ! 618: } ! 619: ! 620: for (i=0; i<nCnt; i++) ! 621: SendMessage (hList, LB_ADDSTRING, 0, i); ! 622: ! 623: /* sort if other than by address is selected */ ! 624: if (nSortType != IDM_SORTADDRESS) ! 625: SortList (hList, nSortType); ! 626: ! 627: /* reenable redraw of listbox */ ! 628: SendMessage (hList, WM_SETREDRAW, 1, 0); ! 629: InvalidateRect (hList, NULL, TRUE); ! 630: UpdateWindow (hList); ! 631: ! 632: /* if any memory view windows, send update message */ ! 633: while ((hViewWnd = EnumViewWindows (hWnd, hViewWnd)) != NULL) ! 634: { ! 635: LPMEMVIEW pmv, pmvOld; ! 636: int nAddress, nSize; ! 637: MEMORY_BASIC_INFORMATION mbi; ! 638: char *szCaption; ! 639: ! 640: /* retrieve view memory range */ ! 641: szCaption = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, MAX_PATH); ! 642: GetWindowText (hViewWnd, szCaption, MAX_PATH); ! 643: ! 644: /* validate range */ ! 645: sscanf (strtok (szCaption, "-"), "%8x", &nAddress); ! 646: sscanf (strtok (NULL, " \0"), "%8x", &nSize); ! 647: nSize -= nAddress; ! 648: VirtualQueryEx (lpChildProcess->hProcess, ! 649: (LPVOID)nAddress, ! 650: &mbi, ! 651: sizeof (MEMORY_BASIC_INFORMATION)); ! 652: ! 653: if (mbi.State != MEM_COMMIT) ! 654: { ! 655: NotifyUser (hWnd, IDS_ERROR, IDS_NOTCOMMITTEDMEMORY, NULL, 0); ! 656: DestroyWindow (hViewWnd); ! 657: goto NOT; ! 658: } ! 659: ! 660: /* if size of committed region changed, update caption */ ! 661: if (mbi.RegionSize != (DWORD)nSize) ! 662: { ! 663: wsprintf (szCaption, ! 664: "%4lx-%-4lx", ! 665: (DWORD)mbi.BaseAddress, ! 666: (DWORD)mbi.BaseAddress+mbi.RegionSize); ! 667: SetWindowText (hViewWnd, szCaption); ! 668: } ! 669: ! 670: /* free default heap memory */ ! 671: HeapFree (GetProcessHeap (), 0, szCaption); ! 672: ! 673: /* if an old view structure existed, release virtual memory */ ! 674: if ((pmvOld = (LPMEMVIEW)GetWindowLong (hViewWnd, WXB_LPOLDMEMVIEW)) != NULL) ! 675: VirtualFree (pmvOld->lpMem, 0, MEM_RELEASE); ! 676: ! 677: pmvOld = (LPMEMVIEW)GetWindowLong (hViewWnd, WXB_LPMEMVIEW); ! 678: /* save past pmv for update comparison */ ! 679: SetWindowLong (hViewWnd, ! 680: WXB_LPOLDMEMVIEW, ! 681: (LONG)pmvOld); ! 682: ! 683: /* allocate memory structure for view memory object */ ! 684: pmv = (LPMEMVIEW)LocalAlloc (LPTR, sizeof (MEMVIEW)); ! 685: ! 686: /* copy old mem view to new mem view */ ! 687: for (i=0; i<sizeof (MEMVIEW); i++) ! 688: ((LPBYTE)pmv)[i] = ((LPBYTE)pmvOld)[i]; ! 689: ! 690: /* update structure for new mem structure */ ! 691: pmv->nBase = (int)mbi.BaseAddress; ! 692: pmv->nSize = (int)mbi.RegionSize; ! 693: ! 694: if ((pmv->lpMem = VirtualAlloc (NULL, pmv->nSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) ! 695: { ! 696: ReportError (IDS_ERRVIRTUALALLOC); ! 697: DestroyWindow (hViewWnd); ! 698: } ! 699: ! 700: else if (AccessProcessMemory (hChildEvents[READMEMORY], ! 701: hChildEvents[ACKNOWLEDGE], ! 702: (LPVOID)nAddress, ! 703: pmv->lpMem, ! 704: &(pmv->nSize)) && pmv->nSize) ! 705: { ! 706: pmv->nLines = (pmv->nSize+15)/16; ! 707: pmv->nExtraBytes = (pmv->nSize & 0x0000000F); ! 708: SetWindowLong (hViewWnd, WXB_LPMEMVIEW, (LONG)pmv); ! 709: ! 710: /* post message to view window to update */ ! 711: PostMessage (hViewWnd, UM_UPDATE, 0, 0); ! 712: } ! 713: ! 714: else ! 715: { ! 716: NotifyUser (hWnd, IDS_ERROR, IDS_COULDNOTREADPROCESS, NULL, 0); ! 717: DestroyWindow (hViewWnd); ! 718: } ! 719: ! 720: } ! 721: ! 722: NOT: ! 723: /* if initialization dialog, send notification to remove */ ! 724: if (IsWindow (hInitDlg)) ! 725: PostMessage (hInitDlg, UM_ENDDIALOG, 0, 0); ! 726: } ! 727: break; ! 728: ! 729: case IDM_PROCESSSUSPEND: ! 730: SetEvent (hChildEvents[SUSPENDDEBUGGER]); ! 731: break; ! 732: ! 733: case IDM_PROCESSRESUME: ! 734: SetEvent (hChildEvents[RESUMEDEBUGGER]); ! 735: break; ! 736: ! 737: case IDM_VIEWSYSSTAT: ! 738: /* if window exists, destroy it */ ! 739: if (IsWindow (hWndSysStat)) ! 740: { ! 741: DestroyWindow (hWndSysStat); ! 742: CheckMenuItem (GetMenu (hWnd), wParam, MF_UNCHECKED); ! 743: } ! 744: else ! 745: { ! 746: char szClass[100]; ! 747: char szTitle[100]; ! 748: RECT rc; ! 749: ! 750: GetWindowRect (hWnd, &rc); ! 751: LoadString (GetModuleHandle (NULL), IDS_SYSSTATCLASS, szClass, 100); ! 752: LoadString (GetModuleHandle (NULL), IDS_SYSSTATTITLE, szTitle, 100); ! 753: hWndSysStat = CreateWindow (szClass, ! 754: szTitle, ! 755: WS_POPUP | WS_CAPTION | WS_MINIMIZEBOX | ! 756: WS_SYSMENU | WS_DLGFRAME | WS_VISIBLE, ! 757: rc.left+50, rc.top+50, 500, 270, ! 758: hWnd, ! 759: NULL, ! 760: GetModuleHandle (NULL), ! 761: NULL); ! 762: UpdateWindow (hWndSysStat); ! 763: ShowWindow (hWndSysStat, SW_SHOWNORMAL); ! 764: CheckMenuItem (GetMenu (hWnd), wParam, MF_CHECKED); ! 765: } ! 766: break; ! 767: ! 768: case IDM_VIEWPROSTAT: ! 769: /* if window exists, destroy it */ ! 770: if (IsWindow (hWndProStat)) ! 771: { ! 772: DestroyWindow (hWndProStat); ! 773: CheckMenuItem (GetMenu (hWnd), wParam, MF_UNCHECKED); ! 774: } ! 775: else ! 776: { ! 777: char szClass[100]; ! 778: char szTitle[100]; ! 779: RECT rc; ! 780: ! 781: GetWindowRect (hWnd, &rc); ! 782: LoadString (GetModuleHandle (NULL), IDS_PROSTATCLASS, szClass, 100); ! 783: LoadString (GetModuleHandle (NULL), IDS_PROSTATTITLE, szTitle, 100); ! 784: hWndProStat = CreateWindow (szClass, ! 785: szTitle, ! 786: WS_POPUP | WS_CAPTION | WS_MINIMIZEBOX | ! 787: WS_SYSMENU | WS_DLGFRAME | WS_VISIBLE, ! 788: rc.left+75, rc.top+75, 355, 120, ! 789: hWnd, ! 790: NULL, ! 791: GetModuleHandle (NULL), ! 792: NULL); ! 793: UpdateWindow (hWndProStat); ! 794: ShowWindow (hWndProStat, SW_SHOWNORMAL); ! 795: CheckMenuItem (GetMenu (hWnd), wParam, MF_CHECKED); ! 796: } ! 797: break; ! 798: ! 799: /* accept bouble click messages from listbox only */ ! 800: case IDC_LISTBOX: ! 801: if (HIWORD (wParam) != LBN_DBLCLK) ! 802: break; ! 803: ! 804: case IDM_VIEWMEMORY: ! 805: if (ViewableMemorySelection (hWnd)) ! 806: { ! 807: char szBuff[50]; ! 808: HWND hList = GetDlgItem (hWnd, IDC_LISTBOX); ! 809: int iCaret = SendMessage (hList, LB_GETCARETINDEX, 0, 0); ! 810: DWORD nAddress = ! 811: (DWORD)((LPVMOBJECT)lpWalkerList)[Objects[iCaret]].mbi.BaseAddress; ! 812: int nSize = ((LPVMOBJECT)lpWalkerList)[Objects[iCaret]].mbi.RegionSize; ! 813: LPVOID lpMem; ! 814: HCURSOR hOldCursor; ! 815: ! 816: if ((lpMem = VirtualAlloc (NULL, nSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) ! 817: { ! 818: ReportError (IDS_ERRVIRTUALALLOC); ! 819: break; ! 820: } ! 821: ! 822: /* put wait cursor up */ ! 823: hOldCursor = (HCURSOR)SetClassLong (hWnd, GCL_HCURSOR, 0); ! 824: SetCursor (LoadCursor (0, IDC_WAIT)); ! 825: ! 826: /* signal debugger thread to read process memory */ ! 827: if (AccessProcessMemory (hChildEvents[READMEMORY], ! 828: hChildEvents[ACKNOWLEDGE], ! 829: (LPVOID)nAddress, ! 830: lpMem, ! 831: &nSize) && nSize) ! 832: { ! 833: wsprintf (szBuff, "%4lx-%-4lx", nAddress, nAddress+nSize); ! 834: ViewMemory (hWnd, szBuff, lpMem, nSize, nAddress); ! 835: ! 836: /* if first view window, add separator */ ! 837: if (GetMenuItemCount (GetSubMenu (GetMenu (hWnd), 2)) == 4) ! 838: AppendMenu (GetSubMenu (GetMenu (hWnd), 2), ! 839: MF_SEPARATOR, ! 840: 0, ! 841: NULL); ! 842: ! 843: AppendMenu (GetSubMenu (GetMenu (hWnd), 2), ! 844: MF_STRING | MF_CHECKED, ! 845: AddAtom (szBuff), ! 846: szBuff); ! 847: } ! 848: ! 849: else ! 850: NotifyUser (hWnd, IDS_ERROR, IDS_COULDNOTREADPROCESS, NULL, 0); ! 851: ! 852: ! 853: /* replace wait cursor with old cursor */ ! 854: SetClassLong (hWnd, GCL_HCURSOR, (LONG)hOldCursor); ! 855: SetCursor (hOldCursor); ! 856: } ! 857: else ! 858: { ! 859: NotifyUser (hWnd, IDS_ERROR, IDS_NOTCOMMITTEDMEMORY, NULL, 0); ! 860: break; ! 861: } ! 862: break; ! 863: ! 864: case IDM_VIEWADDRESS: ! 865: { ! 866: int nAddress; ! 867: MEMORY_BASIC_INFORMATION mbi; ! 868: LPVOID lpMem; ! 869: char szBuff[MAX_PATH]; ! 870: int nLine; ! 871: HWND hViewWnd; ! 872: ! 873: ! 874: if (nAddress = DialogBox (GetModuleHandle (NULL), (char *)IDD_ADDR, hWnd, AddrDlgProc)) ! 875: { ! 876: VirtualQueryEx (lpChildProcess->hProcess, ! 877: (LPVOID)nAddress, ! 878: &mbi, ! 879: sizeof (MEMORY_BASIC_INFORMATION)); ! 880: ! 881: if (mbi.State != MEM_COMMIT) ! 882: { ! 883: NotifyUser (hWnd, IDS_ERROR, IDS_NOTCOMMITTEDMEMORY, NULL, 0); ! 884: break; ! 885: } ! 886: ! 887: if ((lpMem = VirtualAlloc (NULL, mbi.RegionSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) ! 888: { ! 889: ReportError (IDS_ERRVIRTUALALLOC); ! 890: break; ! 891: } ! 892: ! 893: /* signal debugger thread to read process memory */ ! 894: if (AccessProcessMemory (hChildEvents[READMEMORY], ! 895: hChildEvents[ACKNOWLEDGE], ! 896: (LPVOID)mbi.BaseAddress, ! 897: lpMem, ! 898: &(mbi.RegionSize)) && mbi.RegionSize) ! 899: { ! 900: wsprintf (szBuff, ! 901: "%4lx-%-4lx", ! 902: (int)mbi.BaseAddress, ! 903: (int)mbi.BaseAddress+mbi.RegionSize); ! 904: ! 905: hViewWnd = ViewMemory (hWnd, szBuff, lpMem, mbi.RegionSize, (int)mbi.BaseAddress); ! 906: ! 907: /* if first view window, add separator */ ! 908: if (GetMenuItemCount (GetSubMenu (GetMenu (hWnd), 2)) == 4) ! 909: AppendMenu (GetSubMenu (GetMenu (hWnd), 2), ! 910: MF_SEPARATOR, ! 911: 0, ! 912: NULL); ! 913: ! 914: AppendMenu (GetSubMenu (GetMenu (hWnd), 2), ! 915: MF_STRING | MF_CHECKED, ! 916: AddAtom (szBuff), ! 917: szBuff); ! 918: ! 919: /* send WM_VSCROLL message to scroll address into view */ ! 920: nLine = (nAddress - (int)mbi.BaseAddress)/16 - 5; ! 921: PostMessage (hViewWnd, WM_VSCROLL, MAKELONG (SB_THUMBPOSITION, nLine), 0); ! 922: } ! 923: ! 924: else ! 925: NotifyUser (hWnd, IDS_ERROR, IDS_COULDNOTREADPROCESS, NULL, 0); ! 926: } ! 927: } ! 928: break; ! 929: ! 930: case IDM_REMOVEVIEWWND: ! 931: { ! 932: ATOM aCaption = FindAtom ((char *)lParam); ! 933: HMENU hMenu = GetMenu (hWnd); ! 934: HMENU hViewMenu = GetSubMenu (hMenu, 2); ! 935: ! 936: RemoveMenu (hMenu, (UINT)aCaption, MF_BYCOMMAND); ! 937: DeleteAtom (aCaption); ! 938: ! 939: /* there are 4 menuitems in the view menu without view windows open */ ! 940: if (GetMenuItemCount (hViewMenu) == 5) ! 941: RemoveMenu (hViewMenu, 4, MF_BYPOSITION); ! 942: } ! 943: break; ! 944: ! 945: case IDM_SORTADDRESS: ! 946: case IDM_SORTSTATE: ! 947: case IDM_SORTPROTECTION: ! 948: case IDM_SORTSIZE: ! 949: case IDM_SORTBASEADDRESS: ! 950: { ! 951: HWND hList = GetDlgItem (hWnd, IDC_LISTBOX); ! 952: HCURSOR hOldCursor; ! 953: ! 954: if (nSortType != (int)LOWORD (wParam)) ! 955: { ! 956: /* put wait cursor up */ ! 957: hOldCursor = (HCURSOR)SetClassLong (hWnd, GCL_HCURSOR, 0); ! 958: SetCursor (LoadCursor (0, IDC_WAIT)); ! 959: ! 960: /* reset menuitems to indicate which sort method is being used */ ! 961: CheckMenuItem (GetMenu (hWnd), nSortType, MF_UNCHECKED); ! 962: CheckMenuItem (GetMenu (hWnd), wParam, MF_CHECKED); ! 963: ! 964: /* save new sort type and resort */ ! 965: SortList (hList, nSortType = wParam); ! 966: ! 967: /* repaint after sorting */ ! 968: InvalidateRect (hList, NULL, TRUE); ! 969: UpdateWindow (hList); ! 970: ! 971: /* replace wait cursor with old cursor */ ! 972: SetClassLong (hWnd, GCL_HCURSOR, (LONG)hOldCursor); ! 973: SetCursor (hOldCursor); ! 974: } ! 975: } ! 976: break; ! 977: ! 978: case IDM_OPTBYTES: ! 979: case IDM_OPTPAGES: ! 980: { ! 981: HWND hList = GetDlgItem (hWnd, IDC_LISTBOX); ! 982: bNumbersAsBytes = (LOWORD(wParam) == IDM_OPTBYTES); ! 983: InvalidateRect (hList, NULL, TRUE); ! 984: } ! 985: break; ! 986: ! 987: default: ! 988: /* if popup window, bring to front */ ! 989: ActivateViewWindow (LOWORD (wParam)); ! 990: lRet = TRUE; ! 991: break; ! 992: } ! 993: } ! 994: break; ! 995: ! 996: case WM_CLOSE: ! 997: case WM_QUERYENDSESSION: ! 998: /* if child process is active, close it first then exit */ ! 999: if (lpChildProcess != NULL) ! 1000: CloseChildProcess (lpChildProcess, hChildEvents); ! 1001: ! 1002: /* destroy this window */ ! 1003: DestroyWindow (hWnd); ! 1004: break; ! 1005: ! 1006: case WM_DESTROY: ! 1007: PostQuitMessage (0); ! 1008: break; ! 1009: ! 1010: default: ! 1011: /* pass all unhandled messages to DefWindowProc */ ! 1012: lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); ! 1013: break; ! 1014: } ! 1015: ! 1016: /* return 1 if handled message, 0 if not */ ! 1017: return lRet; ! 1018: } ! 1019: ! 1020: ! 1021: ! 1022: /* initialize all menuitems */ ! 1023: void WINAPI InitMenu ( ! 1024: HWND hWnd) ! 1025: { ! 1026: HMENU hMenu = GetMenu (hWnd); ! 1027: ! 1028: /* if child process exists enable options */ ! 1029: EnableMenuItem (hMenu, ! 1030: IDM_PROCESSREWALK, ! 1031: MF_BYCOMMAND | ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1032: EnableMenuItem (hMenu, ! 1033: IDM_PROCESSUNLOAD, ! 1034: MF_BYCOMMAND | ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1035: ! 1036: /* check appropriate sort menuitem */ ! 1037: CheckMenuItem (hMenu, nSortType, MF_CHECKED); ! 1038: ! 1039: /* check view as bytes/pages menuitems */ ! 1040: CheckMenuItem (hMenu, IDM_OPTBYTES, bNumbersAsBytes ? MF_CHECKED : MF_UNCHECKED); ! 1041: CheckMenuItem (hMenu, IDM_OPTPAGES, bNumbersAsBytes ? MF_UNCHECKED : MF_CHECKED); ! 1042: ! 1043: /* enable process and selection stat windows only when child process exists */ ! 1044: EnableMenuItem (hMenu, ! 1045: IDM_VIEWPROSTAT, ! 1046: MF_BYCOMMAND | ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1047: EnableMenuItem (hMenu, ! 1048: IDM_VIEWSYSSTAT, ! 1049: MF_BYCOMMAND | ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1050: ! 1051: /* check all appropriate view menuitem */ ! 1052: CheckMenuItem (hMenu, ! 1053: IDM_VIEWSYSSTAT, ! 1054: IsWindow (hWndSysStat) ? MF_CHECKED : MF_UNCHECKED); ! 1055: CheckMenuItem (hMenu, ! 1056: IDM_VIEWPROSTAT, ! 1057: IsWindow (hWndProStat) ? MF_CHECKED : MF_UNCHECKED); ! 1058: ! 1059: /* if child process exists */ ! 1060: if (lpChildProcess != NULL) ! 1061: { ! 1062: /* child process is active */ ! 1063: if (lpChildProcess->bActive) ! 1064: { ! 1065: EnableMenuItem (hMenu, IDM_PROCESSRESUME, MF_GRAYED); ! 1066: EnableMenuItem (hMenu, IDM_PROCESSSUSPEND, MF_ENABLED); ! 1067: } ! 1068: ! 1069: else ! 1070: { ! 1071: EnableMenuItem (hMenu, IDM_PROCESSSUSPEND, MF_GRAYED); ! 1072: EnableMenuItem (hMenu, IDM_PROCESSRESUME, MF_ENABLED); ! 1073: } ! 1074: } ! 1075: ! 1076: /* diasble both menuitems */ ! 1077: else ! 1078: { ! 1079: EnableMenuItem (hMenu, IDM_PROCESSSUSPEND, MF_GRAYED); ! 1080: EnableMenuItem (hMenu, IDM_PROCESSRESUME, MF_GRAYED); ! 1081: } ! 1082: ! 1083: /* sort only when process exists */ ! 1084: EnableMenuItem (hMenu, ! 1085: IDM_SORTADDRESS, ! 1086: ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1087: EnableMenuItem (hMenu, ! 1088: IDM_SORTSTATE, ! 1089: ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1090: EnableMenuItem (hMenu, ! 1091: IDM_SORTPROTECTION, ! 1092: ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1093: EnableMenuItem (hMenu, ! 1094: IDM_SORTSIZE, ! 1095: ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1096: EnableMenuItem (hMenu, ! 1097: IDM_SORTBASEADDRESS, ! 1098: ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1099: ! 1100: /* if child process & selection, and selection is committed memory */ ! 1101: if (lpChildProcess != NULL && ! 1102: ViewableMemorySelection (hWnd)) ! 1103: EnableMenuItem (hMenu, IDM_VIEWMEMORY, MF_ENABLED); ! 1104: else ! 1105: EnableMenuItem (hMenu, IDM_VIEWMEMORY, MF_GRAYED); ! 1106: ! 1107: /* View address if child process */ ! 1108: EnableMenuItem (hMenu, ! 1109: IDM_VIEWADDRESS, ! 1110: ((lpChildProcess != NULL) ? MF_ENABLED : MF_GRAYED)); ! 1111: ! 1112: ! 1113: } ! 1114: ! 1115: ! 1116: ! 1117: ! 1118: int WINAPI MakeVMQString ( ! 1119: int nItem, ! 1120: char *lpszMem) ! 1121: { ! 1122: char szState[10], szProtection[3]; ! 1123: LPVMOBJECT lpVMObject; ! 1124: int nLen; ! 1125: int nBaseAddr; ! 1126: int nRegionSize; ! 1127: int nAllocBase; ! 1128: LPSTR lpszFormat; ! 1129: ! 1130: /* lookup object offset in array index */ ! 1131: lpVMObject = ((VMOBJECT *)lpWalkerList)+Objects[nItem]; ! 1132: ! 1133: ! 1134: /* determine state of memory object */ ! 1135: if (lpVMObject->mbi.State & MEM_COMMIT) ! 1136: strcpy (szState, "Commit "); ! 1137: else if (lpVMObject->mbi.State & MEM_RESERVE) ! 1138: strcpy (szState, "Reserve"); ! 1139: else ! 1140: strcpy (szState, "Free "); ! 1141: ! 1142: /* determine protection of memory */ ! 1143: if (lpVMObject->mbi.Protect & PAGE_READWRITE) ! 1144: strcpy (szProtection, "RW"); ! 1145: else if (lpVMObject->mbi.Protect & PAGE_READONLY) ! 1146: strcpy (szProtection, "RO"); ! 1147: else ! 1148: strcpy (szProtection, "NA"); ! 1149: ! 1150: lpszFormat = szFormat; ! 1151: nBaseAddr = (int)(lpVMObject->mbi.BaseAddress); ! 1152: nRegionSize = lpVMObject->mbi.RegionSize; ! 1153: nAllocBase = (int)(lpVMObject->mbi.AllocationBase); ! 1154: ! 1155: if (!bNumbersAsBytes) ! 1156: { ! 1157: nBaseAddr /= PAGESIZE; ! 1158: nRegionSize /= PAGESIZE; ! 1159: nAllocBase /= PAGESIZE; ! 1160: lpszFormat = szFormatPages; ! 1161: } ! 1162: ! 1163: /* create list object */ ! 1164: wsprintf(lpszMem, ! 1165: lpszFormat, ! 1166: nBaseAddr, ! 1167: szState, ! 1168: szProtection, ! 1169: nRegionSize, ! 1170: nAllocBase, ! 1171: lpVMObject->szObjType, ! 1172: lpVMObject->szSection, ! 1173: lpVMObject->szModule); ! 1174: ! 1175: /* return length of resulting string */ ! 1176: nLen = strlen (lpszMem); ! 1177: ! 1178: // convert the ~ separators to \0 for the benefit of ! 1179: // TextOutFields ! 1180: // ! 1181: while (*lpszMem) ! 1182: { ! 1183: if (*lpszMem == '~') ! 1184: *lpszMem = 0; ! 1185: ++lpszMem; ! 1186: } ! 1187: ! 1188: return nLen; ! 1189: } ! 1190: ! 1191: ! 1192: ! 1193: static void TextOutFields ( ! 1194: HDC hDC, ! 1195: int x, ! 1196: LPRECT lprc, ! 1197: LPSTR lpszItems) ! 1198: { ! 1199: int eto = ETO_CLIPPED | ETO_OPAQUE; ! 1200: int ii = 0; ! 1201: PSTR psz = lpszItems; ! 1202: int nLen; ! 1203: ! 1204: // copy fields until we get one of zero size. ! 1205: // ! 1206: do { ! 1207: SetTextAlign (hDC, taColumns[ii]); ! 1208: ! 1209: ExtTextOut(hDC, ! 1210: lprc->left + (xColumns[ii] * sChar0.cx) + x, ! 1211: lprc->top, ! 1212: eto, ! 1213: lprc, ! 1214: psz, ! 1215: nLen = strlen(psz), ! 1216: 0L); ! 1217: ! 1218: psz += (nLen + 1); ! 1219: eto = ETO_CLIPPED; ! 1220: ++ii; ! 1221: } while (nLen); ! 1222: } ! 1223: ! 1224: ! 1225: ! 1226: void WINAPI DrawListItem( ! 1227: DRAWITEMSTRUCT *lpItem) ! 1228: { ! 1229: DWORD dwBkColor=0xffffffff, dwTextColor=0xffffffff; ! 1230: char szListItem[200]; ! 1231: int nLen; ! 1232: ! 1233: /* Make sure it is the list box with a valid item ID */ ! 1234: if (lpItem->CtlType != ODT_LISTBOX || ! 1235: lpItem->CtlID != IDC_LISTBOX) ! 1236: return; ! 1237: ! 1238: if (lpItem->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) ! 1239: { ! 1240: /* Alter the bk and text color for selected items */ ! 1241: if (lpItem->itemState & ODS_SELECTED) ! 1242: { ! 1243: dwBkColor = SetBkColor (lpItem->hDC, GetSysColor(COLOR_HIGHLIGHT)); ! 1244: dwTextColor = SetTextColor (lpItem->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); ! 1245: } ! 1246: ! 1247: /* change TextColor for new entries to */ ! 1248: else if ((((LPVMOBJECT)lpWalkerList)+Objects[lpItem->itemData])->bNew) ! 1249: dwTextColor = SetTextColor (lpItem->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); ! 1250: ! 1251: /* make listbox string from virtual memory object */ ! 1252: nLen = MakeVMQString (lpItem->itemData, szListItem); ! 1253: TextOutFields (lpItem->hDC, 6, &lpItem->rcItem, szListItem); ! 1254: ! 1255: /* Restore previous bk and text color if necessary */ ! 1256: if (dwBkColor != 0xffffffff) ! 1257: SetBkColor(lpItem->hDC, dwBkColor); ! 1258: if (dwTextColor != 0xffffffff) ! 1259: SetTextColor(lpItem->hDC, dwTextColor); ! 1260: ! 1261: if (lpItem->itemState & ODS_FOCUS) ! 1262: lpItem->itemAction |= ODA_FOCUS; ! 1263: ! 1264: } ! 1265: ! 1266: if (lpItem->itemAction & ODA_FOCUS) ! 1267: DrawFocusRect(lpItem->hDC, &lpItem->rcItem); ! 1268: } ! 1269: ! 1270: ! 1271: ! 1272: /* perform bubble sort on indexes to virtual memory objects as stored in ! 1273: ownerdraw listbox do not actually sort the objects, just the indexes */ ! 1274: void WINAPI SortList ( ! 1275: HWND hList, ! 1276: int nSort) ! 1277: { ! 1278: int nItems = SendMessage (hList, LB_GETCOUNT, 0, 0); ! 1279: int i, j, t; ! 1280: LPVMOBJECT lpVMO = (LPVMOBJECT)lpWalkerList; ! 1281: ! 1282: /* loop through all items in list box */ ! 1283: for (i=0; i<nItems-1; i++) ! 1284: for (j=i+1; j<nItems; j++) ! 1285: { ! 1286: /* compare on sort order */ ! 1287: switch (nSort) ! 1288: { ! 1289: case IDM_SORTADDRESS: ! 1290: if (lpVMO[Objects[i]].mbi.BaseAddress > lpVMO[Objects[j]].mbi.BaseAddress) ! 1291: { ! 1292: /* swap */ ! 1293: t = Objects[j]; ! 1294: Objects[j] = Objects[i]; ! 1295: Objects[i] = t; ! 1296: } ! 1297: break; ! 1298: ! 1299: case IDM_SORTSTATE: ! 1300: if ((lpVMO[Objects[i]].mbi.State > lpVMO[Objects[j]].mbi.State) || ! 1301: (lpVMO[Objects[i]].mbi.State == lpVMO[Objects[j]].mbi.State && ! 1302: lpVMO[Objects[i]].mbi.BaseAddress > lpVMO[Objects[j]].mbi.BaseAddress)) ! 1303: { ! 1304: /* swap */ ! 1305: t = Objects[j]; ! 1306: Objects[j] = Objects[i]; ! 1307: Objects[i] = t; ! 1308: } ! 1309: break; ! 1310: ! 1311: case IDM_SORTPROTECTION: ! 1312: if ((lpVMO[Objects[i]].mbi.Protect > lpVMO[Objects[j]].mbi.Protect) || ! 1313: (lpVMO[Objects[i]].mbi.Protect == lpVMO[Objects[j]].mbi.Protect && ! 1314: lpVMO[Objects[i]].mbi.BaseAddress > lpVMO[Objects[j]].mbi.BaseAddress)) ! 1315: { ! 1316: /* swap */ ! 1317: t = Objects[j]; ! 1318: Objects[j] = Objects[i]; ! 1319: Objects[i] = t; ! 1320: } ! 1321: break; ! 1322: ! 1323: case IDM_SORTSIZE: ! 1324: if ((lpVMO[Objects[i]].mbi.RegionSize > lpVMO[Objects[j]].mbi.RegionSize) || ! 1325: (lpVMO[Objects[i]].mbi.RegionSize == lpVMO[Objects[j]].mbi.RegionSize && ! 1326: lpVMO[Objects[i]].mbi.BaseAddress > lpVMO[Objects[j]].mbi.BaseAddress)) ! 1327: { ! 1328: /* swap */ ! 1329: t = Objects[j]; ! 1330: Objects[j] = Objects[i]; ! 1331: Objects[i] = t; ! 1332: } ! 1333: break; ! 1334: ! 1335: case IDM_SORTBASEADDRESS: ! 1336: if ((lpVMO[Objects[i]].mbi.AllocationBase > lpVMO[Objects[j]].mbi.AllocationBase) || ! 1337: (lpVMO[Objects[i]].mbi.AllocationBase == lpVMO[Objects[j]].mbi.AllocationBase && ! 1338: lpVMO[Objects[i]].mbi.BaseAddress > lpVMO[Objects[j]].mbi.BaseAddress)) ! 1339: { ! 1340: /* swap */ ! 1341: t = Objects[j]; ! 1342: Objects[j] = Objects[i]; ! 1343: Objects[i] = t; ! 1344: } ! 1345: break; ! 1346: } ! 1347: } ! 1348: } ! 1349: ! 1350: ! 1351: ! 1352: ! 1353: /* get free disk space on all fixed drives */ ! 1354: BOOL WINAPI GetFreeDiskSpace ( ! 1355: LPDWORD lpdwTotalSpace, ! 1356: LPDWORD lpdwFreeSpace) ! 1357: { ! 1358: DWORD dwBytesPerSector, dwSectorsPerCluster, dwFreeClusters, dwTotalClusters; ! 1359: DWORD dwDriveMask = GetLogicalDrives(); ! 1360: int i; ! 1361: char szDir[4]; ! 1362: ! 1363: *lpdwTotalSpace = 0; ! 1364: *lpdwFreeSpace = 0; ! 1365: szDir[1] = TEXT(':'); ! 1366: szDir[2] = TEXT('\\'); ! 1367: szDir[3] = 0; ! 1368: ! 1369: /* enumerate all logical, fixed drives */ ! 1370: for (i = 0; i < MAX_DRIVES; dwDriveMask >>= 1, i++) ! 1371: { ! 1372: /* if logical drive exists */ ! 1373: if (dwDriveMask & 0x01) ! 1374: { ! 1375: szDir[0] = TEXT('A') + i; ! 1376: ! 1377: /* if it is a fixed drive */ ! 1378: if (GetDriveType(szDir) == DRIVE_FIXED) ! 1379: { ! 1380: /* determine free space and total capacity */ ! 1381: GetDiskFreeSpace (szDir, ! 1382: &dwSectorsPerCluster, ! 1383: &dwBytesPerSector, ! 1384: &dwFreeClusters, ! 1385: &dwTotalClusters); ! 1386: ! 1387: *lpdwTotalSpace += dwTotalClusters * dwSectorsPerCluster * dwBytesPerSector; ! 1388: *lpdwFreeSpace += dwFreeClusters * dwSectorsPerCluster * dwBytesPerSector; ! 1389: } ! 1390: } ! 1391: } ! 1392: ! 1393: return (*lpdwTotalSpace || *lpdwFreeSpace); ! 1394: } ! 1395: ! 1396: ! 1397: ! 1398: /* generic message notification */ ! 1399: int WINAPI NotifyUser ( ! 1400: HWND hWndParent, ! 1401: int nTitle, ! 1402: int nError, ! 1403: char *lpszAppend, ! 1404: UINT uFlags) ! 1405: { ! 1406: char szError[MAX_PATH]; ! 1407: char szTitle[MAX_PATH]; ! 1408: ! 1409: LoadString (GetModuleHandle (NULL), nTitle, szTitle, MAX_PATH); ! 1410: LoadString (GetModuleHandle (NULL), nError, szError, MAX_PATH); ! 1411: ! 1412: if (lpszAppend != NULL && *lpszAppend != 0) ! 1413: strcat (szError, lpszAppend); ! 1414: ! 1415: if (!uFlags) ! 1416: uFlags = MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND; ! 1417: ! 1418: /* return message box response */ ! 1419: return (MessageBox (hWndParent, szError, szTitle, uFlags)); ! 1420: } ! 1421: ! 1422: ! 1423: ! 1424: ! 1425: void WINAPI ReportError ( ! 1426: int nIDS_CAPTION) ! 1427: { ! 1428: char *lpszError; ! 1429: char szText[MAX_PATH]; ! 1430: ! 1431: /* get formatted error message from system */ ! 1432: if (!FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, ! 1433: NULL, ! 1434: GetLastError (), ! 1435: MAKELONG (MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), 0), ! 1436: (LPTSTR)&lpszError, ! 1437: 0, ! 1438: NULL)) ! 1439: return; ! 1440: ! 1441: /* if resource string provided, load caption string */ ! 1442: if (nIDS_CAPTION) ! 1443: LoadString (GetModuleHandle (NULL), nIDS_CAPTION, szText, MAX_PATH); ! 1444: else ! 1445: strcpy (szText, "Error"); ! 1446: ! 1447: MessageBox (NULL, ! 1448: lpszError, ! 1449: szText, ! 1450: MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND); ! 1451: } ! 1452: ! 1453: ! 1454: ! 1455: ! 1456: ! 1457: BOOL WINAPI ViewableMemorySelection ( ! 1458: HWND hWnd) ! 1459: { ! 1460: HWND hList = GetDlgItem (hWnd, IDC_LISTBOX); ! 1461: int iCaret = SendMessage (hList, LB_GETCARETINDEX, 0, 0); ! 1462: int iAnchor = SendMessage (hList, LB_GETANCHORINDEX, 0, 0); ! 1463: ! 1464: if (iCaret > -1 && ! 1465: iAnchor > -1 && ! 1466: SendMessage (hList, LB_GETSEL, iCaret, 0) && ! 1467: CommittedMemoryRange (iCaret, ! 1468: iAnchor, ! 1469: (LPVMOBJECT)lpWalkerList, ! 1470: Objects)) ! 1471: return TRUE; ! 1472: else ! 1473: return FALSE; ! 1474: } ! 1475: ! 1476: ! 1477: ! 1478: ! 1479: BOOL WINAPI InitDlgProc ( ! 1480: HWND hDlg, ! 1481: UINT uMsg, ! 1482: WPARAM wParam, ! 1483: LPARAM lParam) ! 1484: { ! 1485: switch (uMsg) ! 1486: { ! 1487: case WM_INITDIALOG: ! 1488: *(HANDLE *)lParam = hDlg; ! 1489: break; ! 1490: ! 1491: case WM_CLOSE: ! 1492: case UM_ENDDIALOG: ! 1493: EndDialog (hDlg, TRUE); ! 1494: break; ! 1495: ! 1496: case WM_COMMAND: ! 1497: if (LOWORD (wParam) == IDCANCEL || ! 1498: LOWORD (wParam) == IDOK) ! 1499: EndDialog (hDlg, TRUE); ! 1500: break; ! 1501: ! 1502: default: ! 1503: return FALSE; ! 1504: } ! 1505: ! 1506: return TRUE; ! 1507: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.