📄 viewbin.c
字号:
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 + -