summaryrefslogblamecommitdiffstats
path: root/private/mvdm/bde/bdemisc.c
blob: 65f646e635b9af098cb28cc9da4e5f84d55aa393 (plain) (tree)



















































































































































































































































































































































































                                                                                          
/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    ntsdexts.c

Abstract:

    This function contains the default ntsd debugger extensions

Author:

    Bob Day      (bobday) 29-Feb-1992 Grabbed standard header

Revision History:

--*/

#include <precomp.h>
#pragma hdrstop
#include <ctype.h>

VOID
DumpMemory(
    UINT DumpType
    )
{
    VDMCONTEXT ThreadContext;
    int mode;
    int i, j, lines = 8;
    WORD selector;
    ULONG offset;
    ULONG base;
    char ch;

    if (!DumpType) {
        return;
    }

    mode = GetContext( &ThreadContext );

    if (!GetNextToken()) {
        PRINTF("Please specify an address\n");
        return;
    }

    if (!ParseIntelAddress(&mode, &selector, &offset)) {
        return;
    }

    if (GetNextToken()) {
        if ((*lpArgumentString == 'l') || (*lpArgumentString == 'L')) {
            lpArgumentString++;
        }
        lines = (EXPRESSION(lpArgumentString)*DumpType+15)/16;
    }

    base = GetInfoFromSelector(selector, mode, NULL) + GetIntelBase();

    for (i=0; i<lines; i++) {
        if (offset & 0xFFFF0000) {
            PRINTF("%04x:%08lx ", selector, offset);
        } else {
            PRINTF("%04x:%04x ", selector, LOWORD(offset));
        }

        switch(DumpType) {

        case 1:
            for (j=0; j<16; j++) {
                if (j==8) {
                    PRINTF("-");
                } else {
                    PRINTF(" ");
                }
                PRINTF("%02x", ReadByteSafe(base+offset+j));
            }
            PRINTF("  ");

            for (j=0; j<16; j++) {
                ch = ReadByteSafe(base+offset+j);
                if (isprint(ch)) {
                    PRINTF("%c", ch);
                } else {
                    PRINTF(".");
                }
            }

            break;
        case 2:
            for (j=0; j<16; j+=2) {
                PRINTF(" %04x", ReadWordSafe(base+offset+j));
            }
            break;
        case 4:
            for (j=0; j<16; j+=4) {
                PRINTF(" %08lx", ReadDwordSafe(base+offset+j));
            }
            break;
        }
        PRINTF("\n");
        offset += 16;

    }

}



VOID
DumpRegs(
) {
    VDMCONTEXT              ThreadContext;
    int                     mode;

    mode = GetContext( &ThreadContext );

    PRINTF("eax=%08lx ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx\n",
            ThreadContext.Eax,
            ThreadContext.Ebx,
            ThreadContext.Ecx,
            ThreadContext.Edx,
            ThreadContext.Esi,
            ThreadContext.Edi );
    PRINTF("eip=%08lx esp=%08lx ebp=%08lx                ",
            ThreadContext.Eip,
            ThreadContext.Esp,
            ThreadContext.Ebp );
    if ( ThreadContext.EFlags & FLAG_OVERFLOW ) {
        PRINTF("ov ");
    } else {
        PRINTF("nv ");
    }
    if ( ThreadContext.EFlags & FLAG_DIRECTION ) {
        PRINTF("dn ");
    } else {
        PRINTF("up ");
    }
    if ( ThreadContext.EFlags & FLAG_INTERRUPT ) {
        PRINTF("ei ");
    } else {
        PRINTF("di ");
    }
    if ( ThreadContext.EFlags & FLAG_SIGN ) {
        PRINTF("ng ");
    } else {
        PRINTF("pl ");
    }
    if ( ThreadContext.EFlags & FLAG_ZERO ) {
        PRINTF("zr ");
    } else {
        PRINTF("nz ");
    }
    if ( ThreadContext.EFlags & FLAG_AUXILLIARY ) {
        PRINTF("ac ");
    } else {
        PRINTF("na ");
    }
    if ( ThreadContext.EFlags & FLAG_PARITY ) {
        PRINTF("po ");
    } else {
        PRINTF("pe ");
    }
    if ( ThreadContext.EFlags & FLAG_CARRY ) {
        PRINTF("cy ");
    } else {
        PRINTF("nc ");
    }
    PRINTF("\n");
    PRINTF("cs=%04x  ss=%04x  ds=%04x  es=%04x  fs=%04x  gs=%04x             efl=%08lx\n",
            ThreadContext.SegCs,
            ThreadContext.SegSs,
            ThreadContext.SegDs,
            ThreadContext.SegEs,
            ThreadContext.SegFs,
            ThreadContext.SegGs,
            ThreadContext.EFlags );
}


VOID
ListModules(
) {
    VDMCONTEXT              ThreadContext;
    int                     mode;
    HEAPENTRY               he = {0};
    SELECTORINFO si;

    mode = GetContext( &ThreadContext );

    if (GetNextToken()) {
        he.Selector = (WORD) EXPRESSION( lpArgumentString );
    }

    PRINTF("Sel    Base     Limit  Type Seg   Module\n");
    PRINTF("==== ======== ======== ==== ==== ========\n");


    while (FindHeapEntry(&he, FALSE)) {
        if (he.SegmentNumber != -1) {
            GetInfoFromSelector((WORD)(he.gnode.pga_handle | 1), PROT_MODE, &si);
            PRINTF("%04X %08lX %08lX",
                he.gnode.pga_handle | 1,
                he.gnode.pga_address,
                he.gnode.pga_size - 1);

            PRINTF(" %s", si.bCode ? "Code" : "Data");

            PRINTF(" %04X %s\n",
                he.SegmentNumber, 
                he.OwnerName);
        }

    }

}

VOID
DumpDescriptor(
) {
    VDMCONTEXT              ThreadContext;
    WORD                    selector;
    ULONG                   Base;
    int                     mode;
    SELECTORINFO            si;
    int                     i, count = 16;

    mode = GetContext( &ThreadContext );

    if (GetNextToken()) {
        selector = (WORD) EXPRESSION( lpArgumentString );
    } else {
        PRINTF("Please enter a selector\n");
        return;
    }

    for (i=0; i<count; i++) {

        Base = GetInfoFromSelector( selector, mode, &si );

        PRINTF("%04X => Base: %08lX", selector, Base);

#ifndef i386
        PRINTF(" (%08X)", Base+GetIntelBase());
#endif

        PRINTF("  Limit: %08lX  %s %s %s %s\n",
                si.Limit,
                si.bPresent ? " P" : "NP",
                si.bSystem ? "System" : si.bCode     ? "Code  " : "Data  ",
                si.bSystem ? ""       : si.bWrite    ? "W" : "R",
                si.bSystem ? ""       : si.bAccessed ? "A" : ""
                );

        selector+=8;
    }

}


//
//  Dump Taskinfo;
//
//  If no argument, dump all wow tasks.
//  If 0, dump current WOW task
//  Else dump the specifies task {which is thread-id as shown by
//  ~ command under ntsd like 37.6b so thread-id is 6b)
//

void DumpTaskInfo (ptd,mode)
PTD  ptd;
int    mode;
{

    ULONG                   Base;
    TDB                     tdb;
    BOOL                    b;

    Base = GetInfoFromSelector( ptd->htask16, mode, NULL );
    b = ReadProcessMem( hCurrentProcess,
                           (LPVOID) (Base+GetIntelBase()),
                           &tdb,
                           sizeof(tdb),
                           NULL );

    if ( !b ) {
        PRINTF("Failure reading TDB at %X\n", Base );
        return;
    }

    PRINTF("\nDump for ThreadId = %x\n",ptd->dwThreadID);
    PRINTF("    Stack          =   %x:%x\n",HIWORD(ptd->vpStack),LOWORD(ptd->vpStack));
    PRINTF("    HTask (TDB)    =   %x\n", ptd->htask16);
    PRINTF("    HInst          =   %x\n", ptd->hInst16);
    PRINTF("    HMod16         =   %x\n", ptd->hMod16);
    PRINTF("    CompatFlags    =   %x\n",ptd->dwWOWCompatFlags);
    PRINTF("    HThread        =   %x\n",ptd->hThread);
    PRINTF("    TDBFlags       =   %x\n",tdb.TDB_flags);
    PRINTF("    ExpWinVer      =   %x\n",tdb.TDB_ExpWinVer);
    PRINTF("    DTA            =   %x:%x\n",HIWORD(tdb.TDB_DTA),LOWORD(tdb.TDB_DTA));
    PRINTF("    CurDir         =   %.64s\n",tdb.TDB_Directory);
    PRINTF("    ModName        =   %.8s\n",tdb.TDB_ModName);
}

void TaskInfo (
) {
    VDMCONTEXT              ThreadContext;
    DWORD                   ThreadId;
    PTD                     ptd,ptdHead;
    TD                      td;
    int                     mode;
    BOOL                    b,fFound=FALSE;


    mode = GetContext( &ThreadContext );

    ThreadId = (DWORD)-1;  // Assume Dump All Tasks
    if (GetNextToken()) {
        ThreadId = (DWORD) EXPRESSION( lpArgumentString );
    }

    ptdHead = (PTD)EXPRESSION("wow32!gptdTaskHead");

    // get the pointer to first TD
    b = ReadProcessMem( hCurrentProcess,
                           (LPVOID) (ptdHead),
                           &ptd,
                           sizeof(DWORD),
                           NULL );

    if ( !b ) {
        PRINTF("Failure reading gptdTaskHead at %08lX\n", ptdHead );
        return;
    }

    // enumerate td list to find the match(es)
    while (ptd) {
        b = ReadProcessMem( hCurrentProcess,
                           (LPVOID) (ptd),
                           &td,
                           sizeof(TD),
                           NULL );
        if ( !b ) {
            PRINTF("Failure reading TD At %08lX\n", ptd );
            return;
        }

        if (ThreadId == -1) {
            DumpTaskInfo (&td,mode);
            fFound = TRUE;
        }
        else {
            if (ThreadId == td.dwThreadID) {
                DumpTaskInfo (&td,mode);
                fFound = TRUE;
                break;
            }
        }
        ptd = td.ptdNext;
    }

    if (!fFound) {
        if (ThreadId == -1) {
            PRINTF("No WOW Task Found.\n");
        }
        else
            PRINTF("WOW Task With Thread Id = %02x Not Found.\n",ThreadId);
    }
    return;
}