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

📄 viewbin.c

📁 WinCE5.0部分核心源码
💻 C
📖 第 1 页 / 共 3 页
字号:

    g_dwROMOffset = 0;
    g_pTOC = 0;

    return FALSE;
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void 
PrintTOC(){
  BOOL  fRet;
  SYSTEMTIME st;

  if (!g_pTOC)
    return;
    
  //-------------------------------------------
  // Print header
  //
  fRet = ReadBinFile(pBuffer, g_pTOC, sizeof(ROMHDR), g_dwROMOffset);

  if (fRet) {
    ROMHDR* pTOC = (ROMHDR*) pBuffer;
    ROMPID Pid;
    int i;
      
    g_dwNumModules = pTOC->nummods;
    g_dwNumFiles = pTOC->numfiles;
    g_dwNumCopySects = pTOC->ulCopyEntries;
    g_dwCopyOffset = pTOC->ulCopyOffset;
    g_dwProfileOffset = pTOC->ulProfileOffset;

    printf("\n");
    printf("ROMHDR ----------------------------------------\n");
    printf("    DLL First           : 0x%08X  \n", pTOC->dllfirst);
    printf("    DLL Last            : 0x%08X  \n", pTOC->dlllast);
    printf("    Physical First      : 0x%08X  \n", pTOC->physfirst);
    printf("    Physical Last       : 0x%08X  \n", pTOC->physlast);
    printf("    RAM Start           : 0x%08X  \n", pTOC->ulRAMStart);
    printf("    RAM Free            : 0x%08X  \n", pTOC->ulRAMFree);
    printf("    RAM End             : 0x%08X  \n", pTOC->ulRAMEnd);
    printf("    Kernel flags        : 0x%08X  \n", pTOC->ulKernelFlags);
    printf("    Prof Symbol Offset  : 0x%08X  \n", pTOC->ulProfileOffset);
    printf("    Num Copy Entries    : %10d    \n", pTOC->ulCopyEntries);
    printf("    Copy Entries Offset : 0x%08X  \n", pTOC->ulCopyOffset);
    printf("    Num Modules         : %10d    \n", pTOC->nummods);
    printf("    Num Files           : %10d    \n", pTOC->numfiles);
    printf("    MiscFlags           : 0x%08X  \n", pTOC->usMiscFlags);
    printf("    CPU                 :     0x%04x ", pTOC->usCPUType); 

    switch(pTOC->usCPUType) {
      case IMAGE_FILE_MACHINE_SH3:
        printf("(SH3)\n");
        break;
      case IMAGE_FILE_MACHINE_SH3E:
        printf("(SH3e)\n");
        break;
      case IMAGE_FILE_MACHINE_SH3DSP:
        printf("(SH3-DSP)\n");
        break;
      case IMAGE_FILE_MACHINE_SH4:
        printf("(SH4)\n");
        break;
      case IMAGE_FILE_MACHINE_I386:
        printf("(x86)\n");
        break;
      case IMAGE_FILE_MACHINE_THUMB:
        printf("(Thumb)\n");
        break;
      case IMAGE_FILE_MACHINE_ARM:
        printf("(ARM)\n");
        break;
      case IMAGE_FILE_MACHINE_POWERPC:
        printf("(PPC)\n");
        break;
      case IMAGE_FILE_MACHINE_R4000:
        printf("(R4000)\n");
        break;
      case IMAGE_FILE_MACHINE_MIPS16:
        printf("(MIPS16)\n");
        break;
      case IMAGE_FILE_MACHINE_MIPSFPU:
        printf("(MIPSFPU)\n");
        break;
      case IMAGE_FILE_MACHINE_MIPSFPU16:
        printf("(MIPSFPU16)\n");
        break; 
      default:
        printf("(Unknown)");
    }

    printf("    Extensions          : 0x%08X\n", (DWORD)(pTOC->pExtensions));

    if (pTOC->pExtensions) {
      if (ReadBinFile((PBYTE)(&Pid), (DWORD)pTOC->pExtensions, sizeof(ROMPID), g_dwROMOffset)) {
        printf("\n");
        printf("ROMHDR Extensions -----------------------------\n");
  
        for (i = 0; i < PID_LENGTH; i++)
          printf("    PID[%d] = 0x%08X\n", i, Pid.dwPID[i]);

        printf("    Next: %08x\n", (DWORD)(Pid.pNextExt));

        while(Pid.pNextExt){
          printf("\n    -- Location: %08x\n", (DWORD)(Pid.pNextExt));
          
          if(ReadBinFile((PBYTE)(&Pid), (DWORD)Pid.pNextExt, sizeof(ROMPID), g_dwROMOffset)){
            printf("    Name: %-24s\n"
                   "    Type:     %08x\n"
                   "    pData:    %08x\n"
                   "    Length:   %08x\n"
                   "    Reserved: %08x\n"
                   "    Next:     %08x\n",
                   Pid.name,
                   Pid.type,
                   (DWORD)(Pid.pdata),
                   Pid.length,
                   Pid.reserved,
                   (DWORD)(Pid.pNextExt)); 
            
            if(strcmp(Pid.name, "chain information") == 0){
              char *buffer = malloc(Pid.length);

              if(!buffer){
                printf("Error: failed allocating extention buffer\n");
                return;
              }
              
              if(ReadBinFile(buffer, (DWORD)Pid.pdata, Pid.length, g_dwROMOffset)){
                DWORD j;
                for(j = 0; j < Pid.length/sizeof(XIPCHAIN_SUMMARY); j++){
                  printf("      Addr:     %08x\n"
                         "      MaxLenth: %08x\n"
                         "      Order:    %04x\n"
                         "      Flags:    %04x\n"
                         "      reserved: %08x\n",
                         (DWORD)(((XIPCHAIN_SUMMARY*)buffer)[j].pvAddr),
                         ((XIPCHAIN_SUMMARY*)buffer)[j].dwMaxLength,
                         ((XIPCHAIN_SUMMARY*)buffer)[j].usOrder,
                         ((XIPCHAIN_SUMMARY*)buffer)[j].usFlags,
                         ((XIPCHAIN_SUMMARY*)buffer)[j].reserved);
                }
              }
            }
          } else {
            printf("Couldn't locate TOC Extensions\n");
            break;
          }
        }
      } else {
        printf("Couldn't locate TOC Extensions\n");
      }
    }
  } else {
    printf("Couldn't locate TOC data\n");
  }
  
  
  //-------------------------------------------
  // Print Copy Sections
  //
  if (g_dwNumCopySects){
    fRet = ReadBinFile(pBuffer, (DWORD) g_dwCopyOffset, sizeof(COPYentry) * g_dwNumCopySects, g_dwROMOffset);

    if (fRet) {
      COPYentry* pce = NULL;
      DWORD i = 0;
  
      printf("\n");
      printf("COPY Sections ---------------------------------\n");
     
      for (i=0 ; i < g_dwNumCopySects ; i++) {
          pce = (((COPYentry*)pBuffer) + i);
          printf("    Src: 0x%08X   Dest: 0x%08X   CLen: 0x%-6X   DLen: 0x%-6X\n", pce->ulSource, pce->ulDest, pce->ulCopyLen, pce->ulDestLen);
          if (pce->ulDest == g_dwProfileOffset) {
              g_dwProfileAdjust = pce->ulSource - pce->ulDest;
              g_dwProfileOffset += g_dwProfileAdjust;
          }
      }
    } else {
      printf("Couldn't locate copy secitons\n");
    }
  }


  //-------------------------------------------
  // Print Modules
  //
  fRet = ReadBinFile(pBuffer, (DWORD) g_pTOC + sizeof(ROMHDR), sizeof(TOCentry) * g_dwNumModules, g_dwROMOffset);
  
  if (fRet) {
    TOCentry* pte = (TOCentry*) pBuffer;
    e32_rom e32, *pe32 = &e32;
    o32_rom o32, *po32 = &o32;
    DWORD i, j;
    char szFilename[MAX_PATH];

    printf("\n");
    printf("MODULES ---------------------------------------\n");

    for (i=0;i < g_dwNumModules; i++) {
      fRet = ReadBinFile((PBYTE) szFilename, (DWORD) pte[i].lpszFileName, 0, g_dwROMOffset);
      FileTimeToSystemTime(&(pte[i].ftTime), &st);

      if (!g_fPrintOBJ) {
        printf("    %2d/%02d/%04d  %02d:%02d:%02d  %10d  %s \n", 
               st.wMonth, st.wDay, st.wYear,
               st.wHour, st.wMinute, st.wSecond,
               pte[i].nFileSize, szFilename);
      } else {
        printf("    ==== %s ===============================\n", szFilename);

        printf("    TOCentry (%s) -------------------------\n", szFilename);
        printf("        dwFileAttributes    : 0x%X\n", pte[i].dwFileAttributes);
        printf("        ftTime              : %2d/%02d/%04d  %02d:%02d:%02d\n",
          st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond);
        printf("        nFileSize           : 0x%X (%d)\n", pte[i].nFileSize, pte[i].nFileSize);
        printf("        ulE32Offset         : 0x%X\n", pte[i].ulE32Offset);
        printf("        ulO32Offset         : 0x%X\n", pte[i].ulO32Offset);
        printf("        ulLoadOffset        : 0x%X\n", pte[i].ulLoadOffset);
    
        if (ReadBinFile((PBYTE)pe32, pte[i].ulE32Offset, sizeof(e32_rom), g_dwROMOffset)) {
          printf("    e32_rom (%s) --------------------------\n", szFilename);
          printf("        e32_objcnt          : %d\n", pe32->e32_objcnt);
          printf("        e32_imageflags      : 0x%X\n", pe32->e32_imageflags);
          printf("        e32_entryrva        : 0x%X\n", pe32->e32_entryrva);
          printf("        e32_vbase           : 0x%X\n", pe32->e32_vbase);
          printf("        e32_subsysmajor     : 0x%X\n", pe32->e32_subsysmajor);
          printf("        e32_subsysminor     : 0x%X\n", pe32->e32_subsysminor);
          printf("        e32_stackmax        : 0x%X\n", pe32->e32_stackmax);
          printf("        e32_vsize           : 0x%X\n", pe32->e32_vsize);
          printf("        e32_timestamp       : 0x%X\n", pe32->e32_timestamp);
          
          for (j = 0; j < pe32->e32_objcnt; j++) {
            printf("    o32_rom[%d] (%s) ------------------------\n", j, szFilename);
            
            if (ReadBinFile((PBYTE)po32, pte[i].ulO32Offset + j * sizeof(o32_rom), sizeof(o32_rom), g_dwROMOffset)) {
              printf("        o32_vsize           : 0x%X\n", po32->o32_vsize);
              printf("        o32_rva             : 0x%X\n", po32->o32_rva);
              printf("        o32_psize           : 0x%X\n", po32->o32_psize);
              printf("        o32_dataptr         : 0x%X\n", po32->o32_dataptr);
              printf("        o32_realaddr        : 0x%X\n", po32->o32_realaddr);
              printf("        o32_flags           : 0x%X\n", po32->o32_flags);
            } else {
              printf("ERROR: Couldn't locate o32_rom data\n");
            }     
          }
          
          printf("\n");

        } else {
          printf("ERROR: Couldn't locate e32_rom data\n");
        }
      }
    }
  } else {
    printf("ERROR: Couldn't locate Modules data\n");
  }
  
  //-------------------------------------------
  // Print Files
  //
  fRet = ReadBinFile(pBuffer, (DWORD) g_pTOC + sizeof(ROMHDR) + (sizeof(TOCentry) * g_dwNumModules), sizeof(FILESentry) * g_dwNumFiles, g_dwROMOffset);

  if (fRet) {
    FILESentry* pfe = (FILESentry*) pBuffer;
    DWORD i;
    char szFilename[MAX_PATH];

    printf("\n");
    printf("FILES ----------------------------------------\n");

    for (i=0;i < g_dwNumFiles; i++) {
      fRet = ReadBinFile((PBYTE) szFilename, (DWORD) pfe[i].lpszFileName, 0, g_dwROMOffset);
      FileTimeToSystemTime(&(pfe[i].ftTime), &st);
      printf("     %2d/%02d/%04d  %02d:%02d:%02d  %c%c%c%c %10d %10d  %24s (ROM 0x%08X)\n", 
             st.wMonth, st.wDay, st.wYear,
             st.wHour, st.wMinute, st.wSecond,
             (pfe[i].dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED ? 'C' : '_'),
             (pfe[i].dwFileAttributes & FILE_ATTRIBUTE_HIDDEN     ? 'H' : '_'),
             (pfe[i].dwFileAttributes & FILE_ATTRIBUTE_READONLY   ? 'R' : '_'),
             (pfe[i].dwFileAttributes & FILE_ATTRIBUTE_SYSTEM     ? 'S' : '_'),
             (pfe[i].dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED ? pfe[i].nCompFileSize : 0),
             pfe[i].nRealFileSize, szFilename, pfe[i].ulLoadOffset);
          
      if (g_fCheckFiles) {
        DWORD dwSize;

        if (pfe[i].dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED)
          dwSize = pfe[i].nCompFileSize;
        else 
          dwSize = pfe[i].nRealFileSize;
                                      
        fRet = CheckBinFile(pfe[i].ulLoadOffset, dwSize);
        if (!fRet)
          printf("File not in record space. Potentially truncated file!\n");
      }
    }
  } else {
    printf("Couldn't locate Files data\n");
  }

    //-------------------------------------------
    // Print Symbols
    //
    if (g_fPrintSYM) {
        fRet = ReadBinFile(pBuffer, (DWORD) g_dwProfileOffset, sizeof(PROFentry) * g_dwNumModules, g_dwROMOffset);

        if (fRet) {
            DWORD i;
            PROFentry* pe = (PROFentry*) pBuffer;

            printf("\n");
            printf("SYMBOLS ---------------------------------------\n");

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

                printf(" MOD (%2d, %2d), 0x%08X - 0x%08X, numsyms  = %4d, HitAddr = 0x%08X, SymAddr = 0x%08X\n", pe[i].ulModNum, pe[i].ulSectNum, pe[i].ulStartAddr, pe[i].ulEndAddr, pe[i].ulNumSym, pe[i].ulHitAddress, pe[i].ulSymAddress);
                fRet = ReadBinFile(pBufferSym, (DWORD) pe[i].ulHitAddress + g_dwProfileAdjust, sizeof(SYMentry) * pe[i].ulNumSym, g_dwROMOffset);

                if (fRet) {
                    DWORD j;
                    SYMentry* pse = (SYMentry*) pBufferSym;
                    char szFunction[128];
                    PBYTE pTraverse = (PBYTE)pe[i].ulSymAddress;

                    for (j=0; j < pe[i].ulNumSym; j++) {
                        
                        char thischar;
                        int charindex = 0;

                        do {
                            
                            fRet = ReadBinFile(&thischar, (DWORD) pTraverse++, sizeof(char), g_dwROMOffset);
                            szFunction[charindex++] = thischar;

                        } while (fRet && thischar != '\0');

                        printf("       0x%08X : %s\n", pse[j].ulFuncAddress, szFunction);


                    }

                }
            }
        } else {
          printf("ERROR: Couldn't locate Modules data\n");
        }


    }

}



#define ADDR_SUM(x) (( ((x) & 0xff000000) >> 24) + \
                     ( ((x) & 0x00ff0000) >> 16) + \
                     ( ((x) & 0x0000ff00) >> 8)  + \
                     ( ((x) & 0x000000ff) >> 0)    \
                     )

#define CHKSUM(x) ((unsigned char) (~(x)  & 0x000000ff))

#define SRE_DATA_SIZE 0x28

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
LPCTSTR GetLastErrorString(void){
  static LPTSTR  errorMessage  = NULL;
  ULONG  errorMsgSize  = 0;

  // free the last message so that we don't have more than one 
  // out at a time and limit what would otherwise be a leak.
  if(errorMessage)
    LocalFree(errorMessage);
      
  if(!(errorMsgSize = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                                    FORMAT_MESSAGE_FROM_SYSTEM     |
                                    FORMAT_MESSAGE_IGNORE_INSERTS,
                                    NULL,
                                    GetLastError(),
                                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                                    (LPTSTR) &errorMessage,
                                    0,
                                    NULL))){
    fprintf(stderr, TEXT("GetLastErrorString failed [%x]"), GetLastError());
    errorMessage = NULL;
  }
                   
  return errorMessage;
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
PTCHAR BaseName(LPTSTR filename){
  static TCHAR base[MAX_PATH];
  PTCHAR ptr;

  strncpy(base, filename, sizeof(base) - 1);
  base[sizeof(base) - 1] = '\0';

  ptr = strchr(base, '.');
  if(ptr) 
      *ptr = '\0';

  return base;
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BOOL WriteSREHeader(){
    BOOL fRet;
    DWORD dwWrite;
    TCHAR temp[MAX_PATH];

    sprintf(temp, "%s.sre", BaseName(g_szFilename));
    hSRE = CreateFile (temp, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 
                       NULL, OPEN_ALWAYS, 0, 0);

    if (hSRE == INVALID_HANDLE_VALUE) {
        printf ("Error opening '%s'\n", temp);
        return FALSE;
    }

    fRet = WriteFile (hSRE, "S0030000FC\n", 11, &dwWrite, NULL);
    if (!fRet || dwWrite != 11) {
        printf("Error writing SRE file '%s' (%d)\n", temp, __LINE__);
        CloseHandle (hSRE);
        hSRE = INVALID_HANDLE_VALUE;

⌨️ 快捷键说明

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