Annotation of ntddk/src/video/displays/s3/debug.c, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: debug.c
                      3: *
                      4: * debug helper routines
                      5: *
                      6: * Copyright (c) 1992-1993 Microsoft Corporation
                      7: *
                      8: \**************************************************************************/
                      9: 
                     10: #include <stdio.h>
                     11: #include <stdarg.h>
                     12: #include <stdlib.h>
                     13: 
                     14: #include "driver.h"
                     15: 
                     16: #include <ntsdexts.h>
                     17: 
                     18: #include "lines.h"
                     19: 
                     20: 
                     21: #if DBG
                     22: 
                     23: #define LOG_SIZE_IN_BYTES 4000
                     24: 
                     25: typedef struct _LOGGER {
                     26:     ULONG ulEnd;
                     27:     ULONG ulCurrent;
                     28:     CHAR  achBuf[LOG_SIZE_IN_BYTES];
                     29: } DBGLOG;
                     30: 
                     31: #define GetAddress(dst, src)\
                     32: try {\
                     33:     dst = (VOID*) lpGetExpressionRoutine(src);\
                     34: } except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\
                     35:             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\
                     36:     lpOutputRoutine("NTSD: Access violation on \"%s\", switch to server context\n", src);\
                     37:     return;\
                     38: }
                     39: 
                     40: DBGLOG glog = {0, 0};           // If you muck with this, fix 'dumplog' too
                     41: ULONG  DebugLevel = 0;
                     42: ULONG  LogLevel = 1;
                     43: 
                     44: #endif // DBG
                     45: 
                     46: /*****************************************************************************
                     47:  *
                     48:  *   Routine Description:
                     49:  *
                     50:  *      This function is variable-argument, level-sensitive debug print
                     51:  *      routine.
                     52:  *      If the specified debug level for the print statement is lower or equal
                     53:  *      to the current debug level, the message will be printed.
                     54:  *
                     55:  *   Arguments:
                     56:  *
                     57:  *      DebugPrintLevel - Specifies at which debugging level the string should
                     58:  *          be printed
                     59:  *
                     60:  *      DebugMessage - Variable argument ascii c string
                     61:  *
                     62:  *   Return Value:
                     63:  *
                     64:  *      None.
                     65:  *
                     66:  ***************************************************************************/
                     67: 
                     68: VOID
                     69: DebugPrint(
                     70:     ULONG DebugPrintLevel,
                     71:     PCHAR DebugMessage,
                     72:     ...
                     73:     )
                     74: 
                     75: 
                     76: {
                     77: 
                     78: #if DBG
                     79: 
                     80:     va_list ap;
                     81: 
                     82:     va_start(ap, DebugMessage);
                     83: 
                     84:     if (DebugPrintLevel <= DebugLevel) {
                     85: 
                     86:         char buffer[128];
                     87: 
                     88:         vsprintf(buffer, DebugMessage, ap);
                     89: 
                     90:         OutputDebugStringA(buffer);
                     91:     }
                     92: 
                     93:     va_end(ap);
                     94: 
                     95: #endif // DBG
                     96: 
                     97: } // DebugPrint()
                     98: 
                     99: 
                    100: /*****************************************************************************
                    101:  *
                    102:  *   Routine Description:
                    103:  *
                    104:  *      This function is variable-argument, level-sensitive debug log
                    105:  *      routine.
                    106:  *      If the specified debug level for the log statement is lower or equal
                    107:  *      to the current debug level, the message will be logged.
                    108:  *
                    109:  *   Arguments:
                    110:  *
                    111:  *      DebugLogLevel - Specifies at which debugging level the string should
                    112:  *          be logged
                    113:  *
                    114:  *      DebugMessage - Variable argument ascii c string
                    115:  *
                    116:  *   Return Value:
                    117:  *
                    118:  *      None.
                    119:  *
                    120:  ***************************************************************************/
                    121: 
                    122: VOID
                    123: DebugLog(
                    124:     ULONG DebugLogLevel,
                    125:     PCHAR DebugMessage,
                    126:     ...
                    127:     )
                    128: 
                    129: 
                    130: {
                    131: 
                    132: #if DBG
                    133: 
                    134:     va_list ap;
                    135: 
                    136:     va_start(ap, DebugMessage);
                    137: 
                    138:     if (DebugLogLevel <= LogLevel) {
                    139: 
                    140:         char buffer[128];
                    141:         int  length;
                    142: 
                    143:         length = vsprintf(buffer, DebugMessage, ap);
                    144: 
                    145:         length++;           // Don't forget '\0' terminator!
                    146: 
                    147:         // Wrap around to the beginning of the log if not enough room for
                    148:         // string:
                    149: 
                    150:         if (glog.ulCurrent + length >= LOG_SIZE_IN_BYTES) {
                    151:             glog.ulEnd     = glog.ulCurrent;
                    152:             glog.ulCurrent = 0;
                    153:         }
                    154: 
                    155:         memcpy(&glog.achBuf[glog.ulCurrent], buffer, length);
                    156:         glog.ulCurrent += length;
                    157:     }
                    158: 
                    159:     va_end(ap);
                    160: 
                    161: #endif // DBG
                    162: 
                    163: } // DebugLog()
                    164: 
                    165: 
                    166: /*****************************************************************************
                    167:  *
                    168:  *   Routine Description:
                    169:  *
                    170:  *       This function is called as an NTSD extension to dump a LineState
                    171:  *
                    172:  *   Arguments:
                    173:  *
                    174:  *       hCurrentProcess - Supplies a handle to the current process (at the
                    175:  *           time the extension was called).
                    176:  *
                    177:  *       hCurrentThread - Supplies a handle to the current thread (at the
                    178:  *           time the extension was called).
                    179:  *
                    180:  *       CurrentPc - Supplies the current pc at the time the extension is
                    181:  *           called.
                    182:  *
                    183:  *       lpExtensionApis - Supplies the address of the functions callable
                    184:  *           by this extension.
                    185:  *
                    186:  *       lpArgumentString - the float to display
                    187:  *
                    188:  *   Return Value:
                    189:  *
                    190:  *       None.
                    191:  *
                    192:  ***************************************************************************/
                    193: VOID dumplog(
                    194:     HANDLE hCurrentProcess,
                    195:     HANDLE hCurrentThread,
                    196:     DWORD dwCurrentPc,
                    197:     PNTSD_EXTENSION_APIS lpExtensionApis,
                    198:     LPSTR lpArgumentString)
                    199: {
                    200: 
                    201: #if DBG
                    202: 
                    203:     PNTSD_OUTPUT_ROUTINE lpOutputRoutine;
                    204:     PNTSD_GET_EXPRESSION lpGetExpressionRoutine;
                    205:     PNTSD_GET_SYMBOL     lpGetSymbolRoutine;
                    206: 
                    207:     ULONG       cFrom;
                    208:     ULONG       cTo;
                    209:     ULONG       cCurrent;
                    210:     DBGLOG*     plogOriginal;
                    211:     DBGLOG*     plog;
                    212:     ULONG       ulCurrent;
                    213:     ULONG       ulEnd;
                    214:     CHAR*       pchEnd;
                    215:     CHAR*       pch;
                    216: 
                    217:     UNREFERENCED_PARAMETER(hCurrentThread);
                    218:     UNREFERENCED_PARAMETER(dwCurrentPc);
                    219: 
                    220:     lpOutputRoutine        = lpExtensionApis->lpOutputRoutine;
                    221:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
                    222:     lpGetSymbolRoutine     = lpExtensionApis->lpGetSymbolRoutine;
                    223: 
                    224:     lpOutputRoutine("!s3.dumplog [<from#> [<to#>]]\n\n");
                    225: 
                    226:     // Evaluate the argument string to get the address of
                    227:     // the Line Structure
                    228: 
                    229:     cTo   = 1;              // Defaults
                    230:     cFrom = 20;
                    231: 
                    232:     pch = strpbrk(lpArgumentString, "0123456789");
                    233:     if (pch != NULL)        // Use defaults if no args given
                    234:     {
                    235:         cFrom = atoi(pch);
                    236:         pch = strchr(pch, ' ');
                    237:         if (pch != NULL)
                    238:         {
                    239:             pch = strpbrk(pch, "0123456789");
                    240:             if (pch != NULL)
                    241:                 cTo = atoi(pch);
                    242:         }
                    243:     }
                    244: 
                    245:     // Do some parameter validation, then read the log into the
                    246:     // debugger process's address space:
                    247: 
                    248:     if (cTo >= cFrom)
                    249:         cTo = cFrom;
                    250: 
                    251:     if (cTo < 1)
                    252:     {
                    253:         cTo   = 1;
                    254:         cFrom = 1;
                    255:     }
                    256: 
                    257:     GetAddress(plogOriginal, "glog");
                    258: 
                    259:     if (!ReadProcessMemory(hCurrentProcess,
                    260:                           (LPVOID) &(plogOriginal->ulCurrent),
                    261:                           &ulCurrent,
                    262:                           sizeof(ulCurrent),
                    263:                           NULL))
                    264:         return;
                    265: 
                    266:     if (!ReadProcessMemory(hCurrentProcess,
                    267:                           (LPVOID) &(plogOriginal->ulEnd),
                    268:                           &ulEnd,
                    269:                           sizeof(ulEnd),
                    270:                           NULL))
                    271:         return;
                    272: 
                    273:     if (ulCurrent == 0 && ulEnd == 0)
                    274:     {
                    275:         lpOutputRoutine("Log empty\n\n");
                    276:         return;
                    277:     }
                    278: 
                    279:     plog = (DBGLOG*) LocalAlloc(0, sizeof(DBGLOG) + 1);
                    280: 
                    281:     if (plog == NULL) {
                    282:         lpOutputRoutine("Couldn't allocate temporary buffer!\n");
                    283:         return;
                    284:     }
                    285: 
                    286:     if (!ReadProcessMemory(hCurrentProcess,
                    287:                           (LPVOID) &(plogOriginal->achBuf[0]),
                    288:                           &plog->achBuf[1],
                    289:                           LOG_SIZE_IN_BYTES,
                    290:                           NULL))
                    291:         return;
                    292: 
                    293:     // Mark the first byte in the buffer as being a zero, because
                    294:     // we're going to search backwards through the buffer for zeroes,
                    295:     // and we'll want to stop when we get to the beginning:
                    296: 
                    297:     plog->achBuf[0] = 0;
                    298:     ulCurrent++;
                    299:     ulEnd++;
                    300: 
                    301:     // Find the start string by going backwards through the buffer
                    302:     // and counting strings until the count becomes equal to 'cFrom':
                    303: 
                    304:     cCurrent = 0;
                    305:     pch      = &plog->achBuf[ulCurrent - 1];
                    306:     pchEnd   = &plog->achBuf[0];
                    307: 
                    308:     while (TRUE)
                    309:     {
                    310:         if (*(--pch) == 0)
                    311:         {
                    312:             cCurrent++;
                    313:             if (--cFrom == 0)
                    314:                 break;
                    315: 
                    316:             if (pch == &plog->achBuf[ulCurrent - 1])
                    317:                 break;         // We're back to where we started!
                    318:         }
                    319: 
                    320:         // Make sure we wrap the end of the buffer:
                    321: 
                    322:         if (pch <= pchEnd)
                    323:         {
                    324:             if (ulCurrent >= ulEnd)
                    325:                 break;
                    326: 
                    327:             pch = &plog->achBuf[ulEnd - 1];
                    328:         }
                    329:     }
                    330: 
                    331:     // pch is pointing to zero byte before our start string:
                    332: 
                    333:     pch++;
                    334: 
                    335:     // Output the strings:
                    336: 
                    337:     pchEnd = &plog->achBuf[max(ulEnd, ulCurrent)];
                    338: 
                    339:     while (cCurrent >= cTo)
                    340:     {
                    341:         lpOutputRoutine("-%li: %s", cCurrent, pch);
                    342:         pch += strlen(pch) + 1;
                    343:         cCurrent--;
                    344: 
                    345:         // Make sure we wrap when we get to the end of the buffer:
                    346: 
                    347:         if (pch >= pchEnd)
                    348:             pch = &plog->achBuf[1];     // First char in buffer is a NULL
                    349:     }
                    350: 
                    351:     lpOutputRoutine("\n");
                    352:     LocalFree(plog);
                    353: 
                    354: #endif // DBG
                    355: 
                    356:     return;
                    357: }
                    358: 
                    359: /*****************************************************************************
                    360:  *
                    361:  *   Routine Description:
                    362:  *
                    363:  *       This function is called as an NTSD extension to dump
                    364:  *       the CRTC registers of an S3 chip
                    365:  *
                    366:  *   Arguments:
                    367:  *
                    368:  *       hCurrentProcess - Supplies a handle to the current process (at the
                    369:  *           time the extension was called).
                    370:  *
                    371:  *       hCurrentThread - Supplies a handle to the current thread (at the
                    372:  *           time the extension was called).
                    373:  *
                    374:  *       CurrentPc - Supplies the current pc at the time the extension is
                    375:  *           called.
                    376:  *
                    377:  *       lpExtensionApis - Supplies the address of the functions callable
                    378:  *           by this extension.
                    379:  *
                    380:  *       lpArgumentString - the float to display
                    381:  *
                    382:  *   Return Value:
                    383:  *
                    384:  *       None.
                    385:  *
                    386:  ***************************************************************************/
                    387: VOID dcrtc(
                    388:     HANDLE hCurrentProcess,
                    389:     HANDLE hCurrentThread,
                    390:     DWORD dwCurrentPc,
                    391:     PNTSD_EXTENSION_APIS lpExtensionApis,
                    392:     LPSTR lpArgumentString)
                    393: {
                    394: 
                    395: #if DBG
                    396: 
                    397:     PNTSD_OUTPUT_ROUTINE lpOutputRoutine;
                    398:     PNTSD_GET_EXPRESSION lpGetExpressionRoutine;
                    399:     PNTSD_GET_SYMBOL     lpGetSymbolRoutine;
                    400:     CHAR                 Symbol[64];
                    401:     DWORD                Displacement;
                    402:     BOOL                 b;
                    403: 
                    404:     BYTE    szBuff[256];
                    405:     INT     i;
                    406:     BYTE    ajCrtc[0x65];
                    407:     DWORD   dwAddr;
                    408: 
                    409:     UNREFERENCED_PARAMETER(hCurrentThread);
                    410:     UNREFERENCED_PARAMETER(dwCurrentPc);
                    411: 
                    412:     lpOutputRoutine        = lpExtensionApis->lpOutputRoutine;
                    413:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
                    414:     lpGetSymbolRoutine     = lpExtensionApis->lpGetSymbolRoutine;
                    415: 
                    416:     //
                    417:     // Evaluate the argument string to get the address of
                    418:     // the Line Structure
                    419:     //
                    420: 
                    421:     dwAddr = (lpGetExpressionRoutine)(lpArgumentString);
                    422:     if (!dwAddr) {
                    423:         return;
                    424:     }
                    425: 
                    426:     //
                    427:     // Get the symbolic name
                    428:     //
                    429: 
                    430:     (lpGetSymbolRoutine)((LPVOID)dwAddr, Symbol, &Displacement);
                    431: 
                    432:     //
                    433:     // Read from the debuggees address space into our own.
                    434:     //
                    435: 
                    436:     b = ReadProcessMemory(hCurrentProcess,
                    437:                           (LPVOID)dwAddr,
                    438:                           ajCrtc,
                    439:                           sizeof(ajCrtc),
                    440:                           NULL);
                    441: 
                    442:     if (!b) {
                    443:         return;
                    444:     }
                    445: 
                    446:     for (i = 0; i < 0x65; i++)
                    447:     {
                    448:         sprintf(szBuff, "%4.4x: %2.2x\n", i, ajCrtc[i]);
                    449:         (lpOutputRoutine)(szBuff);
                    450:     }
                    451: 
                    452: 
                    453: #endif // DBG
                    454: 
                    455:     return;
                    456: }
                    457: 
                    458: 
                    459: 
                    460: 
                    461: 
                    462: /*****************************************************************************
                    463:  *
                    464:  *   Routine Description:
                    465:  *
                    466:  *       This function is called as an NTSD extension to dump a LineState
                    467:  *
                    468:  *   Arguments:
                    469:  *
                    470:  *       hCurrentProcess - Supplies a handle to the current process (at the
                    471:  *           time the extension was called).
                    472:  *
                    473:  *       hCurrentThread - Supplies a handle to the current thread (at the
                    474:  *           time the extension was called).
                    475:  *
                    476:  *       CurrentPc - Supplies the current pc at the time the extension is
                    477:  *           called.
                    478:  *
                    479:  *       lpExtensionApis - Supplies the address of the functions callable
                    480:  *           by this extension.
                    481:  *
                    482:  *       lpArgumentString - the float to display
                    483:  *
                    484:  *   Return Value:
                    485:  *
                    486:  *       None.
                    487:  *
                    488:  ***************************************************************************/
                    489: VOID dls(
                    490:     HANDLE hCurrentProcess,
                    491:     HANDLE hCurrentThread,
                    492:     DWORD dwCurrentPc,
                    493:     PNTSD_EXTENSION_APIS lpExtensionApis,
                    494:     LPSTR lpArgumentString)
                    495: {
                    496: 
                    497: #if DBG
                    498: 
                    499:     PNTSD_OUTPUT_ROUTINE lpOutputRoutine;
                    500:     PNTSD_GET_EXPRESSION lpGetExpressionRoutine;
                    501:     PNTSD_GET_SYMBOL     lpGetSymbolRoutine;
                    502:     CHAR                 Symbol[64];
                    503:     DWORD                Displacement;
                    504:     BOOL                 b;
                    505: 
                    506:     DWORD       dwAddr;
                    507:     LINESTATE   ls;
                    508:     BYTE        szBuff[256];
                    509: 
                    510:     UNREFERENCED_PARAMETER(hCurrentThread);
                    511:     UNREFERENCED_PARAMETER(dwCurrentPc);
                    512: 
                    513:     lpOutputRoutine        = lpExtensionApis->lpOutputRoutine;
                    514:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
                    515:     lpGetSymbolRoutine     = lpExtensionApis->lpGetSymbolRoutine;
                    516: 
                    517:     //
                    518:     // Evaluate the argument string to get the address of
                    519:     // the Line Structure
                    520:     //
                    521: 
                    522:     dwAddr = (lpGetExpressionRoutine)(lpArgumentString);
                    523:     if (!dwAddr) {
                    524:         return;
                    525:     }
                    526: 
                    527:     //
                    528:     // Get the symbolic name
                    529:     //
                    530: 
                    531:     (lpGetSymbolRoutine)((LPVOID)dwAddr, Symbol, &Displacement);
                    532: 
                    533:     //
                    534:     // Read from the debuggees address space into our own.
                    535:     //
                    536: 
                    537:     b = ReadProcessMemory(hCurrentProcess,
                    538:                           (LPVOID)dwAddr,
                    539:                           &ls,
                    540:                           sizeof(ls),
                    541:                           NULL);
                    542: 
                    543:     if (!b) {
                    544:         return;
                    545:     }
                    546: 
                    547: 
                    548:     sprintf(szBuff, "LineState: %8.8x\n", dwAddr);
                    549:     (lpOutputRoutine)(szBuff);
                    550: 
                    551:     sprintf(szBuff, "\tjAnd            : %2.2x\n", ls.jAnd);
                    552:     (lpOutputRoutine)(szBuff);
                    553: 
                    554:     sprintf(szBuff, "\tjXor            : %2.2x\n", ls.jXor);
                    555:     (lpOutputRoutine)(szBuff);
                    556: 
                    557:     sprintf(szBuff, "\tpspStart        : %4.4x\n", ls.pspStart);
                    558:     (lpOutputRoutine)(szBuff);
                    559: 
                    560:     sprintf(szBuff, "\tpspEnd          : %4.4x\n", ls.pspEnd);
                    561:     (lpOutputRoutine)(szBuff);
                    562: 
                    563:     sprintf(szBuff, "\tpsp             : %4.4x\n", ls.psp);
                    564:     (lpOutputRoutine)(szBuff);
                    565: 
                    566:     sprintf(szBuff, "\tspRemaining     : %4.4x\n", ls.spRemaining);
                    567:     (lpOutputRoutine)(szBuff);
                    568: 
                    569:     sprintf(szBuff, "\tspTotal         : %4.4x\n", ls.spTotal);
                    570:     (lpOutputRoutine)(szBuff);
                    571: 
                    572:     sprintf(szBuff, "\tspTotal2        : %4.4x\n", ls.spTotal2);
                    573:     (lpOutputRoutine)(szBuff);
                    574: 
                    575:     sprintf(szBuff, "\tspNext          : %4.4x\n", ls.spNext);
                    576:     (lpOutputRoutine)(szBuff);
                    577: 
                    578:     sprintf(szBuff, "\tspComplex       : %4.4x\n", ls.spComplex);
                    579:     (lpOutputRoutine)(szBuff);
                    580: 
                    581:     sprintf(szBuff, "\taspRtoL         : %4.4x\n", ls.aspRtoL);
                    582:     (lpOutputRoutine)(szBuff);
                    583: 
                    584:     sprintf(szBuff, "\taspLtoR         : %4.4x\n", ls.aspLtoR);
                    585:     (lpOutputRoutine)(szBuff);
                    586: 
                    587:     sprintf(szBuff, "\tulStyleMask     : %4.4x\n", ls.ulStyleMask);
                    588:     (lpOutputRoutine)(szBuff);
                    589: 
                    590:     sprintf(szBuff, "\txyDensity       : %4.4x\n", ls.xyDensity);
                    591:     (lpOutputRoutine)(szBuff);
                    592: 
                    593:     sprintf(szBuff, "\tcStyle          : %4.4x\n", ls.cStyle);
                    594:     (lpOutputRoutine)(szBuff);
                    595: 
                    596:     sprintf(szBuff, "\tulStyleMaskLtoR : %4.4x\n", ls.ulStyleMaskLtoR);
                    597:     (lpOutputRoutine)(szBuff);
                    598: 
                    599:     sprintf(szBuff, "\tulStyleMaskRtoL : %4.4x\n", ls.ulStyleMaskRtoL);
                    600:     (lpOutputRoutine)(szBuff);
                    601: 
                    602:     sprintf(szBuff, "\tulStartMask     : %4.4x\n", ls.ulStartMask);
                    603:     (lpOutputRoutine)(szBuff);
                    604: 
                    605: #endif // DBG
                    606: 
                    607:     return;
                    608: }
                    609: 
                    610: /*****************************************************************************
                    611:  *
                    612:  *   Routine Description:
                    613:  *
                    614:  *       This function is called as an NTSD extension to dump a dword
                    615:  *       (It's real function is as a prototype for other NT extensions.)
                    616:  *
                    617:  *   Arguments:
                    618:  *
                    619:  *       hCurrentProcess - Supplies a handle to the current process (at the
                    620:  *           time the extension was called).
                    621:  *
                    622:  *       hCurrentThread - Supplies a handle to the current thread (at the
                    623:  *           time the extension was called).
                    624:  *
                    625:  *       CurrentPc - Supplies the current pc at the time the extension is
                    626:  *           called.
                    627:  *
                    628:  *       lpExtensionApis - Supplies the address of the functions callable
                    629:  *           by this extension.
                    630:  *
                    631:  *       lpArgumentString - the float to display
                    632:  *
                    633:  *   Return Value:
                    634:  *
                    635:  *       None.
                    636:  *
                    637:  ***************************************************************************/
                    638: VOID dd(
                    639:     HANDLE hCurrentProcess,
                    640:     HANDLE hCurrentThread,
                    641:     DWORD dwCurrentPc,
                    642:     PNTSD_EXTENSION_APIS lpExtensionApis,
                    643:     LPSTR lpArgumentString)
                    644: {
                    645: 
                    646: #if DBG
                    647: 
                    648:     PNTSD_OUTPUT_ROUTINE lpOutputRoutine;
                    649:     PNTSD_GET_EXPRESSION lpGetExpressionRoutine;
                    650:     PNTSD_GET_SYMBOL     lpGetSymbolRoutine;
                    651:     CHAR                 Symbol[64];
                    652:     DWORD                Displacement;
                    653:     BOOL                 b;
                    654: 
                    655:     DWORD   dwAddr;
                    656:     DWORD   val;
                    657:     BYTE    szBuff[256];
                    658: 
                    659:     UNREFERENCED_PARAMETER(hCurrentThread);
                    660:     UNREFERENCED_PARAMETER(dwCurrentPc);
                    661: 
                    662:     lpOutputRoutine        = lpExtensionApis->lpOutputRoutine;
                    663:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
                    664:     lpGetSymbolRoutine     = lpExtensionApis->lpGetSymbolRoutine;
                    665: 
                    666:     //
                    667:     // Evaluate the argument string to get the address of
                    668:     // the Line Structure
                    669:     //
                    670: 
                    671:     dwAddr = (lpGetExpressionRoutine)(lpArgumentString);
                    672:     if (!dwAddr) {
                    673:         return;
                    674:     }
                    675: 
                    676:     //
                    677:     // Get the symbolic name
                    678:     //
                    679: 
                    680:     (lpGetSymbolRoutine)((LPVOID)dwAddr, Symbol, &Displacement);
                    681: 
                    682:     //
                    683:     // Read from the debuggees address space into our own.
                    684:     //
                    685: 
                    686:     b = ReadProcessMemory(hCurrentProcess,
                    687:                           (LPVOID)dwAddr,
                    688:                           &val,
                    689:                           sizeof(val),
                    690:                           NULL);
                    691: 
                    692:     if (!b) {
                    693:         return;
                    694:     }
                    695: 
                    696:     sprintf(szBuff, "%8.8x: %8.8x\n", dwAddr, val);
                    697:     (lpOutputRoutine)(szBuff);
                    698: #endif // DBG
                    699: 
                    700:     return;
                    701: }
                    702: 

unix.superglobalmegacorp.com

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