#include #include #include #include #include #include "optable.h" #define MajorVersion 4 #define MinorVersion 0 #ifndef _CRTAPI1 #define _CRTAPI1 __cdecl #endif #define RMALLOC( ret, size, string ) \ ret = (PVOID)malloc( size ); \ if (ret == NULL) { \ fprintf(stderr,"Failed to allocate memory: %s (0x%x bytes)\n", \ string, size); \ return FAILURE; \ } #define EMALLOC( ret, size, string ) \ ret = (PVOID)malloc( size ); \ if (ret == NULL) { \ fprintf(stderr,"Failed to allocate memory: %s (0x%x bytes)\n", \ string, size); \ exit( 1 ); \ } #define RFREAD( ret, buf, len, num, file, string ) \ ret = fread( (PUCHAR)buf, len, num, file ); \ if ((UINT)ret != num) { \ fprintf(stderr,"Failed to read: %s (0x%x bytes)\n", string, len*num); \ return FAILURE; \ } #define EFREAD( ret, buf, len, num, file, string ) \ ret = fread( (PUCHAR)buf, len, num, file ); \ if ((UINT)ret != num) { \ fprintf(stderr,"Failed to read: %s (0x%x bytes)\n", string, len*num); \ return; \ } //-------------------------------------------- #define EvenByte(x) ( (x&1) ? (x+1) : x ) #define MAX_SECTIONS 1024 // // options // #define VERBOSE 0x00000001 #define EMPTY_OPT 0x00000002 #define DEBUG 0x00000004 #define TVB 0x00000008 #define MARK_FLOAT 0x00000010 #define NO_SYMBOLS 0x00000020 #define SPECIFIC 0x00000040 #define ASSEMBLE_ME 0x00000080 #define DEBUG_DIR 0x00000100 #define SYMBOLS_ONLY 0x00000200 #define DISASSEMBLE_ADDRESS 0x00000400 // // drive table for print/format control // #define INTEL_OPCODE_COL 25 #define INTEL_OPCODE_COL_ASSEMBLE 5 #define INTEL_OPERAND_COL 28 #define INTEL_OPERAND_COL_ASSEMBLE 23 #define INTEL_COMMENT_COL 48 #define INTEL_COMMENT_COL_ASSEMBLE 40 #define INTEL_EMPTY_INSTRUCTION 0x00000000 #define INTEL_COMMENT_CHARS "; " #define INTEL_ASSEMBLE_INCLUDE "#include " #define MIPS_OPCODE_COL 10 #define MIPS_OPCODE_COL_ASSEMBLE 5 #define MIPS_OPERAND_COL 28 #define MIPS_OPERAND_COL_ASSEMBLE 23 #define MIPS_COMMENT_COL 48 #define MIPS_COMMENT_COL_ASSEMBLE 40 #define MIPS_EMPTY_INSTRUCTION 0x00000000 #define MIPS_COMMENT_CHARS "// " #define MIPS_ASSEMBLE_INCLUDE "#include " #define ALPHA_OPCODE_COL 10 #define ALPHA_OPCODE_COL_ASSEMBLE 5 #define ALPHA_OPERAND_COL 28 #define ALPHA_OPERAND_COL_ASSEMBLE 23 #define ALPHA_COMMENT_COL 48 #define ALPHA_COMMENT_COL_ASSEMBLE 40 #define ALPHA_EMPTY_INSTRUCTION 0x00000000 #define ALPHA_COMMENT_CHARS "// " #define ALPHA_ASSEMBLE_INCLUDE "#include \n#define at AT\n\n\t.set noat" #define ALPHA_INDEX 0 #define MIPS_INDEX 1 #define INTEL_INDEX 2 #define MAX_PLATFORM 3 #define REGULAR_DISASSEMBLE 0 #define ASSEMBLE_DISASSEMBLE 1 #define OPCODE_COL 0 #define OPERAND_COL 1 #define COMMENT_COL 2 // // define file types // #define LIBRARY_FILE 0 #define OBJECT_FILE 1 #define EXE_FILE 2 #define ROM_FILE 3 // // misc stuff // #define FAILURE -1 #define SUCCESS 0 #define LAST_ONE 0xffffffff //-------------------------------------------- typedef struct _Options { unsigned long Mask; } Options; typedef struct _SymLookup { ULONG Value; PIMAGE_SYMBOL pSymbol; } SymLookup, *pSymLookup; typedef struct _FileList { struct _FileList *Next; // // Stuff right out of the image/object/library, and exists // only once per image/object/library. // UCHAR *Name; PVOID pSymbolTable; PVOID pStringTable; PVOID pPdata; ULONG NumSymbols; ULONG NumPdataEntries; // // Stuff that gets cycled through, on a section by section basis // PVOID pData; PVOID pRelocations; PVOID pLineNumbers; // // Messaged information // // // 0'th element is a sorted list of ALL symbols. // the n'th element is a sorted list of all symbols for that section. // pSymLookup pSectionSymbols[MAX_SECTIONS]; ULONG SymbolCount[MAX_SECTIONS]; } FileList, *pFileList; typedef unsigned long ADDR; typedef unsigned long *PADDR; typedef struct _PlatformGoop { ULONG OpcodeColumn[2]; ULONG OperandColumn[2]; ULONG CommentColumn[2]; PUCHAR pCommentChars; PUCHAR pIncludeString; ULONG EmptyInstruction; } PlatformGoop, *pPlatformGoop; extern PlatformGoop PlatformAttr[MAX_PLATFORM]; // // In dis32.c // extern VOID PrintHelp(VOID); extern INT _CRTAPI1 main(INT, PUCHAR *); extern INT ProcessCommandLine(INT, PUCHAR *); extern VOID Disassemble(VOID); extern VOID FreeFileList(VOID); extern INT SetOptions(INT, PUCHAR *); extern VOID GetFileList(INT, PUCHAR *); extern INT OpenDisFile(PUCHAR); extern VOID CloseDisFile(VOID); extern VOID Dump(pFileList, INT); extern VOID DumpLib(pFileList); extern INT ReadPdata(pFileList, INT); extern INT ReadSymbolTable(pFileList, INT); extern VOID GenerateDataSections(PUCHAR, ULONG, PIMAGE_SECTION_HEADER, ULONG, pFileList); extern VOID OutputCommonSymbols(pFileList); // // From common discom.c // extern PUCHAR BlankFill(PUCHAR, PUCHAR, ULONG); extern PUCHAR OutputHex(PUCHAR, ULONG, ULONG, BOOLEAN); extern PUCHAR OutputHexString (PUCHAR, PUCHAR, INT); extern PUCHAR OutputHexCode(PUCHAR, PUCHAR, INT); extern PUCHAR OutputHexValue(PUCHAR, PUCHAR, INT, INT); extern PUCHAR OutputEffectiveAddress(PUCHAR, ULONG); extern PUCHAR OutputString(PUCHAR, PUCHAR); extern PUCHAR OutputCountString(PUCHAR, PUCHAR, ULONG); extern PUCHAR OutputReg(PUCHAR, ULONG); extern PUCHAR OutputFReg(PUCHAR, ULONG); extern PUCHAR OutputSymbol(PUCHAR, PIMAGE_SYMBOL, ULONG); extern INT HexDigits(ULONG); extern PIMAGE_SYMBOL FindObjSymbolByRelocation(ULONG, PIMAGE_SECTION_HEADER); extern PIMAGE_SYMBOL FindObjSymbolByAddress(ULONG, ULONG); extern PIMAGE_SYMBOL FindExeSymbol(ULONG); extern PIMAGE_RELOCATION FindRelocation(ULONG, PIMAGE_SECTION_HEADER); extern PUCHAR GetSymbolString(PIMAGE_SYMBOL, PULONG); // // Misc external routines // extern VOID opTableInit(VOID); // // Platform routines // extern INT disasm_alpha (ULONG, ULONG, PUCHAR, PUCHAR, PUCHAR, PIMAGE_SECTION_HEADER, ULONG ); extern INT disasm_mips (ULONG, ULONG, PUCHAR, PUCHAR, PUCHAR, PIMAGE_SECTION_HEADER, ULONG ); extern INT disasm_intel (ULONG, ULONG, PUCHAR, PUCHAR, PUCHAR, PIMAGE_SECTION_HEADER, ULONG ); // // data // extern pFileList FilesList; extern IMAGE_FILE_HEADER FileHeader; extern INT FileType; extern Options Option; extern PUCHAR Procedure; extern INT ArchitectureType; extern ULONG ImageBase;