Annotation of ntddk/src/krnldbg/kdexts/ntkdexts.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1990  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     kdexts.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This function contains some example KD debugger extensions
        !            12: 
        !            13: Author:
        !            14: 
        !            15:     John Vert (jvert) 6-Aug-1992
        !            16: 
        !            17: Revision History:
        !            18: 
        !            19: --*/
        !            20: 
        !            21: #include <ntddk.h>
        !            22: #include <windef.h>
        !            23: #include <ntkdexts.h>
        !            24: #include <stdlib.h>
        !            25: #include <string.h>
        !            26: 
        !            27: CHAR igrepLastPattern[256];
        !            28: DWORD igrepSearchStartAddress;
        !            29: DWORD igrepLastPc;
        !            30: 
        !            31: 
        !            32: VOID
        !            33: igrep(
        !            34:     DWORD dwCurrentPc,
        !            35:     PNTKD_EXTENSION_APIS lpExtensionApis,
        !            36:     LPSTR lpArgumentString
        !            37:     )
        !            38: 
        !            39: /*++
        !            40: 
        !            41: Routine Description:
        !            42: 
        !            43:     This function is called as a KD extension to grep the instruction
        !            44:     stream for a particular pattern.
        !            45: 
        !            46:     Called as:
        !            47: 
        !            48:         !kdext.igrep [pattern [expression]]
        !            49: 
        !            50:     If a pattern is not given, the last pattern is used.  If expression
        !            51:     is not given, the last hit address is used.
        !            52: 
        !            53: Arguments:
        !            54: 
        !            55:     CurrentPc - Supplies the current pc at the time the extension is
        !            56:         called.
        !            57: 
        !            58:     lpExtensionApis - Supplies the address of the functions callable
        !            59:         by this extension.
        !            60: 
        !            61:     lpArgumentString - Supplies the pattern and expression for this
        !            62:         command.
        !            63: 
        !            64: 
        !            65: Return Value:
        !            66: 
        !            67:     None.
        !            68: 
        !            69: --*/
        !            70: 
        !            71: {
        !            72:     DWORD dwNextGrepAddr;
        !            73:     DWORD dwCurrGrepAddr;
        !            74:     CHAR SourceLine[256];
        !            75:     BOOL NewPc;
        !            76:     DWORD d;
        !            77:     PNTKD_OUTPUT_ROUTINE lpOutputRoutine;
        !            78:     PNTKD_GET_EXPRESSION lpGetExpressionRoutine;
        !            79:     PNTKD_GET_SYMBOL lpGetSymbolRoutine;
        !            80:     PNTKD_DISASM lpDisasmRoutine;
        !            81:     PNTKD_CHECK_CONTROL_C lpCheckControlCRoutine;
        !            82:     LPSTR pc;
        !            83:     LPSTR Pattern;
        !            84:     LPSTR Expression;
        !            85:     CHAR Symbol[64];
        !            86:     DWORD Displacement;
        !            87: 
        !            88:     lpOutputRoutine = lpExtensionApis->lpOutputRoutine;
        !            89:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
        !            90:     lpGetSymbolRoutine = lpExtensionApis->lpGetSymbolRoutine;
        !            91:     lpDisasmRoutine = lpExtensionApis->lpDisasmRoutine;
        !            92:     lpCheckControlCRoutine = lpExtensionApis->lpCheckControlCRoutine;
        !            93: 
        !            94:     if ( igrepLastPc && igrepLastPc == dwCurrentPc ) {
        !            95:         NewPc = FALSE;
        !            96:         }
        !            97:     else {
        !            98:         igrepLastPc = dwCurrentPc;
        !            99:         NewPc = TRUE;
        !           100:         }
        !           101: 
        !           102:     //
        !           103:     // check for pattern.
        !           104:     //
        !           105: 
        !           106:     pc = lpArgumentString;
        !           107:     Pattern = NULL;
        !           108:     Expression = NULL;
        !           109:     if ( *pc ) {
        !           110:         Pattern = pc;
        !           111:         while (*pc > ' ') {
        !           112:                 pc++;
        !           113:             }
        !           114: 
        !           115:         //
        !           116:         // check for an expression
        !           117:         //
        !           118: 
        !           119:         if ( *pc != '\0' ) {
        !           120:             *pc = '\0';
        !           121:             pc++;
        !           122:             if ( *pc <= ' ') {
        !           123:                 while (*pc <= ' '){
        !           124:                     pc++;
        !           125:                     }
        !           126:                 }
        !           127:             if ( *pc ) {
        !           128:                 Expression = pc;
        !           129:                 }
        !           130:             }
        !           131:         }
        !           132: 
        !           133:     if ( Pattern ) {
        !           134:         strcpy(igrepLastPattern,Pattern);
        !           135: 
        !           136:         if ( Expression ) {
        !           137:             igrepSearchStartAddress = (lpGetExpressionRoutine)(Expression);
        !           138:             if ( !igrepSearchStartAddress ) {
        !           139:                 igrepSearchStartAddress = igrepLastPc;
        !           140:                 return;
        !           141:                 }
        !           142:             }
        !           143:         else {
        !           144:             igrepSearchStartAddress = igrepLastPc;
        !           145:             }
        !           146:         }
        !           147: 
        !           148:     dwNextGrepAddr = igrepSearchStartAddress;
        !           149:     dwCurrGrepAddr = dwNextGrepAddr;
        !           150:     d = (lpDisasmRoutine)(&dwNextGrepAddr,SourceLine,FALSE);
        !           151:     while(d) {
        !           152:         if (strstr(SourceLine,igrepLastPattern)) {
        !           153:             igrepSearchStartAddress = dwNextGrepAddr;
        !           154:             (lpGetSymbolRoutine)((LPVOID)dwCurrGrepAddr,Symbol,&Displacement);
        !           155:             (lpOutputRoutine)("%s",SourceLine);
        !           156:             return;
        !           157:             }
        !           158:         if ((lpCheckControlCRoutine)()) {
        !           159:             return;
        !           160:             }
        !           161:         dwCurrGrepAddr = dwNextGrepAddr;
        !           162:         d = (lpDisasmRoutine)(&dwNextGrepAddr,SourceLine,FALSE);
        !           163:         }
        !           164: }
        !           165: 
        !           166: VOID
        !           167: str(
        !           168:     DWORD dwCurrentPc,
        !           169:     PNTKD_EXTENSION_APIS lpExtensionApis,
        !           170:     LPSTR lpArgumentString
        !           171:     )
        !           172: 
        !           173: /*++
        !           174: 
        !           175: Routine Description:
        !           176: 
        !           177:     This function is called as a KD extension to format and dump
        !           178:     counted (ansi) string.
        !           179: 
        !           180: Arguments:
        !           181: 
        !           182:     CurrentPc - Supplies the current pc at the time the extension is
        !           183:         called.
        !           184: 
        !           185:     lpExtensionApis - Supplies the address of the functions callable
        !           186:         by this extension.
        !           187: 
        !           188:     lpArgumentString - Supplies the asciiz string that describes the
        !           189:         ansi string to be dumped.
        !           190: 
        !           191: Return Value:
        !           192: 
        !           193:     None.
        !           194: 
        !           195: --*/
        !           196: 
        !           197: {
        !           198:     ANSI_STRING AnsiString;
        !           199:     DWORD dwAddrString;
        !           200:     CHAR Symbol[64];
        !           201:     LPSTR StringData;
        !           202:     DWORD Displacement;
        !           203:     BOOL b;
        !           204:     PNTKD_OUTPUT_ROUTINE lpOutputRoutine;
        !           205:     PNTKD_GET_EXPRESSION lpGetExpressionRoutine;
        !           206:     PNTKD_GET_SYMBOL lpGetSymbolRoutine;
        !           207:     PNTKD_READ_VIRTUAL_MEMORY lpReadMemoryRoutine;
        !           208: 
        !           209: 
        !           210:     lpOutputRoutine = lpExtensionApis->lpOutputRoutine;
        !           211:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
        !           212:     lpGetSymbolRoutine = lpExtensionApis->lpGetSymbolRoutine;
        !           213:     lpReadMemoryRoutine = lpExtensionApis->lpReadVirtualMemRoutine;
        !           214: 
        !           215:     //
        !           216:     // Evaluate the argument string to get the address of
        !           217:     // the string to dump.
        !           218:     //
        !           219: 
        !           220:     dwAddrString = (lpGetExpressionRoutine)(lpArgumentString);
        !           221:     if ( !dwAddrString ) {
        !           222:         return;
        !           223:         }
        !           224: 
        !           225: 
        !           226:     //
        !           227:     // Get the symbolic name of the string
        !           228:     //
        !           229: 
        !           230:     (lpGetSymbolRoutine)((LPVOID)dwAddrString,Symbol,&Displacement);
        !           231: 
        !           232:     //
        !           233:     // Read the string from the debuggees address space into our
        !           234:     // own.
        !           235: 
        !           236:     b = (lpReadMemoryRoutine)((LPVOID)dwAddrString,
        !           237:                               &AnsiString,
        !           238:                               sizeof(AnsiString),
        !           239:                               NULL);
        !           240: 
        !           241:     if ( !b ) {
        !           242:         return;
        !           243:     }
        !           244: 
        !           245:     StringData = malloc(AnsiString.Length+1);
        !           246: 
        !           247:     b = (lpReadMemoryRoutine)((LPVOID)AnsiString.Buffer,
        !           248:                               StringData,
        !           249:                               AnsiString.Length,
        !           250:                               NULL);
        !           251:     if ( !b ) {
        !           252:         free(StringData);
        !           253:         return;
        !           254:         }
        !           255: 
        !           256:     (lpOutputRoutine)(
        !           257:         "String(%d,%d) %s+%lx at %lx: %s\n",
        !           258:         AnsiString.Length,
        !           259:         AnsiString.MaximumLength,
        !           260:         Symbol,
        !           261:         Displacement,
        !           262:         dwAddrString,
        !           263:         StringData
        !           264:         );
        !           265: 
        !           266:     free(StringData);
        !           267: }
        !           268: 
        !           269: VOID
        !           270: ustr(
        !           271:     DWORD dwCurrentPc,
        !           272:     PNTKD_EXTENSION_APIS lpExtensionApis,
        !           273:     LPSTR lpArgumentString
        !           274:     )
        !           275: 
        !           276: /*++
        !           277: 
        !           278: Routine Description:
        !           279: 
        !           280:     This function is called as a KD extension to format and dump
        !           281:     counted unicode string.
        !           282: 
        !           283: Arguments:
        !           284: 
        !           285:     CurrentPc - Supplies the current pc at the time the extension is
        !           286:         called.
        !           287: 
        !           288:     lpExtensionApis - Supplies the address of the functions callable
        !           289:         by this extension.
        !           290: 
        !           291:     lpArgumentString - Supplies the asciiz string that describes the
        !           292:         ansi string to be dumped.
        !           293: 
        !           294: Return Value:
        !           295: 
        !           296:     None.
        !           297: 
        !           298: --*/
        !           299: 
        !           300: {
        !           301:     ANSI_STRING AnsiString;
        !           302:     UNICODE_STRING UnicodeString;
        !           303:     DWORD dwAddrString;
        !           304:     CHAR Symbol[64];
        !           305:     LPSTR StringData;
        !           306:     DWORD Displacement;
        !           307:     BOOL b;
        !           308:     PNTKD_OUTPUT_ROUTINE lpOutputRoutine;
        !           309:     PNTKD_GET_EXPRESSION lpGetExpressionRoutine;
        !           310:     PNTKD_GET_SYMBOL lpGetSymbolRoutine;
        !           311:     PNTKD_READ_VIRTUAL_MEMORY lpReadMemoryRoutine;
        !           312: 
        !           313:     lpOutputRoutine = lpExtensionApis->lpOutputRoutine;
        !           314:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
        !           315:     lpGetSymbolRoutine = lpExtensionApis->lpGetSymbolRoutine;
        !           316:     lpReadMemoryRoutine = lpExtensionApis->lpReadVirtualMemRoutine;
        !           317: 
        !           318:     //
        !           319:     // Evaluate the argument string to get the address of
        !           320:     // the string to dump.
        !           321:     //
        !           322: 
        !           323:     dwAddrString = (lpGetExpressionRoutine)(lpArgumentString);
        !           324:     if ( !dwAddrString ) {
        !           325:         return;
        !           326:         }
        !           327: 
        !           328: 
        !           329:     //
        !           330:     // Get the symbolic name of the string
        !           331:     //
        !           332: 
        !           333:     (lpGetSymbolRoutine)((LPVOID)dwAddrString,Symbol,&Displacement);
        !           334: 
        !           335:     //
        !           336:     // Read the string from the debuggees address space into our
        !           337:     // own.
        !           338: 
        !           339:     b = (lpReadMemoryRoutine)((LPVOID)dwAddrString,
        !           340:                               &UnicodeString,
        !           341:                               sizeof(UnicodeString),
        !           342:                               NULL);
        !           343: 
        !           344:     if ( !b ) {
        !           345:         return;
        !           346:     }
        !           347: 
        !           348:     StringData = malloc(UnicodeString.Length+sizeof(UNICODE_NULL));
        !           349: 
        !           350:     b = (lpReadMemoryRoutine)((LPVOID)UnicodeString.Buffer,
        !           351:                               StringData,
        !           352:                               UnicodeString.Length,
        !           353:                               NULL);
        !           354:     if ( !b ) {
        !           355:         free(StringData);
        !           356:         return;
        !           357:     }
        !           358: 
        !           359:     UnicodeString.Buffer = (PWSTR)StringData;
        !           360:     UnicodeString.MaximumLength = UnicodeString.Length+(USHORT)sizeof(UNICODE_NULL);
        !           361: 
        !           362:     RtlUnicodeStringToAnsiString(&AnsiString,&UnicodeString,TRUE);
        !           363:     free(StringData);
        !           364: 
        !           365:     (lpOutputRoutine)(
        !           366:         "String(%d,%d) %s+%lx at %lx: %s\n",
        !           367:         UnicodeString.Length,
        !           368:         UnicodeString.MaximumLength,
        !           369:         Symbol,
        !           370:         Displacement,
        !           371:         dwAddrString,
        !           372:         AnsiString.Buffer
        !           373:         );
        !           374: 
        !           375:     RtlFreeAnsiString(&AnsiString);
        !           376: }
        !           377: 
        !           378: VOID
        !           379: obja(
        !           380:     DWORD dwCurrentPc,
        !           381:     PNTKD_EXTENSION_APIS lpExtensionApis,
        !           382:     LPSTR lpArgumentString
        !           383:     )
        !           384: 
        !           385: /*++
        !           386: 
        !           387: Routine Description:
        !           388: 
        !           389:     This function is called as a KD extension to format and dump
        !           390:     an object attributes structure.
        !           391: 
        !           392: Arguments:
        !           393: 
        !           394:     CurrentPc - Supplies the current pc at the time the extension is
        !           395:         called.
        !           396: 
        !           397:     lpExtensionApis - Supplies the address of the functions callable
        !           398:         by this extension.
        !           399: 
        !           400:     lpArgumentString - Supplies the asciiz string that describes the
        !           401:         ansi string to be dumped.
        !           402: 
        !           403: Return Value:
        !           404: 
        !           405:     None.
        !           406: 
        !           407: --*/
        !           408: 
        !           409: {
        !           410:     UNICODE_STRING UnicodeString;
        !           411:     DWORD dwAddrObja;
        !           412:     OBJECT_ATTRIBUTES Obja;
        !           413:     DWORD dwAddrString;
        !           414:     CHAR Symbol[64];
        !           415:     LPSTR StringData;
        !           416:     DWORD Displacement;
        !           417:     BOOL b;
        !           418:     PNTKD_OUTPUT_ROUTINE lpOutputRoutine;
        !           419:     PNTKD_GET_EXPRESSION lpGetExpressionRoutine;
        !           420:     PNTKD_GET_SYMBOL lpGetSymbolRoutine;
        !           421:     PNTKD_READ_VIRTUAL_MEMORY lpReadMemoryRoutine;
        !           422: 
        !           423:     lpOutputRoutine = lpExtensionApis->lpOutputRoutine;
        !           424:     lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
        !           425:     lpGetSymbolRoutine = lpExtensionApis->lpGetSymbolRoutine;
        !           426:     lpReadMemoryRoutine = lpExtensionApis->lpReadVirtualMemRoutine;
        !           427: 
        !           428:     //
        !           429:     // Evaluate the argument string to get the address of
        !           430:     // the Obja to dump.
        !           431:     //
        !           432: 
        !           433:     dwAddrObja = (lpGetExpressionRoutine)(lpArgumentString);
        !           434:     if ( !dwAddrObja ) {
        !           435:         return;
        !           436:         }
        !           437: 
        !           438: 
        !           439:     //
        !           440:     // Get the symbolic name of the Obja
        !           441:     //
        !           442: 
        !           443:     (lpGetSymbolRoutine)((LPVOID)dwAddrObja,Symbol,&Displacement);
        !           444: 
        !           445:     //
        !           446:     // Read the obja from the debuggees address space into our
        !           447:     // own.
        !           448: 
        !           449:     b = (lpReadMemoryRoutine)((LPVOID)dwAddrObja,
        !           450:                               &Obja,
        !           451:                               sizeof(Obja),
        !           452:                               NULL);
        !           453:     if ( !b ) {
        !           454:         return;
        !           455:     }
        !           456:     StringData = NULL;
        !           457:     if ( Obja.ObjectName ) {
        !           458:         dwAddrString = (DWORD)Obja.ObjectName;
        !           459:         b = (lpReadMemoryRoutine)((LPVOID)dwAddrString,
        !           460:                                   &UnicodeString,
        !           461:                                   sizeof(UnicodeString),
        !           462:                                   NULL);
        !           463:         if ( !b ) {
        !           464:             return;
        !           465:         }
        !           466: 
        !           467:         StringData = malloc(UnicodeString.Length+sizeof(UNICODE_NULL));
        !           468: 
        !           469:         b = (lpReadMemoryRoutine)((LPVOID)UnicodeString.Buffer,
        !           470:                                   StringData,
        !           471:                                   UnicodeString.Length,
        !           472:                                   NULL);
        !           473:         if ( !b ) {
        !           474:             free(StringData);
        !           475:             return;
        !           476:         }
        !           477:         UnicodeString.Buffer = (PWSTR)StringData;
        !           478:         UnicodeString.MaximumLength = UnicodeString.Length+(USHORT)sizeof(UNICODE_NULL);
        !           479:     }
        !           480: 
        !           481:     //
        !           482:     // We got the object name in UnicodeString. StringData is NULL if no name.
        !           483:     //
        !           484: 
        !           485:     (lpOutputRoutine)(
        !           486:         "Obja %s+%lx at %lx:\n",
        !           487:         Symbol,
        !           488:         Displacement,
        !           489:         dwAddrObja
        !           490:         );
        !           491:     if ( StringData ) {
        !           492:         (lpOutputRoutine)("\t%s is %ws\n",
        !           493:             Obja.RootDirectory ? "Relative Name" : "Full Name",
        !           494:             UnicodeString.Buffer
        !           495:             );
        !           496:         free(StringData);
        !           497:         }
        !           498:     if ( Obja.Attributes ) {
        !           499:             if ( Obja.Attributes & OBJ_INHERIT ) {
        !           500:                 (lpOutputRoutine)("\tOBJ_INHERIT\n");
        !           501:                 }
        !           502:             if ( Obja.Attributes & OBJ_PERMANENT ) {
        !           503:                 (lpOutputRoutine)("\tOBJ_PERMANENT\n");
        !           504:                 }
        !           505:             if ( Obja.Attributes & OBJ_EXCLUSIVE ) {
        !           506:                 (lpOutputRoutine)("\tOBJ_EXCLUSIVE\n");
        !           507:                 }
        !           508:             if ( Obja.Attributes & OBJ_CASE_INSENSITIVE ) {
        !           509:                 (lpOutputRoutine)("\tOBJ_CASE_INSENSITIVE\n");
        !           510:                 }
        !           511:             if ( Obja.Attributes & OBJ_OPENIF ) {
        !           512:                 (lpOutputRoutine)("\tOBJ_OPENIF\n");
        !           513:                 }
        !           514:         }
        !           515: }
        !           516: 

unix.superglobalmegacorp.com

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