|
|
1.1 ! root 1: /***************************************************************************\ ! 2: ! 3: Module Name: SYMBOL.C ! 4: ! 5: This module contains the code for displaying symbols for a specified address. ! 6: ! 7: \***************************************************************************/ ! 8: ! 9: #define INCL_DOSPROCESS ! 10: #define INCL_GPILCIDS ! 11: #define INCL_WINDIALOGS ! 12: #define INCL_WINFRAMEMGR ! 13: #define INCL_WINHEAP /* needed for spy.h */ ! 14: #define INCL_WININPUT ! 15: #define INCL_WINLISTBOXES ! 16: #define INCL_WINMENUS ! 17: #define INCL_WINMESSAGEMGR ! 18: #define INCL_WINPOINTERS /* needed for spy.h */ ! 19: #define INCL_WINWINDOWMGR ! 20: #include <os2.h> ! 21: #include <stdio.h> ! 22: #include <string.h> ! 23: #include "spy.h" ! 24: #include <spyhook.h> ! 25: #include "symbol.h" ! 26: ! 27: WHOISINFO whoIs; ! 28: MAPDEF mapdef; ! 29: MAPEND mapend; ! 30: SEGDEF segdef; ! 31: SYMDEF symdef; ! 32: ! 33: extern VOID lstrcat(PSZ, PSZ); ! 34: extern void OutputString(char [], SHORT); /* Output string to output devices */ ! 35: extern BOOL FValidPointer (CHAR FAR *pVoid, SHORT cbStruct); ! 36: extern BOOL FGuessValidPointer (CHAR FAR *pVoid, SHORT cbStruct); ! 37: ! 38: ! 39: extern HWND hwndSpyFrame; ! 40: extern HAB hab; ! 41: ! 42: /* Function prototypes */ ! 43: HWND HwndFrameFromPID(PID); ! 44: VOID GetSymbolInformation(PID, char far *, char *); ! 45: VOID NEAR ProcessLNOkButton(HWND); ! 46: MRESULT NEAR FormatLNDialog(HWND, PSWP, PRECTL); ! 47: VOID NEAR EndLNDialog(HWND); ! 48: MRESULT CALLBACK ListNearDlgProc(HWND, USHORT, MPARAM, MPARAM); ! 49: ! 50: ! 51: /***************************************************************************\ ! 52: * hwnd HwndFrameFromPID(pid) ! 53: * ! 54: * This function attempts to locate a frame window that was ! 55: * created by the specified PID. It returns NULL if none are found. ! 56: \***************************************************************************/ ! 57: HWND HwndFrameFromPID(pid) ! 58: PID pid; ! 59: { ! 60: HENUM henum; ! 61: HWND hwnd; ! 62: PID pidWindow; ! 63: TID tidWindow; ! 64: char szClassName[50]; /* Class name of window */ ! 65: CLASSINFO classinfo; /* Information about class */ ! 66: ! 67: henum = WinBeginEnumWindows(HWND_DESKTOP); ! 68: if (henum == NULL) ! 69: return (NULL); ! 70: ! 71: while ((hwnd = WinGetNextWindow(henum)) != NULL) { ! 72: WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow); ! 73: WinLockWindow(hwnd, FALSE); ! 74: if (pid == pidWindow) { ! 75: /* See if a frame window */ ! 76: WinQueryClassName(hwnd, sizeof(szClassName), ! 77: (PSZ)szClassName); ! 78: if (WinQueryClassInfo(hab, (PSZ)szClassName, &classinfo) && ! 79: (classinfo.flClassStyle & CS_FRAME)) ! 80: break; /* We have our frame */ ! 81: } ! 82: } ! 83: ! 84: WinEndEnumWindows(henum); ! 85: return (hwnd); ! 86: } ! 87: ! 88: ! 89: ! 90: /***************************************************************************\ ! 91: * int IdentifyCodeSegment(lpSegInfo, pid, selector) ! 92: * ! 93: * Identifies the code selector for the specified process. ! 94: * NOTE: The process is currently ignored, but later will somehow ! 95: * return information in the context of the specified process ID. ! 96: \***************************************************************************/ ! 97: int ! 98: pascal near IdentifyCodeSegment( pSegInfo, pid, selector ) ! 99: PSEGINFO pSegInfo; ! 100: PID pid; ! 101: USHORT selector; ! 102: { ! 103: char far *lp; ! 104: char *np; ! 105: int n; ! 106: BYTE c; ! 107: USHORT segnum; ! 108: USHORT seg_ptr; ! 109: USHORT uTemp; ! 110: int rc; ! 111: PIDINFO pidinfo; ! 112: HWND hwndPIDFrame; ! 113: ! 114: /* If new selector matches the current one, then nothing to do */ ! 115: if ((pSegInfo->pid == pid) && (pSegInfo->selector == selector)) ! 116: return 0; ! 117: ! 118: /* ! 119: * Try to identify the code selector. We will first try in the context ! 120: * of our process. If this fails, or if we find that the segment is ! 121: * associated with our program and it is not our PID, we will attempt ! 122: * to get the symbol in the specified PID context, with the help of ! 123: * our hooks. ! 124: */ ! 125: DosGetPID(&pidinfo); ! 126: rc = IdentifyCodeSelector( selector, (PWHOISINFO)&whoIs ); ! 127: if ((pid != pidinfo.pid) && (rc == 0)) { ! 128: /* ! 129: * User asked for a different context, and symbol was found. ! 130: * If the symbol was in our .exe we will ignore what we found, ! 131: * and try again. ! 132: */ ! 133: /* First get past the module name */ ! 134: np = whoIs.names; ! 135: while (*np++) ! 136: ; ! 137: /* Now go through the pathname */ ! 138: while (*np) { ! 139: if (*np++ == '.') { ! 140: if (strcmp(np,"EXE") == 0) { ! 141: rc = 1; /* It is in our exe, so set errr condition */ ! 142: break; /* no need to go on */ ! 143: } ! 144: } ! 145: } ! 146: } ! 147: ! 148: if (rc) { ! 149: /* ! 150: * We need to try in other PID context ! 151: */ ! 152: if ((pid == pidinfo.pid) || ! 153: ((hwndPIDFrame = HwndFrameFromPID(pid)) == NULL)) ! 154: return (rc); /* segment not found or no way to find segment */ ! 155: ! 156: /* Lets use the hook */ ! 157: SpySetLNSymbolPID(pid, selector); ! 158: ! 159: /* HACK: Send message to frame known to send another message */ ! 160: WinSendMsg(hwndPIDFrame, WM_QUERYTASKFOCUS, 0L, 0L); ! 161: ! 162: if (SpyGetLNSymbolSelector(&whoIs) != 0) ! 163: return (1); /* Still did not find the symbol */ ! 164: ! 165: } ! 166: ! 167: ! 168: /* It is a valid code selector, make it the new current selector */ ! 169: pSegInfo->selector = selector; ! 170: pSegInfo->pid = pid; ! 171: ! 172: /* Is the new selector in the same module? */ ! 173: if (pSegInfo->lpSegName && pSegInfo->whoIs.mte == whoIs.mte) ! 174: pSegInfo->whoIs.segNum = whoIs.segNum; /* Yes, just copy seg# */ ! 175: else { ! 176: ! 177: /* New module, get segment #, mte handle, module name and pathstring */ ! 178: pSegInfo->whoIs = whoIs; ! 179: ! 180: /* Generate separate pointers to module name and pathstring */ ! 181: lp = &pSegInfo->whoIs.names[0]; ! 182: pSegInfo->lpModName = lp; ! 183: while (*lp++) ! 184: ; ! 185: pSegInfo->lpPathName = lp; ! 186: ! 187: /* Change pathstring extension to be .SYM */ ! 188: while (*lp) ! 189: if (*lp++ == '.') { ! 190: *lp++ = 'S'; ! 191: *lp++ = 'Y'; ! 192: *lp++ = 'M'; ! 193: } ! 194: lp++; ! 195: ! 196: /* ! 197: * No current segment name or symbol name, so make them point to ! 198: * null string ! 199: */ ! 200: *lp = 0; ! 201: pSegInfo->lpSegName = lp; ! 202: pSegInfo->lpSymName = 0L; ! 203: ! 204: /* Close any currently open .SYM file and then open the new .SYM file */ ! 205: if (pSegInfo->symfh != -1) ! 206: pSegInfo->symfh = DosClose((HFILE)pSegInfo->symfh ); ! 207: ! 208: if (DosOpen(pSegInfo->lpPathName, (PHFILE)&pSegInfo->symfh, ! 209: (PUSHORT)&uTemp, ! 210: 0L, 0, 1, 0x00c0, 0L) == 0) { ! 211: ! 212: /* Read in .SYM file header and save segment count and pointer */ ! 213: ! 214: DebugFileRead( pSegInfo->symfh, (PSZ)&mapdef, sizeof( mapdef ) ); ! 215: pSegInfo->segcnt = mapdef.seg_cnt; ! 216: pSegInfo->segptr = mapdef.seg_ptr; ! 217: ! 218: /* Read version of MAPSYM that produced this file. ! 219: If not a version 4 file then ignore the file */ ! 220: ! 221: DebugFileSeek( pSegInfo->symfh, (long)-sizeof( mapend ), 2 ); ! 222: DebugFileRead( pSegInfo->symfh, (PSZ)&mapend, sizeof( mapend ) ); ! 223: if (mapend.ver != 4) ! 224: pSegInfo->symfh = DosClose( (HFILE)pSegInfo->symfh ); ! 225: } ! 226: } ! 227: ! 228: /* Point to segment name buffer and make it a null string for now */ ! 229: ! 230: lp = pSegInfo->lpSegName; ! 231: *lp = 0; ! 232: ! 233: /* If we have an open .SYM file, search for segment definition record */ ! 234: ! 235: if (pSegInfo->symfh != -1 && pSegInfo->whoIs.segNum < pSegInfo->segcnt) { ! 236: ! 237: /* Start with first segment definition and read segNum definitions */ ! 238: ! 239: seg_ptr = pSegInfo->segptr; ! 240: n = pSegInfo->whoIs.segNum; ! 241: while (n--) { ! 242: DebugFileSeek( pSegInfo->symfh, (long)seg_ptr, 4 ); ! 243: DebugFileRead( pSegInfo->symfh, (PSZ)&segdef, sizeof( segdef ) ); ! 244: seg_ptr = (USHORT)segdef.nxt_seg; ! 245: } ! 246: ! 247: /* Now read in the segment name string associated with this segment ! 248: and make it a null terminated string */ ! 249: ! 250: DebugFileRead( pSegInfo->symfh, (PSZ)(lp), ! 251: (int)((BYTE)segdef.nam_len) ); ! 252: lp += segdef.nam_len; ! 253: *lp++ = 0; ! 254: ! 255: /* Remember the count of symbols for this segment */ ! 256: ! 257: pSegInfo->symcnt = segdef.sym_cnt; ! 258: ! 259: ! 260: /* Remember the file offset of the symbols for this segment, which is ! 261: immediately after the segment definition record and name we just read */ ! 262: ! 263: pSegInfo->symFPos = DebugFileSeek( pSegInfo->symfh, 0L, 1 ); ! 264: } ! 265: else { ! 266: /* If no .SYM file or segment number too big, then make the segnemt name ! 267: be the hex representation of its number */ ! 268: ! 269: pSegInfo->symcnt = 0; ! 270: ! 271: segnum = pSegInfo->whoIs.segNum; ! 272: n = 4; ! 273: lp += n; ! 274: while (n--) { ! 275: c = (char)(segnum & (USHORT)0xF); ! 276: segnum >>= 4; ! 277: if (c > 9) ! 278: c += 'A' - 10; ! 279: else ! 280: c += '0'; ! 281: *--lp = c; ! 282: *lp++ = 0; ! 283: } ! 284: ! 285: /* Null terminate the segment name string */ ! 286: ! 287: lp += 4; ! 288: *lp++ = 0; ! 289: } ! 290: ! 291: /* Initialize the symbol name pointer to point to a null string, immediately ! 292: after the segment name string just created above. */ ! 293: ! 294: pSegInfo->lpSymName = lp; ! 295: *lp = 0; ! 296: ! 297: return 0; ! 298: } ! 299: ! 300: ! 301: USHORT ! 302: pascal near FindSymbol( pSegInfo, offset ) ! 303: PSEGINFO pSegInfo; ! 304: USHORT offset; ! 305: { ! 306: USHORT i; ! 307: long symPos; ! 308: char far *lp; ! 309: ! 310: /* If no .SYM file then return failure */ ! 311: ! 312: if (pSegInfo->symfh == -1) ! 313: return 0xFFFF; ! 314: ! 315: /* No symbol found yet, so make it a null string */ ! 316: ! 317: lp = pSegInfo->lpSymName; ! 318: *lp = 0; ! 319: ! 320: /* Now do a linear search of the symbol definitions for this segment, looking ! 321: for the closest match. The definitions are stored in sorted order */ ! 322: ! 323: symPos = DebugFileSeek( pSegInfo->symfh, (long)pSegInfo->symFPos, 0 ); ! 324: i = (USHORT)pSegInfo->symcnt; ! 325: while (i--) { ! 326: DebugFileRead( pSegInfo->symfh, (PSZ)&symdef, sizeof( symdef ) ); ! 327: ! 328: /* If this is not our symbol then just remember its offset */ ! 329: ! 330: if ((USHORT)symdef.sym_val <= offset) { ! 331: symPos = DebugFileSeek( pSegInfo->symfh, 0L, 1 ) - ! 332: sizeof( symdef ); ! 333: ! 334: /* If exact match, exit this loop */ ! 335: ! 336: if ((USHORT)symdef.sym_val == offset) ! 337: break; ! 338: } ! 339: else ! 340: /* If we went past then exit this loop */ ! 341: ! 342: break; ! 343: ! 344: /* Still looking, so seek past this symbols name string to next symbol ! 345: definition */ ! 346: ! 347: DebugFileSeek( pSegInfo->symfh, (long)symdef.nam_len, 1 ); ! 348: } ! 349: ! 350: /* Seek to found symdebol definition and read it in, along with the name */ ! 351: ! 352: DebugFileSeek( pSegInfo->symfh, (long)symPos, 0 ); ! 353: DebugFileRead( pSegInfo->symfh, (PSZ)&symdef, ! 354: sizeof( symdef ) ); ! 355: DebugFileRead( pSegInfo->symfh, (PSZ)lp, ! 356: (int)((BYTE)symdef.nam_len) ); ! 357: ! 358: /* Make the name a null terminated string */ ! 359: ! 360: lp += symdef.nam_len; ! 361: *lp++ = 0; ! 362: ! 363: /* Return the distance of the passed offset from the value of the symbol */ ! 364: ! 365: return offset - symdef.sym_val; ! 366: } ! 367: ! 368: ! 369: ! 370: /************************************************************************* ! 371: * ! 372: * GetSymbolInformation(pid, pvoidInfo, pszInfo) ! 373: * ! 374: * Purpose: To get information about the supplied address ! 375: */ ! 376: VOID GetSymbolInformation(pid, pvoidInfo, pszInfo) ! 377: PID pid; ! 378: char far *pvoidInfo; ! 379: char *pszInfo; ! 380: { ! 381: SEGINFO seginfo; ! 382: char szTemp[256]; ! 383: USHORT uOffsetFromSym; ! 384: ! 385: ! 386: /* ! 387: * First try to find the segment in the segment table. ! 388: */ ! 389: if (IdentifyCodeSegment(&seginfo, pid, SELECTOROF(pvoidInfo)) != 0) { ! 390: ! 391: /* ! 392: * It failed to find the segment, ie it was invalid, so ! 393: * Simply return INVALID to caller ! 394: */ ! 395: sprintf(pszInfo,"PID:%d %04x:%04x - INVALID", (SHORT)pid, ! 396: SELECTOROF(pvoidInfo), OFFSETOF(pvoidInfo)); ! 397: return; ! 398: } ! 399: ! 400: ! 401: sprintf(pszInfo,"PID:%d %04x:%04x - %Fs ! ", (SHORT)pid, ! 402: SELECTOROF(pvoidInfo), OFFSETOF(pvoidInfo), ! 403: seginfo.lpModName); ! 404: ! 405: if (seginfo.symfh == -1) { ! 406: sprintf(szTemp,"%04x", seginfo.whoIs.segNum); ! 407: strcat(pszInfo, szTemp); ! 408: } else { ! 409: lstrcat((PSZ)pszInfo, seginfo.lpSegName); ! 410: } ! 411: ! 412: uOffsetFromSym = FindSymbol(&seginfo, OFFSETOF(pvoidInfo)); ! 413: if (uOffsetFromSym != 0xffff) { ! 414: strcat(pszInfo, ":"); ! 415: ! 416: lstrcat((PSZ)pszInfo, seginfo.lpSymName); ! 417: if (uOffsetFromSym != 0) { ! 418: sprintf(szTemp, "+%x", uOffsetFromSym); ! 419: strcat(pszInfo, szTemp); ! 420: } ! 421: } ! 422: } ! 423: ! 424: ! 425: /***************************************************************************\ ! 426: * VOID NEAR ProcessLNOkButton(hwndDlg) ! 427: * ! 428: * Process the Ok Button for the List Near Dlg proc ! 429: \***************************************************************************/ ! 430: VOID NEAR ProcessLNOkButton(hwndDlg) ! 431: HWND hwndDlg; ! 432: { ! 433: char szTemp[100]; ! 434: char far *pVoid; ! 435: PID pid; ! 436: SHORT item; ! 437: ! 438: /* ! 439: * For now try using sscanf to convert the string into a ! 440: * pointer. ! 441: */ ! 442: WinQueryDlgItemShort(hwndDlg, DID_PID, &pid, FALSE); ! 443: WinQueryDlgItemText(hwndDlg, DID_ADDR, sizeof(szTemp), szTemp); ! 444: if ((strchr(szTemp,':') != NULL) && (sscanf(szTemp,"%p", &pVoid)) > 0) { ! 445: /* It translated, so try to get info about pointer */ ! 446: GetSymbolInformation(pid, pVoid, szTemp); ! 447: ! 448: /* For now simply output to output areas */ ! 449: item = (SHORT)WinSendDlgItemMsg(hwndDlg, DID_SYMLIST, ! 450: LM_INSERTITEM, (MPARAM)LIT_END, (MPARAM)(PSZ)szTemp); ! 451: ! 452: WinSendDlgItemMsg(hwndDlg, DID_SYMLIST, LM_SETTOPINDEX, ! 453: (MPARAM)item, 0L); ! 454: } ! 455: ! 456: /* ! 457: * Now clear the text out of the ADDR field, and set the focus ! 458: * back to the window ! 459: */ ! 460: WinSetDlgItemText(hwndDlg, DID_ADDR, ""); ! 461: WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwndDlg, DID_ADDR)); ! 462: } ! 463: ! 464: /***************************************************************************\ ! 465: * MRESULT NEAR FormatLNDialog(hwndDlg, paswp, prectl) ! 466: * ! 467: * Process the WM_SIZE message in the List Near Dialog ! 468: \***************************************************************************/ ! 469: MRESULT NEAR FormatLNDialog(hwndDlg, paswp, prclClientX) ! 470: HWND hwndDlg; ! 471: PSWP paswp; ! 472: PRECTL prclClientX; ! 473: { ! 474: USHORT cy; ! 475: USHORT cswp; ! 476: HPS hps; ! 477: SHORT dy; ! 478: register HWND hwndT; ! 479: FONTMETRICS fm; ! 480: PSWP pswpT; ! 481: RECTL rclClient; ! 482: SWP swpOk; ! 483: SHORT y; ! 484: ! 485: /* ! 486: * First let the default frame processing set up the position of ! 487: * all of the standard controls. Then we will position the list box ! 488: * and the two entry fields to fill in the remainder of the space. ! 489: */ ! 490: ! 491: #define PSWPLN(x) (paswp + cswp + x - DID_SYMLIST) ! 492: ! 493: ! 494: cswp = (USHORT)WinDefDlgProc(hwndDlg, WM_FORMATFRAME, (MPARAM)paswp, ! 495: (MPARAM)(PRECTL)&rclClient); ! 496: if (prclClientX != NULL) ! 497: *prclClientX = rclClient; /* Give caller info */ ! 498: ! 499: ! 500: /* ! 501: * Now Add our controls to the SWP list - Verify that the first one ! 502: * exists. If not, we probably are initializing the dialog, so ! 503: * Simply return what the default Dlg Proc returned. ! 504: */ ! 505: hwndT = WinWindowFromID(hwndDlg, DID_OK); ! 506: if (hwndT == NULL) ! 507: return (cswp); ! 508: ! 509: /* ! 510: * We need to get a PS, such that we can find out the size of the ! 511: * font, to adjust our edit fields such that they wont keep moving ! 512: * in. ! 513: */ ! 514: hps = WinGetPS(hwndDlg); ! 515: GpiQueryFontMetrics(hps, (LONG)sizeof(fm), &fm); ! 516: WinReleasePS(hps); ! 517: ! 518: WinQueryWindowPos(hwndT, &swpOk); ! 519: ! 520: pswpT=PSWPLN(DID_SYMLIST); ! 521: WinQueryWindowPos(hwndT = WinWindowFromID(hwndDlg, DID_SYMLIST), pswpT); ! 522: dy = pswpT->y - (swpOk.y + swpOk.cy); ! 523: pswpT->fs = SWP_SIZE; ! 524: pswpT->cx = (SHORT)rclClient.xRight - (SHORT)rclClient.xLeft - pswpT->x; ! 525: ! 526: /* First position the top line, just below titlebar */ ! 527: pswpT=PSWPLN(DID_PIDLABEL); ! 528: WinQueryWindowPos(hwndT = WinWindowFromID(hwndDlg, DID_PIDLABEL), pswpT); ! 529: pswpT->fs = SWP_MOVE; ! 530: cy = pswpT->cy; ! 531: y = pswpT->y = (SHORT)rclClient.yTop - (SHORT)rclClient.yBottom - ! 532: cy - dy; ! 533: ! 534: pswpT=PSWPLN(DID_PID); ! 535: WinQueryWindowPos(hwndT = WinWindowFromID(hwndDlg, DID_PID), pswpT); ! 536: pswpT->fs = SWP_MOVE; ! 537: pswpT->x += (SHORT)fm.lAveCharWidth / 2; /* Take care of margin */ ! 538: pswpT->y = y; ! 539: ! 540: /* Since Edit control is bigger Setup Start Y for the next row */ ! 541: y += (cy - pswpT->cy); ! 542: ! 543: ! 544: /* Now position Addr line below PID line */ ! 545: pswpT=PSWPLN(DID_ADDRLABEL); ! 546: WinQueryWindowPos(hwndT = WinWindowFromID(hwndDlg, DID_ADDRLABEL), pswpT); ! 547: pswpT->fs = SWP_MOVE; ! 548: y = (pswpT->y = y - pswpT->cy - dy); ! 549: ! 550: pswpT=PSWPLN(DID_ADDR); ! 551: WinQueryWindowPos(hwndT = WinWindowFromID(hwndDlg, DID_ADDR), pswpT); ! 552: pswpT->fs = SWP_MOVE; ! 553: pswpT->x += (SHORT)fm.lAveCharWidth / 2; /* Take care of margin */ ! 554: pswpT->y = y; ! 555: ! 556: /* Now set size of listbox */ ! 557: y += (cy - pswpT->cy); ! 558: ! 559: pswpT=PSWPLN(DID_SYMLIST); ! 560: pswpT->cy = y - dy - pswpT->y; ! 561: ! 562: ! 563: /* ! 564: * Return the count of swps ! 565: */ ! 566: return ((MRESULT)(cswp + (DID_PID-DID_SYMLIST+1))); ! 567: } ! 568: ! 569: ! 570: ! 571: ! 572: /***************************************************************************\ ! 573: * VOID NEAR EndLNDialog(hwndDlg) ! 574: * ! 575: * End processing for the List Near Dialog ! 576: \***************************************************************************/ ! 577: VOID NEAR EndLNDialog(hwndDlg) ! 578: HWND hwndDlg; ! 579: { ! 580: /* First Dismiss the dialog and destroy the windows */ ! 581: WinDismissDlg(hwndDlg, 0); ! 582: WinDestroyWindow(hwndDlg); ! 583: ! 584: /* And re-enable the menu item */ ! 585: WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU), ! 586: MM_SETITEMATTR, MPFROM2SHORT(CMD_LISTNEAR, TRUE), ! 587: MPFROM2SHORT(MIA_DISABLED, 0)); ! 588: ! 589: } ! 590: ! 591: ! 592: ! 593: /***************************************************************************\ ! 594: * MRESULT CALLBACK ListNearDlgProc(hwnd, msg, mp1, mp2) ! 595: * ! 596: * Will locate the symbol near the specified address. ! 597: \***************************************************************************/ ! 598: MRESULT CALLBACK ListNearDlgProc(hwnd, msg, mp1, mp2) ! 599: HWND hwnd; ! 600: USHORT msg; ! 601: MPARAM mp1; ! 602: MPARAM mp2; ! 603: { ! 604: PIDINFO pidinfo; ! 605: ! 606: switch (msg) { ! 607: ! 608: case WM_INITDLG: ! 609: /* Initialize the dialog items */ ! 610: WinSetDlgItemText(hwnd, DID_ADDR, ""); ! 611: DosGetPID(&pidinfo); ! 612: WinSetDlgItemShort(hwnd, DID_PID, (USHORT)pidinfo.pid, FALSE); ! 613: break; ! 614: ! 615: case WM_SYSCOMMAND: ! 616: if (SHORT1FROMMP(mp1) == SC_CLOSE) { ! 617: /* End processing the dialog */ ! 618: EndLNDialog(hwnd); ! 619: break; ! 620: } else ! 621: return(WinDefDlgProc(hwnd, msg, mp1, mp2)); ! 622: ! 623: ! 624: case WM_COMMAND: ! 625: switch (SHORT1FROMMP(mp1)) { ! 626: case DID_OK: ! 627: ! 628: /* ! 629: * Process The Ok Button, by caling ProcessLNOkButton, which ! 630: * will add the information to the listbox in our dialog. ! 631: */ ! 632: ProcessLNOkButton(hwnd); ! 633: break; ! 634: ! 635: case DID_CANCEL: ! 636: /* End processing the dialog */ ! 637: EndLNDialog(hwnd); ! 638: break; ! 639: } ! 640: ! 641: break; ! 642: ! 643: /* ! 644: * We want to add our controls into the formating of the frame, so ! 645: * we need to add some room onto the SWP list ! 646: */ ! 647: case WM_QUERYFRAMECTLCOUNT: ! 648: return((MRESULT)((SHORT)WinDefDlgProc(hwnd, msg, mp1, mp2) + ! 649: (SHORT)(DID_PID-DID_SYMLIST+1))); ! 650: break; ! 651: ! 652: /* ! 653: * Call FormatLNDialog, to format the dialog ! 654: */ ! 655: case WM_FORMATFRAME: ! 656: return (FormatLNDialog(hwnd, (PSWP)mp1, (PRECTL)mp2)); ! 657: ! 658: default: ! 659: return(WinDefDlgProc(hwnd, msg, mp1, mp2)); ! 660: } ! 661: ! 662: return (0L); ! 663: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.