Annotation of pmsdk/samples/spy/symbol.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.