Commit dc8f107e authored by John van Groningen's avatar John van Groningen

port to 64 bit windows

parent 311b4811
This diff is collapsed.
......@@ -14,7 +14,7 @@ import StdEnv;
text_addresses :: !{#Int} // for 68k
};
import code from "file_exists.obj";
import code from "file_exists.";
PCorMac pc mac :== pc;
......@@ -56,7 +56,7 @@ read_application file_name application_file_name header files
| not ok
= abort "invalid application file";
#! (n_sections, optional_header_size, app_file) = ReadCOFFHeader app_file;
#! (code_size,data_size,base_of_code,base_of_data,image_base,section_alignment,file_alignment,app_file) = ReadOptionalHeader app_file optional_header_size;
#! (code_size,data_size,base_of_code,image_base,section_alignment,file_alignment,app_file) = ReadOptionalHeader app_file optional_header_size;
#! ((rva_raw_text,text),(rva_raw_data,data),rva_bss,app_file) = ReadSections 0 n_sections (0,"") (0,"") 0 app_file;
#! (ok,files) = fclose app_file files;
| not ok
......@@ -74,33 +74,34 @@ read_application file_name application_file_name header files
= (False,app_file);
#! (pe_signature, app_file) = freads app_file 4;
= (pe_signature == "PE\0\0", app_file);
ReadCOFFHeader app_file
#! (coff_header, app_file) = freads app_file 20
#! machine = coff_header WORD 0;
| machine <> 0x14c
= abort ("invalid application file for i386");
| machine <> IF_INT_64_OR_32 0x8664 0x14c
= abort ("invalid application file for i386: "+++toString machine);
#! n_sections = coff_header WORD 2;
#! optional_header_size = coff_header WORD 16;
#! characteristics = coff_header WORD 18;
| (characteristics bitand 3) <> 3
= abort ("not an exectuable image or relocations not stripped");
= (n_sections, optional_header_size, app_file);
ReadOptionalHeader app_file optional_header_size
#! (optional_header, app_file) = freads app_file optional_header_size;
#! magic = optional_header WORD 0;
| magic <> 0x10b
| magic <> IF_INT_64_OR_32 0x20b 0x10b
= abort ("incorrect magic number");
#! code_size = optional_header LONG 4;
#! data_size = optional_header LONG 8;
#! base_of_code = optional_header LONG 20;
#! base_of_data = optional_header LONG 24;
#! image_base = optional_header LONG 28;
#! image_base = IF_INT_64_OR_32
(((optional_header LONG 24) bitand 0xffffffff) + (optional_header LONG 28<<32))
(optional_header LONG 28);
#! section_alignment = optional_header LONG 32;
#! file_alignment = optional_header LONG 36;
= (code_size,data_size,base_of_code,base_of_data,image_base,section_alignment,file_alignment,app_file);
= (code_size,data_size,base_of_code,image_base,section_alignment,file_alignment,app_file);
ReadSections section_n n_sections text=:(rva_raw_text,raw_text) data=:(rva_raw_data,raw_data) rva_bss app_file
| (section_n == n_sections)
| size raw_text == 0 || size raw_data == 0
......@@ -171,10 +172,15 @@ get_string_from_offset name_offset data
constructor_name :: !Int !Int !Int !{#Char} {#Char} -> (!{#Char},!{#Char});
constructor_name data_begin data_offset arity data text
# descriptor_max_arity_offset = data_offset + (data WORD (data_offset+2));
#! string_offset = descriptor_max_arity_offset+12;
# module_name_pointer = data LONG (descriptor_max_arity_offset + 8);
/*
# nameP = data_offset - (data WORD (data_offset+2));
# total_descriptor_arity = data WORD (nameP - 2);
#! string_offset = nameP+4 + (total_descriptor_arity << 3);
# module_name_pointer = data LONG (nameP - 12);
*/
= (get_string_from_offset string_offset data, get_string_from_pointer module_name_pointer data_begin data);
closure_text_offset descriptor _ /*text_resource_n*/ header
......@@ -189,9 +195,15 @@ get_closure_name :: !Int .a .b !Header !{#Char} !{#Char} -> .(!{#Char},!{#Char})
get_closure_name text_offset arity text_resource_n header text data
# descriptor_pointer = text LONG (text_offset - 4);
# descriptor_offset = address_to_data_offset descriptor_pointer header.data_begin data;
# descriptor_max_arity_offset = descriptor_offset + (data WORD (descriptor_offset+2));
#! function_name_offset = descriptor_max_arity_offset+12;
# module_name_pointer = data LONG (descriptor_max_arity_offset + 8);
/*
# descriptor_arity=data WORD (descriptor_offset-2);
#! function_name_offset = descriptor_offset+4+(descriptor_arity<<3);
#! module_name_pointer = data LONG (descriptor_offset - 12);
*/
= (get_string_from_offset function_name_offset data,get_string_from_pointer module_name_pointer header.data_begin data);
record_name :: !Header !Int !{#Char} .b -> .(!{#Char},!{#Char});
......@@ -208,6 +220,8 @@ record_name header data_offset data text
((string BYTE i) bitor (string BYTE (i+1) << 8));
(LONG) :: !{#Char} !Int -> Int;
(LONG) string i = IF_BIG_ENDIAN
((string BYTE i<<24) bitor (string BYTE (i+1)<<16) bitor (string BYTE (i+2)<<8) bitor (string BYTE (i+3)))
(((string BYTE i) bitor (string BYTE (i+1) << 8) bitor (string BYTE (i+2) << 16) bitor (string BYTE (i+3) << 24)));
(LONG) string i
# r = IF_BIG_ENDIAN
((string BYTE i<<24) bitor (string BYTE (i+1)<<16) bitor (string BYTE (i+2)<<8) bitor (string BYTE (i+3)))
(((string BYTE i) bitor (string BYTE (i+1) << 8) bitor (string BYTE (i+2) << 16) bitor (string BYTE (i+3) << 24)));
= IF_INT_64_OR_32 ((r<<32)>>32) r;
#include <windows.h>
typedef struct clean_string
{ int length;
{ size_t length;
char characters[1];
} *CLEAN_STRING;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment