[PEFIXUP]
[reactos.git] / reactos / tools / pefixup.c
index e46b422..d6ec1f4 100644 (file)
@@ -24,9 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <fcntl.h>
-#ifndef _WIN32
 #include <unistd.h>
-#endif
 
 #ifndef O_BINARY
 #define O_BINARY 0
@@ -39,6 +37,7 @@ typedef unsigned char BYTE, *PBYTE;
 typedef unsigned short WORD;
 typedef unsigned int DWORD;
 typedef int LONG;
+typedef long LONG_PTR;
 
 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
 #define IMAGE_SIZEOF_SHORT_NAME 8
@@ -46,7 +45,7 @@ typedef int LONG;
 #define IMAGE_NT_SIGNATURE 0x00004550
 #define IMAGE_SCN_MEM_DISCARDABLE 0x2000000
 #define IMAGE_SCN_MEM_NOT_PAGED 0x8000000
-#define FIELD_OFFSET(t,f) ((LONG)&(((t*)0)->f))
+#define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*)0)->f))
 #define IMAGE_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((unsigned long)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))
 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0
 
@@ -201,7 +200,7 @@ void *rva_to_ptr(DWORD rva)
    unsigned int i;
 
    for (i = 0, section_header = IMAGE_FIRST_SECTION(nt_header);
-        i < dtohl(nt_header->OptionalHeader.NumberOfRvaAndSizes);
+        i < dtohl(nt_header->FileHeader.NumberOfSections);
         i++, section_header++)
    {
       if (rva >= dtohl(section_header->VirtualAddress) &&
@@ -229,6 +228,7 @@ int main(int argc, char **argv)
 {
    int fd_in, fd_out;
    long len;
+   char hdrbuf[4] = { }, elfhdr[4] = { '\177', 'E', 'L', 'F' };
    PIMAGE_SECTION_HEADER section_header;
    PIMAGE_DATA_DIRECTORY data_dir;
    unsigned int i;
@@ -257,14 +257,14 @@ int main(int argc, char **argv)
       else if (!strcmp(argv[i], "-exports"))
          fixup_exports = 1;
       else
-         { printf("Invalid option: %s\n", argv[i]); return 1; }
+         { fprintf(stderr, "Invalid option: %s\n", argv[i]); return 1; }
    }
 
+   /*
+    * Nothing to do.
+    */
    if (fixup_sections == 0 && fixup_exports == 0)
-   {
-      printf("Nothing to do.\n");
       return 0;
-   }
 
    /*
     * Read the whole file to memory.
@@ -273,15 +273,22 @@ int main(int argc, char **argv)
    fd_in = open(argv[1], O_RDONLY | O_BINARY);
    if (fd_in == 0)
    {
-      printf("Can't open input file.\n");
+      fprintf(stderr, "Can't open input file.\n");
       return 1;
    }
 
+   /*
+    * PowerPC ReactOS uses elf, so doesn't need pefixup
+    */
+   len = read(fd_in, hdrbuf, sizeof(elfhdr));
+   if (!memcmp(hdrbuf, elfhdr, sizeof(elfhdr)))
+      return 0;
+
    len = lseek(fd_in, 0, SEEK_END);
    if (len < sizeof(IMAGE_DOS_HEADER))
    {
       close(fd_in);
-      printf("'%s' isn't a PE image (too short)\n", argv[1]);
+      fprintf(stderr, "'%s' isn't a PE image (too short)\n", argv[1]);
       return 1;
    }
 
@@ -291,7 +298,7 @@ int main(int argc, char **argv)
    if (buffer == NULL)
    {
       close(fd_in);
-      printf("Not enough memory available.\n");
+      fprintf(stderr, "Not enough memory available.\n");
       return 1;
    }
 
@@ -310,11 +317,11 @@ int main(int argc, char **argv)
 
    dos_header = (PIMAGE_DOS_HEADER)buffer;
    nt_header = (PIMAGE_NT_HEADERS)(buffer + dtohl(dos_header->e_lfanew));
-   
+
    if (dtohs(dos_header->e_magic) != IMAGE_DOS_SIGNATURE ||
        dtohl(nt_header->Signature) != IMAGE_NT_SIGNATURE)
    {
-      printf("'%s' isn't a PE image (bad headers)\n", argv[1]);
+      fprintf(stderr, "'%s' isn't a PE image (bad headers)\n", argv[1]);
       free(buffer);
       return 1;
    }
@@ -336,7 +343,7 @@ int main(int argc, char **argv)
             exports = malloc(sizeof(export_t) * dtohl(export_directory->NumberOfNames));
             if (exports == NULL)
             {
-               printf("Not enough memory.\n");
+               fprintf(stderr, "Not enough memory.\n");
                free(buffer);
                return 1;
             }
@@ -374,6 +381,7 @@ int main(int argc, char **argv)
          if (!strcmp((char*)section_header->Name, ".text") ||
              !strcmp((char*)section_header->Name, ".data") ||
              !strcmp((char*)section_header->Name, ".idata") ||
+             !strcmp((char*)section_header->Name, ".rdata") ||
              !strcmp((char*)section_header->Name, ".bss"))
          {
             section_header->Characteristics |= htodl(IMAGE_SCN_MEM_NOT_PAGED);