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

📄 checksymbols.c

📁 WinCE5.0部分核心源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        if (g_Records[i].dwLength == sizeof(ROMHDR)) {
            
            //
            // If this _IS_ the TOC record, compute the ROM Offset.
            //
            dwROMOffsetRead = (DWORD) g_Records[i].dwStartAddress - (DWORD) g_pTOC;

//            printf("Checking record #%d for potential TOC (ROMOFFSET = 0x%08X)\n", i, dwROMOffsetRead);
            //
            // Read out the record to verify. (unadjusted)
            //
            fRet = ReadBinFile(pBuffer, g_Records[i].dwStartAddress, sizeof(ROMHDR), 0);
    
            if (fRet) {
                ROMHDR* pTOC = (ROMHDR*) pBuffer;
            
                if ((pTOC->physfirst == (g_dwImageStart - dwROMOffsetRead)) &&
                    (pTOC->physlast  == (g_dwImageStart - dwROMOffsetRead) + g_dwImageLength)) {

                    //
                    // Extra sanity check...
                    //
                    if (pTOC->dllfirst <= pTOC->dlllast && pTOC->dlllast == 0x02000000) { 
                        fFoundIt = TRUE;
                        break;
                    } else {
                        printf ("NOTICE! Record %d looked like a TOC except DLL first = 0x%08X, and DLL last = 0x%08X\r\n", i, pTOC->dllfirst, pTOC->dlllast);
                    }
                } else {
                    printf ("NOTICE! Record %d looked like a TOC except Phys first = 0x%08X, and Phys last = 0x%08X\r\n", i, pTOC->physfirst, pTOC->physlast);
                }
            }
        }
    }

    if (fFoundIt) {
        g_dwROMOffset = dwROMOffsetRead;
    } else {
        g_dwROMOffset = 0;
    }
//    printf("ROMOFFSET = 0x%08X\n", g_dwROMOffset);

    return 0;
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
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;

        g_dwNumModules = pTOC->nummods;
        g_dwNumFiles = pTOC->numfiles;
        g_dwNumCopySects = pTOC->ulCopyEntries;
        g_dwCopyOffset = pTOC->ulCopyOffset;

    } else {
        printf("Couldn't locate TOC data\n");
        return;
    }


    //-------------------------------------------
    // 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;
        char szFilename[MAX_PATH];
        char szStatus[128];
        FILETIME ft;

        printf("\n");

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

            HANDLE hFile;

            sprintf(szStatus, "okay");
            fRet = ReadBinFile((PBYTE) szFilename, (DWORD) pte[i].lpszFileName, 0, g_dwROMOffset);
            FileTimeToSystemTime(&(pte[i].ftTime), &st);

            hFile = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

            if (hFile == INVALID_HANDLE_VALUE) {
                sprintf(szStatus, "FILE NOT FOUND!");
                g_fRet = TRUE;
            } else {
                if (GetFileTime(hFile, NULL, NULL, &ft)) {
                    if (CompareFileTime(&(pte[i].ftTime), &ft)) {
                        sprintf(szStatus, "Timestamps do not match!");
                        g_fRet = TRUE;
                    } else {
                        if (GetFileSize(hFile, NULL) != pte[i].nFileSize) {
                            sprintf(szStatus, "File sizes do not match!");
                            g_fRet = TRUE;
                        }
                    }
                } else {
                    sprintf(szStatus, "Couldn't get file time!");
                    g_fRet = TRUE;
                }
                CloseHandle(hFile);
            }
            printf("    %2d/%02d/%04d  %02d:%02d:%02d  %10d  %20s (%s)\n", 
                   st.wMonth, st.wDay, st.wYear,
                   st.wHour, st.wMinute, st.wSecond,
                   pte[i].nFileSize, szFilename, szStatus);
        }
    } else {
        printf("ERROR: Couldn't locate Modules data\n");
    }

}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
    DWORD dwRecAddr, dwRecLen, dwRecChk;
    DWORD dwRead;
    BOOL  fRet;
    LPTSTR pszCmdLine;
    char szAscii[17];

    pszCmdLine = GetCommandLine();

    // Parse command line parameters (updates the ui variables).
    if (!parseCmdLine(pszCmdLine))  
       return 0;
   
    
    printf("CHECKSYMBOLS... %s\n", g_szFilename);
    
    
    hFile = CreateFile(g_szFilename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
                       NULL, OPEN_EXISTING, 0, 0);

    if (hFile == INVALID_HANDLE_VALUE) {
        printf ("Error opening %s\n", g_szFilename);
        return 0;
    }
    

    fRet = ReadFile(hFile, pBuffer, 7, &dwRead, NULL);
    
    if (!fRet || dwRead != 7) {
        printf("Error reading %s (%d)\n", g_szFilename, __LINE__);
        CloseHandle(hFile);
        return 0;
    }
    
    if (memcmp( pBuffer, "B000FF\x0A", 7 )) {
        printf("Missing initial signature (BOOOFF\x0A). Not a BIN file\n");
        CloseHandle(hFile);
        return 0;
    }

    //
    // Read the image header
    // 
    fRet = ReadFile(hFile, &g_dwImageStart, sizeof(DWORD), &dwRead, NULL);

    if (!fRet || dwRead != sizeof(DWORD)) {
        CloseHandle(hFile);
        return 0;
    }

    fRet = ReadFile(hFile, &g_dwImageLength, sizeof(DWORD), &dwRead, NULL);

    if (!fRet || dwRead != sizeof(DWORD)) {
        CloseHandle(hFile);
        return 0;
    }

//    printf("Image Start = 0x%08X, length = 0x%08X\n", g_dwImageStart, g_dwImageLength);

    szAscii[16] = '\0';
    //
    // Now read the records.
    //
    while (1) {
                
        //
        // Record address
        //
        fRet = ReadFile(hFile, &dwRecAddr, sizeof(DWORD), &dwRead, NULL);

        if (!fRet || dwRead != sizeof(DWORD)) {
            break;
        }

        //
        // Record length
        //
        fRet = ReadFile(hFile, &dwRecLen, sizeof(DWORD), &dwRead, NULL);

        if (!fRet || dwRead != sizeof(DWORD)) {
            break;
        }

        //
        // Record checksum
        //
        fRet = ReadFile(hFile, &dwRecChk, sizeof(DWORD), &dwRead, NULL);

        if (!fRet || dwRead != sizeof(DWORD)) {
            break;
        }

        g_Records[g_dwNumRecords].dwStartAddress = dwRecAddr;
        g_Records[g_dwNumRecords].dwLength       = dwRecLen;
        g_Records[g_dwNumRecords].dwChecksum     = dwRecChk;
        g_Records[g_dwNumRecords].dwFilePointer  = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);

        if (g_fPrintRecords || g_fPrintData) {
            printf("Record [%3d] : Start = 0x%08X, Length = 0x%08X, Chksum = 0x%08X\n", g_dwNumRecords, dwRecAddr, dwRecLen, dwRecChk);
        }
        g_dwNumRecords++;
        
        if (dwRecAddr == 0) {
            g_dwStartAddr = dwRecLen;
            break;
        }
        
        SetFilePointer(hFile, dwRecLen, NULL, FILE_CURRENT);

    }

    //
    // Find pTOC
    //
    fRet = ReadBinFile(pBuffer, g_dwImageStart + 0x40, 8, 0);
    if (fRet) {
        g_pTOC = *((PDWORD) (pBuffer + 4));
    } else {
        printf ("Couldn't find pTOC @ Image Start (0x%08X) + 0x40\n", g_dwImageStart);
        return TRUE;
    }

    ComputeRomOffset();

    if (g_fPrintTOC || g_fPrintOBJ) {
        PrintTOC();
    }

    CloseHandle(hFile);
    return g_fRet;
}

⌨️ 快捷键说明

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