⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dumprom.cpp

📁 wince 内核dump程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
DWORD MemoryMap::GetDword(DWORD offset){    DWORD *p= (DWORD*)GetPtr(offset);    if (p==NULL)        return 0;    return *p;}void *MemoryMap::GetPtr(DWORD offset){    for (MemoryBlockVector::iterator i=m_blocks.begin() ; i!=m_blocks.end(); ++i)    {        if ((*i).InRange(offset)) {            return (*i).data+(offset-(*i).start);        }    }    printf("ERROR: could not find pointer for ofs %08lx\n", offset);    return NULL;}DWORD MemoryMap::GetOfs(void *ptr){    for (MemoryBlockVector::iterator i=m_blocks.begin() ; i!= m_blocks.end() ; ++i)    {        if ((*i).data <= ptr && ptr < (*i).data+(*i).length)        {            return ((BYTE*)ptr - (*i).data) + (*i).start;        }    }    printf("ERROR: could not find offset for ptr %08lx\n", (DWORD)ptr);    return 0;}DWORD MemoryMap::FirstAddress(){    MemoryBlockVector::iterator i=m_blocks.begin();    return (*i).start;}DWORD MemoryMap::LastAddress(){    MemoryBlockVector::reverse_iterator i=m_blocks.rbegin();    return (*i).end;}MemoryMapIterator MemoryMap::begin(){    return MemoryMapIterator(m_blocks.begin(), m_blocks.end());}const MemoryMapIterator MemoryMap::end(){    return MemoryMapIterator(m_blocks.end(), m_blocks.end());}// -----------------------------------------------------------------------------// -----------------------------------------------------------------------------MemRegion& MemRegions::MarkRange(DWORD start, DWORD end, const char *msg, ...){    va_list ap;    va_start(ap, msg);    MemRegion& r= MarkRegion_v(start, end-start, msg, ap);    va_end(ap);    return r;}MemRegion& MemRegions::MarkRegion(DWORD start, DWORD length, const char *msg, ...){    va_list ap;    va_start(ap, msg);    MemRegion& r= MarkRegion_v(start, length, msg, ap);    va_end(ap);    return r;}MemRegion& MemRegions::MarkRegion_v(DWORD start, DWORD length, const char *msg, va_list ap){    char msgbuf[1024];    _vsnprintf(msgbuf, 1024, msg, ap);    if (start==0) {        printf("start=0\n");    }    //printf("region %08lx-%08lx %s\n", start, length, msgbuf);    MemRegion *m= new MemRegion(start, start+length);    m->description= new string(msgbuf);    if (m->description==NULL)    {        printf("error allocating memory\n");    }    m_list.push_back(*m);    return *m;}void bytedump(DWORD start, DWORD end){    for (DWORD ofs= start; ofs<end ; ++ofs)        printf(" %02x", g_mem.GetByte(ofs));}string dworddumpasstring(DWORD start, DWORD end){    string s;    char buf[10];    for (DWORD ofs= start ; ofs<(end&~3) ; ofs+=4)    {        _snprintf(buf, 10, " %08lx", g_mem.GetDword(ofs));        s += buf;    }    return s;}void dworddump(DWORD start, DWORD end){    if (start&3)    {        bytedump(start, min(end, (start&~3)+4));        start= min(end, (start&~3)+4);    }    for (DWORD ofs= start ; ofs<(end&~3) ; ofs+=4)        printf(" %08lx", g_mem.GetDword(ofs));    if (end&3)        bytedump(end&~3, end);}void MemRegions::DumpMemoryMap(){    sort(m_list.begin(), m_list.end());    DWORD offset= g_mem.FirstAddress();    for (MemRegionVector::iterator i=m_list.begin() ; i!=m_list.end() ; ++i)    {        if (offset < (*i).start) {            MemRegion m(offset, (*i).start);            if ( ((*i).start & 3)==0 && (*i).start - offset < 4)            {                if (g_verbose>0) {                    printf("\t%08lx - %08lx L%08lx alignment", m.start, m.end, m.length);                    if (m.FirstNonzero()!=m.end)                        bytedump(m.start, m.end);                }            }            else            {                DWORD firstnz= max(m.start, m.FirstNonzero() & ~3);                DWORD lastnz= min(m.end, (m.LastNonzero() & ~3)+4);                if (firstnz==m.end)                    printf("\n%08lx - %08lx L%08lx NUL", m.start, m.end, m.length);                else {                    if (firstnz != m.start)                        printf("\n%08lx - %08lx L%08lx NUL", m.start, firstnz, firstnz-m.start);                    printf("\n%08lx - %08lx L%08lx unknown", firstnz, lastnz, lastnz-firstnz);                    if (lastnz-firstnz<16)                        bytedump(firstnz, lastnz);                    else if (lastnz-firstnz<64)                        dworddump(firstnz, lastnz);                    if (lastnz != m.end)                        printf("\n%08lx - %08lx L%08lx NUL", lastnz, m.end, m.end-lastnz);                }            }        }        else if (offset > (*i).start) {            printf("\n!!! overlap of %ld bytes\n", offset-(*i).start );        }        printf("\n%08lx - %08lx L%08lx %s", (*i).start, (*i).end, (*i).length, (*i).description->c_str());        offset= (*i).end;    }    if (offset<g_mem.LastAddress())    {        printf("\n%08lx - %08lx unknown", offset, g_mem.LastAddress());    }    printf("\n");}// -----------------------------------------------------------------------------// -----------------------------------------------------------------------------// from c:\local\wince420\PUBLIC/COMMON/OAK/INC/PEHDR.Hstruct info {                       /* Extra information header block      */    unsigned long   rva;            /* Virtual relative address of info    */    unsigned long   size;           /* Size of information block           */};// from c:\local\wince420\PUBLIC/COMMON/OAK/INC/ROMLDR.H#define ROM_SIGNATURE_OFFSET 64#define ROM_SIGNATURE 0x43454345#define ROM_EXTRA 9typedef struct e32_rom {    unsigned short  e32_objcnt;     /* Number of memory objects            */    unsigned short  e32_imageflags; /* Image flags                         */    unsigned long   e32_entryrva;   /* Relative virt. addr. of entry point */    unsigned long   e32_vbase;      /* Virtual base address of module      */    unsigned short  e32_subsysmajor;/* The subsystem major version number  */    unsigned short  e32_subsysminor;/* The subsystem minor version number  */    unsigned long   e32_stackmax;   /* Maximum stack size                  */    unsigned long   e32_vsize;      /* Virtual size of the entire image    */    unsigned long   e32_sect14rva;  /* section 14 rva */    unsigned long   e32_sect14size; /* section 14 size */    struct info     e32_unit[ROM_EXTRA]; /* Array of extra info units      */    unsigned short  e32_subsys;     /* The subsystem type                  */} e32_rom;// o32_flags#define IMAGE_SCN_COMPRESSED                 0x00002000  // Section is compressedtypedef struct o32_rom {    unsigned long       o32_vsize;      /* Virtual memory size              */    unsigned long       o32_rva;        /* Object relative virtual address  */    unsigned long       o32_psize;      /* Physical file size of init. data */    unsigned long       o32_dataptr;    /* Image pages offset               */    unsigned long   o32_realaddr;       /* pointer to actual                */    unsigned long       o32_flags;      /* Attribute flags for the object   */} o32_rom;typedef struct ROMHDR {    ULONG   dllfirst;               // first DLL address    ULONG   dlllast;                // last DLL address    ULONG   physfirst;              // first physical address    ULONG   physlast;               // highest physical address    ULONG   nummods;                // number of TOCentry's    ULONG   ulRAMStart;             // start of RAM    ULONG   ulRAMFree;              // start of RAM free space    ULONG   ulRAMEnd;               // end of RAM    ULONG   ulCopyEntries;          // number of copy section entries    ULONG   ulCopyOffset;           // offset to copy section    ULONG   ulProfileLen;           // length of PROFentries RAM     ULONG   ulProfileOffset;        // offset to PROFentries    ULONG   numfiles;               // number of FILES    ULONG   ulKernelFlags;          // optional kernel flags from ROMFLAGS .bib config option    ULONG   ulFSRamPercent;         // Percentage of RAM used for filesystem                                         // byte 0 = #4K chunks/Mbyte of RAM for filesystem 0-2Mbytes 0-255                                        // byte 1 = #4K chunks/Mbyte of RAM for filesystem 2-4Mbytes 0-255                                        // byte 2 = #4K chunks/Mbyte of RAM for filesystem 4-6Mbytes 0-255                                        // byte 3 = #4K chunks/Mbyte of RAM for filesystem > 6Mbytes 0-255    ULONG   ulDrivglobStart;        // device driver global starting address    ULONG   ulDrivglobLen;          // device driver global length    USHORT  usCPUType;              // CPU (machine) Type    USHORT  usMiscFlags;            // Miscellaneous flags    void    *pExtensions;           // pointer to ROM Header extensions    ULONG   ulTrackingStart;        // tracking memory starting address    ULONG   ulTrackingLen;          // tracking memory ending address} ROMHDR;// followed by nummods <TOCentry>'stypedef struct TOCentry {           // MODULE BIB section structure    DWORD dwFileAttributes;    FILETIME ftTime;    DWORD nFileSize;    LPSTR   lpszFileName;    ULONG   ulE32Offset;            // Offset to E32 structure    ULONG   ulO32Offset;            // Offset to O32 structure    ULONG   ulLoadOffset;           // MODULE load buffer offset} TOCentry, *LPTOCentry;// followed by numfiles <TOCentry>'stypedef struct FILESentry {         // FILES BIB section structure    DWORD dwFileAttributes;    FILETIME ftTime;    DWORD nRealFileSize;    DWORD nCompFileSize;    LPSTR   lpszFileName;    ULONG   ulLoadOffset;           // FILES load buffer offset} FILESentry, *LPFILESentry;typedef struct COPYentry {    ULONG   ulSource;               // copy source address    ULONG   ulDest;                 // copy destination address    ULONG   ulCopyLen;              // copy length    ULONG   ulDestLen;              // copy destination length                                     // (zero fill to end if > ulCopyLen)} COPYentry;// from c:\local\wince420\PUBLIC/COMMON/OAK/INC/ROMLDR.H#define MAX_ROM                 32      // max numbler of XIPs#define XIP_NAMELEN             32      // max name length of XIP#define ROM_CHAIN_OFFSET        0x100   // offset for XIPCHAIN_INFOtypedef struct _XIPCHAIN_ENTRY {    LPVOID  pvAddr;                 // address of the XIP    DWORD   dwLength;               // the size of the XIP    DWORD   dwMaxLength;            // the biggest it can grow to    USHORT  usOrder;                // where to put into ROMChain_t    USHORT  usFlags;                // flags/status of XIP    DWORD   dwVersion;              // version info    CHAR    szName[XIP_NAMELEN];    // Name of XIP, typically the bin file's name, w/o .bin    DWORD   dwAlgoFlags;            // algorithm to use for signature verification    DWORD   dwKeyLen;               // length of key in byPublicKey    BYTE    byPublicKey[596];       // public key data} XIPCHAIN_ENTRY, *PXIPCHAIN_ENTRY;typedef struct _XIPCHAIN_INFO {    DWORD cXIPs;    //    // may contain more than one entry, but we only need the address of first one    //    XIPCHAIN_ENTRY xipEntryStart;} XIPCHAIN_INFO, *PXIPCHAIN_INFO;#define PID_LENGTH 10// pointed to by ROMHDR.pExtensionstypedef struct ROMPID {  union{    DWORD dwPID[PID_LENGTH];        // PID    struct {      char  name[(PID_LENGTH - 4) * sizeof(DWORD)];      DWORD type;      PVOID pdata;      DWORD length;      DWORD reserved;    } s;  };  PVOID pNextExt;                 // pointer to next extension if any} ROMPID, EXTENSION;//----------------output structures [ how pe-exe files are structured ]////  file starts with IMAGE_DOS_HEADER// 0000000: 5a4d  0090  0003  0000  0004  0000  ffff  0000   MZ..............// 0000010: 00b8  0000  0000  0000  0040  0000  0000  0000   ........@.......// 0000020: 0000  0000  0000  0000  0000  0000  0000  0000   ................// 0000030: 0000  0000  0000  0000  0000  0000  000000c0     ................//// followed by some dummy code// 0000040: 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68  ........!..L.!Th// 0000050: 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f  is program canno// 0000060: 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20  t be run in DOS // 0000070: 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00  mode....$.......//// followed by something unknown// 0000080: bf 1a f4 da fb 7b 9a 89 fb 7b 9a 89 fb 7b 9a 89  .....{...{...{..// 0000090: fb 7b 9b 89 fa 7b 9a 89 66 5b ba 89 f8 7b 9a 89  .{...{..f[...{..// 00000a0: 82 5a be 89 fa 7b 9a 89 52 69 63 68 fb 7b 9a 89  .Z...{..Rich.{..// 00000b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................//// followed by a 'e32_exe' struct// followed by <e32_objcnt> 'o32_obj' structs// followed by NUL's to align to next 512-byte boundary// followed by data-sections, each NUL-padded to the next 512-byte boundary//// followed by the debug-directory// also defined in c:\local\WINCE420\PUBLIC\COMMON\SDK\INC\winnt.h#ifndef IMAGE_DOS_SIGNATURE#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZtypedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header    WORD   e_magic;                     // Magic number    WORD   e_cblp;                      // Bytes on last page of file    WORD   e_cp;                        // Pages in file    WORD   e_crlc;                      // Relocations    WORD   e_cparhdr;                   // Size of header in paragraphs    WORD   e_minalloc;                  // Minimum extra paragraphs needed    WORD   e_maxalloc;                  // Maximum extra paragraphs needed    WORD   e_ss;                        // Initial (relative) SS value    WORD   e_sp;                        // Initial SP value    WORD   e_csum;                      // Checksum

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -