📄 checksymbols.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
//------------------------------------------------------------------------------
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
//------------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <pehdr.h>
#include <romldr.h>
#define BUFFER_SIZE 64*1024
BYTE pBuffer[BUFFER_SIZE];
DWORD dwFreq;
DWORD dwHighTime = 0;
BOOL g_fRet;
LPTSTR g_szFilename;
BOOL g_fPrintData;
BOOL g_fPrintRecords;
BOOL g_fGenerateSRE;
BOOL g_fGenerateROM;
BOOL g_fPrintTOC;
BOOL g_fPrintOBJ;
BOOL g_fCheckFiles;
HANDLE hFile;
HANDLE hSRE;
HANDLE hRaw[8]; // should support a rom width of 8 in a 64 bit environment
DWORD g_dwImageStart;
DWORD g_dwImageLength;
DWORD g_dwNumRecords;
DWORD g_pTOC = 0;
DWORD g_dwROMOffset;
DWORD g_dwNumFiles;
DWORD g_dwNumModules;
DWORD g_dwNumCopySects;
DWORD g_dwCopyOffset;
DWORD g_dwStartAddr;
DWORD g_iRomStartAddr;
DWORD g_iRomLength;
DWORD g_iRomWidth;
typedef struct _RECORD_DATA {
DWORD dwStartAddress;
DWORD dwLength;
DWORD dwChecksum;
DWORD dwFilePointer;
} RECORD_DATA, *PRECORD_DATA;
#define MAX_RECORDS 2048
RECORD_DATA g_Records[MAX_RECORDS];
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void
printHelp(void)
{
printf("Usage: checksymbols <filename>\r\n");
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
TCHAR*
getNextWord(
TCHAR **ppCmdLine,
TCHAR *pStorage
)
{
TCHAR *pWord;
// First restore the saved char.
**ppCmdLine = *pStorage;
// Move over initial white space, and save the start of the word.
while (**ppCmdLine && (**ppCmdLine == TEXT(' ') || **ppCmdLine == TEXT('\t')))
(*ppCmdLine)++;
pWord = *ppCmdLine;
// Move over the word, store the char right after the word, and zero-terminate the word.
while (**ppCmdLine && **ppCmdLine != TEXT(' ') && **ppCmdLine != TEXT('\t'))
(*ppCmdLine)++;
*pStorage = **ppCmdLine;
**ppCmdLine = 0;
// Return start of word, or zero (in case the word is empty).
if (*pWord)
return pWord;
else
return 0;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BOOL
parseCmdLine(
TCHAR *pCmdLine
)
{
TCHAR storage = *pCmdLine; // getNextWord needs to store a char
TCHAR *word;
//
// Eat the EXE name first.
//
word = getNextWord(&pCmdLine, &storage);
// Keep getting words from the command line.
while (word = getNextWord(&pCmdLine, &storage)) {
if (!_tcscmp(TEXT("-data"), word) || !_tcscmp(TEXT("-d"), word)) {
g_fPrintData = TRUE;
}
else if (!_tcscmp(TEXT("-toc"), word) || !_tcscmp(TEXT("-t"), word)) {
g_fPrintTOC = TRUE;
}
else if (!_tcscmp(TEXT("-obj"), word) || !_tcscmp(TEXT("-o"), word)) {
g_fPrintOBJ = TRUE;
}
else if (!_tcscmp(TEXT("-rec"), word) || !_tcscmp(TEXT("-r"), word)) {
g_fPrintRecords = TRUE;
}
else if (!_tcscmp(TEXT("-checkfiles"), word) || !_tcscmp(TEXT("-c"), word)) {
g_fCheckFiles = TRUE;
}
else if (word[0] == '-') {
printf("Unknown option... %s\n", word);
goto EXIT;
}
else {
g_szFilename = word;
}
}
g_fPrintTOC = TRUE;
if (g_szFilename == NULL) {
printf("Filename required\n");
goto EXIT;
}
return TRUE;
EXIT:
printHelp();
return FALSE;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BOOL
CheckBinFile(
DWORD dwAddress,
DWORD dwLength
)
{
DWORD i;
//
// Adjust if needed
//
dwAddress += g_dwROMOffset;
for (i = 0; i < g_dwNumRecords; i++) {
if (g_Records[i].dwStartAddress <= dwAddress &&
g_Records[i].dwStartAddress + g_Records[i].dwLength >= (dwAddress + dwLength)) {
return TRUE;
}
}
return FALSE;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BOOL
ReadBinFile(
PBYTE pDestBuffer,
DWORD dwAddress,
DWORD dwLength,
DWORD dwROMOffsetRead
)
{
DWORD dwRead;
BOOL fRet;
DWORD i;
DWORD dwDiff;
if (dwLength > BUFFER_SIZE) {
printf ("Trying to read %d bytes (too big)\n", dwLength);
return FALSE;
}
//
// Adjust if needed
//
dwAddress += dwROMOffsetRead;
for (i = 0; i < g_dwNumRecords; i++) {
if (g_Records[i].dwStartAddress <= dwAddress &&
g_Records[i].dwStartAddress + g_Records[i].dwLength >= (dwAddress + dwLength)) {
//
// Offset into the record.
//
dwDiff = dwAddress - g_Records[i].dwStartAddress;
SetFilePointer(hFile, g_Records[i].dwFilePointer + dwDiff, NULL, FILE_BEGIN);
if (dwLength) {
fRet = ReadFile(hFile, pDestBuffer, dwLength, &dwRead, NULL);
if (!fRet || dwRead != dwLength) {
return FALSE;
}
} else {
int count = 0;
do {
fRet = ReadFile(hFile, pDestBuffer, 1, &dwRead, NULL);
count++;
} while (*pDestBuffer++);
// no string here to read or string left record, then must have been the wrong record
if(!count || g_Records[i].dwStartAddress + g_Records[i].dwLength < (dwAddress + count)){
pDestBuffer -= count;
continue;
}
}
return TRUE;
}
}
return FALSE;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
DWORD
ComputeRomOffset()
{
DWORD i;
BOOL fFoundIt = FALSE;
BOOL fRet;
DWORD dwROMOffsetRead;
for (i = 0; i < g_dwNumRecords; i++) {
//
// Check for potential TOC records
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -