diff --git a/reactos/tools/CMakeLists.txt b/reactos/tools/CMakeLists.txt index dc58496d9d5..3be4ab36b8f 100644 --- a/reactos/tools/CMakeLists.txt +++ b/reactos/tools/CMakeLists.txt @@ -6,6 +6,7 @@ add_subdirectory(cdmake) add_subdirectory(gendib) add_subdirectory(geninc) add_subdirectory(mkhive) +add_subdirectory(obj2bin) add_subdirectory(spec2def) add_subdirectory(unicode) diff --git a/reactos/tools/obj2bin/CMakeLists.txt b/reactos/tools/obj2bin/CMakeLists.txt new file mode 100644 index 00000000000..83edc3254d7 --- /dev/null +++ b/reactos/tools/obj2bin/CMakeLists.txt @@ -0,0 +1 @@ +add_executable(obj2bin obj2bin.c) diff --git a/reactos/tools/obj2bin/obj2bin.c b/reactos/tools/obj2bin/obj2bin.c new file mode 100644 index 00000000000..9660f4e5867 --- /dev/null +++ b/reactos/tools/obj2bin/obj2bin.c @@ -0,0 +1,112 @@ +#include +#include +#include "../pecoff.h" + +static +void +Usage(void) +{ + printf("Converts a coff object file into a raw binary file.\n" + "Syntax: obj2bin \n"); +} + +int main(int argc, char *argv[]) +{ + char *pszSourceFile; + char *pszDestFile; + FILE *pSourceFile, *pDestFile; + IMAGE_FILE_HEADER FileHeader; + IMAGE_SECTION_HEADER SectionHeader; + unsigned int i, nSize; + void *pData; + + if ((argc != 3) || (strcmp(argv[1], "--help") == 0)) Usage(); + + pszSourceFile = argv[1]; + pszDestFile = argv[2]; + + pSourceFile = fopen(pszSourceFile, "rb"); + if (!pSourceFile) + { + fprintf(stderr, "Couldn't open source file '%s'\n", pszSourceFile); + return -1; + } + + pDestFile = fopen(pszDestFile, "wb"); + if (!pszDestFile) + { + fprintf(stderr, "Couldn't open dest file '%s'\n", pszDestFile); + return -2; + } + + /* Load the coff header */ + nSize = fread(&FileHeader, 1, sizeof(FileHeader), pSourceFile); + if (nSize != sizeof(FileHeader)) + { + fprintf(stderr, "Failed to read source file\n"); + return -3; + } + + /* Jump to section headers (skip optional header) */ + if (fseek(pSourceFile, FileHeader.SizeOfOptionalHeader, SEEK_CUR)) + { + fprintf(stderr, "Failed to set file pointer\n"); + return -4; + } + + /* Loop all sections */ + for (i = 0; i < FileHeader.NumberOfSections; i++) + { + /* Read section header */ + nSize = fread(&SectionHeader, 1, sizeof(SectionHeader), pSourceFile); + if (nSize != sizeof(SectionHeader)) + { + fprintf(stderr, "Failed to read section %ld file\n", i); + return -5; + } + + /* Check if this is '.text' section */ + if (strcmp(SectionHeader.Name, ".text") == 0) break; + } + + if (i == FileHeader.NumberOfSections) + { + fprintf(stderr, "No .text section found\n"); + return -6; + } + + /* Move file pointer to the start of the section*/ + if (fseek(pSourceFile, SectionHeader.PointerToRawData, SEEK_SET)) + { + fprintf(stderr, "Failed to set file pointer\n"); + return -7; + } + + /* Allocate memory for the section */ + pData = malloc(SectionHeader.SizeOfRawData); + if (!pData) + { + fprintf(stderr, "Failed to allocate %ld bytes\n", SectionHeader.SizeOfRawData); + return -8; + } + + /* Read section data */ + if (!fread(pData, SectionHeader.SizeOfRawData, 1, pSourceFile)) + { + fprintf(stderr, "Failed to read section %ld file\n", i); + return -5; + } + + /* Write the section to the destination file */ + if (!fwrite(pData, SectionHeader.SizeOfRawData, 1, pDestFile)) + { + fprintf(stderr, "Failed to write data\n"); + return -9; + } + + fclose(pDestFile); + fclose(pSourceFile); + + return 0; +} + diff --git a/reactos/tools/pecoff.h b/reactos/tools/pecoff.h new file mode 100644 index 00000000000..d3a32502c09 --- /dev/null +++ b/reactos/tools/pecoff.h @@ -0,0 +1,207 @@ +#pragma once + +#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b +#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b + +#define IMAGE_DOS_MAGIC 0x5a4d +#define IMAGE_PE_MAGIC 0x00004550 +#define IMAGE_SIZEOF_SHORT_NAME 8 + +#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 +#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 +#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 + +#define IMAGE_FILE_MACHINE_I386 0x14c +#define IMAGE_FILE_MACHINE_AMD64 0x8664 +#define IMAGE_FILE_MACHINE_IA64 0x0200 + +#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 + +#define IMAGE_SCN_TYPE_NOLOAD 0x00000002 +#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 +#define IMAGE_SCN_CNT_CODE 0x00000020 +#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 +#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 +#define IMAGE_SCN_LNK_OTHER 0x00000100 +#define IMAGE_SCN_LNK_INFO 0x00000200 +#define IMAGE_SCN_LNK_REMOVE 0x00000800 +#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 +#define IMAGE_SCN_GPREL 0x00008000 +#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 +#define IMAGE_SCN_MEM_LOCKED 0x00040000 +#define IMAGE_SCN_MEM_PRELOAD 0x00080000 +#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 +#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 +#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 +#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 +#define IMAGE_SCN_MEM_SHARED 0x10000000 +#define IMAGE_SCN_MEM_EXECUTE 0x20000000 +#define IMAGE_SCN_MEM_READ 0x40000000 +#define IMAGE_SCN_MEM_WRITE 0x80000000 + +#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 + +typedef unsigned char BYTE; +typedef unsigned char UCHAR; +typedef unsigned short WORD; +typedef unsigned short USHORT; +typedef unsigned long long ULONGLONG; +#if defined(__x86_64__) && !defined(_WIN64) +typedef signed int LONG; +typedef unsigned int ULONG; +typedef unsigned int DWORD; +#else +typedef signed long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; +#endif +#if defined(_WIN64) +typedef unsigned __int64 ULONG_PTR; +#else +#if defined(__x86_64__) && !defined(_WIN64) +typedef unsigned int ULONG_PTR; +#else +typedef unsigned long ULONG_PTR; +#endif +#endif + +#pragma pack(push,2) +typedef struct _IMAGE_DOS_HEADER { + WORD e_magic; + WORD e_cblp; + WORD e_cp; + WORD e_crlc; + WORD e_cparhdr; + WORD e_minalloc; + WORD e_maxalloc; + WORD e_ss; + WORD e_sp; + WORD e_csum; + WORD e_ip; + WORD e_cs; + WORD e_lfarlc; + WORD e_ovno; + WORD e_res[4]; + WORD e_oemid; + WORD e_oeminfo; + WORD e_res2[10]; + LONG e_lfanew; +} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER; +#pragma pack(pop) + +#pragma pack(push,4) +typedef struct _IMAGE_FILE_HEADER { + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; +} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; +#pragma pack(pop) + +typedef struct _IMAGE_DATA_DIRECTORY { + DWORD VirtualAddress; + DWORD Size; +} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; + +typedef struct _IMAGE_OPTIONAL_HEADER32 { + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + DWORD BaseOfData; + DWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + DWORD SizeOfStackReserve; + DWORD SizeOfStackCommit; + DWORD SizeOfHeapReserve; + DWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32; + +typedef struct _IMAGE_OPTIONAL_HEADER64 { + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + ULONGLONG ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + ULONGLONG SizeOfStackReserve; + ULONGLONG SizeOfStackCommit; + ULONGLONG SizeOfHeapReserve; + ULONGLONG SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +} IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64; + +#ifdef _TARGET_PE64 +typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER; +typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER; +#else +typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER; +typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER; +#endif + +typedef struct _IMAGE_SECTION_HEADER { + BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; + union { + DWORD PhysicalAddress; + DWORD VirtualSize; + } Misc; + DWORD VirtualAddress; + DWORD SizeOfRawData; + DWORD PointerToRawData; + DWORD PointerToRelocations; + DWORD PointerToLinenumbers; + WORD NumberOfRelocations; + WORD NumberOfLinenumbers; + DWORD Characteristics; +} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; + +#pragma pack(push,4) +typedef struct _IMAGE_BASE_RELOCATION { + DWORD VirtualAddress; + DWORD SizeOfBlock; + WORD TypeOffset[1]; +} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; +#pragma pack(pop) + diff --git a/reactos/tools/rsym/rsym.h b/reactos/tools/rsym/rsym.h index 386b064b4a4..6b91d6e6fed 100644 --- a/reactos/tools/rsym/rsym.h +++ b/reactos/tools/rsym/rsym.h @@ -1,209 +1,7 @@ /* rsym.h */ #pragma once - -#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b -#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b - -#define IMAGE_DOS_MAGIC 0x5a4d -#define IMAGE_PE_MAGIC 0x00004550 -#define IMAGE_SIZEOF_SHORT_NAME 8 - -#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 -#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 -#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 - -#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 - -#define IMAGE_SCN_TYPE_NOLOAD 0x00000002 -#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 -#define IMAGE_SCN_CNT_CODE 0x00000020 -#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 -#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 -#define IMAGE_SCN_LNK_OTHER 0x00000100 -#define IMAGE_SCN_LNK_INFO 0x00000200 -#define IMAGE_SCN_LNK_REMOVE 0x00000800 -#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 -#define IMAGE_SCN_GPREL 0x00008000 -#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 -#define IMAGE_SCN_MEM_LOCKED 0x00040000 -#define IMAGE_SCN_MEM_PRELOAD 0x00080000 -#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 -#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 -#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 -#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 -#define IMAGE_SCN_MEM_SHARED 0x10000000 -#define IMAGE_SCN_MEM_EXECUTE 0x20000000 -#define IMAGE_SCN_MEM_READ 0x40000000 -#define IMAGE_SCN_MEM_WRITE 0x80000000 - -#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 - -typedef unsigned char BYTE; -typedef unsigned char UCHAR; -typedef unsigned short WORD; -typedef unsigned short USHORT; -typedef unsigned long long ULONGLONG; -#if defined(__x86_64__) && !defined(_WIN64) -typedef signed int LONG; -typedef unsigned int ULONG; -typedef unsigned int DWORD; -#else -typedef signed long LONG; -typedef unsigned long ULONG; -typedef unsigned long DWORD; -#endif -#if defined(_WIN64) -typedef unsigned __int64 ULONG_PTR; -#else -#if defined(__x86_64__) && !defined(_WIN64) -typedef unsigned int ULONG_PTR; -#else -typedef unsigned long ULONG_PTR; -#endif -#endif - -#pragma pack(push,2) - -typedef struct _IMAGE_DOS_HEADER { - WORD e_magic; - WORD e_cblp; - WORD e_cp; - WORD e_crlc; - WORD e_cparhdr; - WORD e_minalloc; - WORD e_maxalloc; - WORD e_ss; - WORD e_sp; - WORD e_csum; - WORD e_ip; - WORD e_cs; - WORD e_lfarlc; - WORD e_ovno; - WORD e_res[4]; - WORD e_oemid; - WORD e_oeminfo; - WORD e_res2[10]; - LONG e_lfanew; -} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER; -#pragma pack(pop) - -#pragma pack(push,4) -typedef struct _IMAGE_FILE_HEADER { - WORD Machine; - WORD NumberOfSections; - DWORD TimeDateStamp; - DWORD PointerToSymbolTable; - DWORD NumberOfSymbols; - WORD SizeOfOptionalHeader; - WORD Characteristics; -} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; -#pragma pack(pop) - -typedef struct _IMAGE_DATA_DIRECTORY { - DWORD VirtualAddress; - DWORD Size; -} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; - -typedef struct _IMAGE_OPTIONAL_HEADER32 { - WORD Magic; - BYTE MajorLinkerVersion; - BYTE MinorLinkerVersion; - DWORD SizeOfCode; - DWORD SizeOfInitializedData; - DWORD SizeOfUninitializedData; - DWORD AddressOfEntryPoint; - DWORD BaseOfCode; - DWORD BaseOfData; - DWORD ImageBase; - DWORD SectionAlignment; - DWORD FileAlignment; - WORD MajorOperatingSystemVersion; - WORD MinorOperatingSystemVersion; - WORD MajorImageVersion; - WORD MinorImageVersion; - WORD MajorSubsystemVersion; - WORD MinorSubsystemVersion; - DWORD Win32VersionValue; - DWORD SizeOfImage; - DWORD SizeOfHeaders; - DWORD CheckSum; - WORD Subsystem; - WORD DllCharacteristics; - DWORD SizeOfStackReserve; - DWORD SizeOfStackCommit; - DWORD SizeOfHeapReserve; - DWORD SizeOfHeapCommit; - DWORD LoaderFlags; - DWORD NumberOfRvaAndSizes; - IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32; - -typedef struct _IMAGE_OPTIONAL_HEADER64 { - WORD Magic; - BYTE MajorLinkerVersion; - BYTE MinorLinkerVersion; - DWORD SizeOfCode; - DWORD SizeOfInitializedData; - DWORD SizeOfUninitializedData; - DWORD AddressOfEntryPoint; - DWORD BaseOfCode; - ULONGLONG ImageBase; - DWORD SectionAlignment; - DWORD FileAlignment; - WORD MajorOperatingSystemVersion; - WORD MinorOperatingSystemVersion; - WORD MajorImageVersion; - WORD MinorImageVersion; - WORD MajorSubsystemVersion; - WORD MinorSubsystemVersion; - DWORD Win32VersionValue; - DWORD SizeOfImage; - DWORD SizeOfHeaders; - DWORD CheckSum; - WORD Subsystem; - WORD DllCharacteristics; - ULONGLONG SizeOfStackReserve; - ULONGLONG SizeOfStackCommit; - ULONGLONG SizeOfHeapReserve; - ULONGLONG SizeOfHeapCommit; - DWORD LoaderFlags; - DWORD NumberOfRvaAndSizes; - IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -} IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64; - - -#ifdef _TARGET_PE64 -typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER; -typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER; -#else -typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER; -typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER; -#endif - -typedef struct _IMAGE_SECTION_HEADER { - BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; - union { - DWORD PhysicalAddress; - DWORD VirtualSize; - } Misc; - DWORD VirtualAddress; - DWORD SizeOfRawData; - DWORD PointerToRawData; - DWORD PointerToRelocations; - DWORD PointerToLinenumbers; - WORD NumberOfRelocations; - WORD NumberOfLinenumbers; - DWORD Characteristics; -} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; - -#pragma pack(push,4) -typedef struct _IMAGE_BASE_RELOCATION { - DWORD VirtualAddress; - DWORD SizeOfBlock; - WORD TypeOffset[1]; -} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; -#pragma pack(pop) +#include "../pecoff.h" typedef struct { USHORT f_magic; /* magic number */