123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- (*
- * This file is part of ilLib
- * Copyright (c)2004-2013 Haxe Foundation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- *)
- open PeData;;
- open IO;;
- open ExtString;;
- open ExtList;;
- exception Error_message of string
- let error msg = raise (Error_message msg)
- type 'a writer_ctx = {
- out : 'a IO.output;
- }
- let int_of_machine_type t = match t with
- | TUnknown -> 0x0 (* 0 - unmanaged PE files only *)
- | Ti386 -> 0x014c (* 0x014c - i386 *)
- | TR3000 -> 0x0162 (* 0x0162 - R3000 MIPS Little Endian *)
- | TR4000 -> 0x0166 (* 0x0166 - R4000 MIPS Little Endian *)
- | TR10000 -> 0x0168 (* 0x0168 - R10000 MIPS Little Endian *)
- | TWCeMipsV2 -> 0x0169 (* 0x0169 - MIPS Litlte Endian running MS Windows CE 2 *)
- | TAlpha -> 0x0184 (* 0x0184 - Alpha AXP *)
- | TSh3 -> 0x01a2 (* 0x01a2 - SH3 Little Endian *)
- | TSh3Dsp -> 0x01a3 (* 0x01a3 SH3DSP Little Endian *)
- | TSh3e -> 0x01a4 (* 0x01a4 SH3E Little Endian *)
- | TSh4 -> 0x01a6 (* 0x01a6 SH4 Little Endian *)
- | TSh5 -> 0x01a8
- | TArm -> 0x01c0 (* 0x1c0 ARM Little Endian *)
- | TArmN -> 0x01c4 (* 0x1c0 ARM Little Endian *)
- | TArm64 -> 0xaa64 (* 0x1c0 ARM Little Endian *)
- | TEbc -> 0xebc
- | TThumb -> 0x01c2 (* 0x1c2 ARM processor with Thumb decompressor *)
- | TAm33 -> 0x01d3 (* 0x1d3 AM33 processor *)
- | TPowerPC -> 0x01f0 (* 0x01f0 IBM PowerPC Little Endian *)
- | TPowerPCFP -> 0x01f1 (* 0x01f1 IBM PowerPC with FPU *)
- | TItanium64 -> 0x0200 (* 0x0200 Intel IA64 (Itanium( *)
- | TMips16 -> 0x0266 (* 0x0266 MIPS *)
- | TAlpha64 -> 0x0284 (* 0x0284 Alpha AXP64 *)
- | TMipsFpu -> 0x0366 (* 0x0366 MIPS with FPU *)
- | TMipsFpu16 -> 0x0466 (* 0x0466 MIPS16 with FPU *)
- | TTriCore -> 0x0520 (* 0x0520 Infineon *)
- | TAmd64 -> 0x8664 (* 0x8664 AMD x64 and Intel E64T *)
- | TM32R -> 0x9041 (* 0x9041 M32R *)
- let int_of_coff_props props = List.fold_left (fun acc prop ->
- (match prop with
- | RelocsStripped -> 0x1 (* 0x1 *)
- | ExecutableImage -> 0x2 (* 0x2 *)
- | LineNumsStripped -> 0x4 (* 0x4 *)
- | LocalSymsStripped -> 0x8 (* 0x8 *)
- | AgressiveWsTrim -> 0x10 (* 0x10 *)
- | LargeAddressAware -> 0x20 (* 0x20 *)
- | BytesReversedLO -> 0x80 (* 0x80 *)
- | Machine32Bit -> 0x100 (* 0x100 *)
- | DebugStripped -> 0x200 (* 0x200 *)
- | RemovableRunFromSwap -> 0x400 (* 0x400 *)
- | NetRunFromSwap -> 0x800 (* 0x800 *)
- | FileSystem -> 0x1000 (* 0x1000 *)
- | FileDll -> 0x2000 (* 0x2000 *)
- | UpSystemOnly -> 0x4000 (* 0x4000 *)
- | BytesReversedHI -> 0x8000 (* 0x8000 *)
- ) lor acc
- ) 0 props
- let int32_of_section_prop props = List.fold_left (fun acc prop ->
- Int32.logor (match prop with
- | SNoPad -> 0x8l (* 0x8 *)
- | SHasCode -> 0x20l (* 0x20 *)
- | SHasIData -> 0x40l (* 0x40 *)
- | SHasData -> 0x80l (* 0x80 *)
- | SHasLinkInfo -> 0x200l (* 0x200 *)
- | SLinkRemove -> 0x1000l (* 0x1000 *)
- | SGlobalRel -> 0x8000l (* 0x8000 *)
- | SHas16BitMem -> 0x20000l (* 0x20000 *)
- | SAlign1Bytes -> 0x100000l (* 0x100000 *)
- | SAlign2Bytes -> 0x200000l (* 0x200000 *)
- | SAlign4Bytes -> 0x300000l (* 0x300000 *)
- | SAlign8Bytes -> 0x400000l (* 0x400000 *)
- | SAlign16Bytes -> 0x500000l (* 0x500000 *)
- | SAlign32Bytes -> 0x600000l (* 0x600000 *)
- | SAlign64Bytes -> 0x700000l (* 0x700000 *)
- | SAlign128Bytes -> 0x800000l (* 0x800000 *)
- | SAlign256Bytes -> 0x900000l (* 0x900000 *)
- | SAlign512Bytes -> 0xA00000l (* 0xA00000 *)
- | SAlign1024Bytes -> 0xB00000l (* 0xB00000 *)
- | SAlign2048Bytes -> 0xC00000l (* 0xC00000 *)
- | SAlign4096Bytes -> 0xD00000l (* 0xD00000 *)
- | SAlign8192Bytes -> 0xE00000l (* 0xE00000 *)
- | SHasExtRelocs -> 0x1000000l (* 0x1000000 *)
- | SCanDiscard -> 0x02000000l (* 0x02000000 *)
- | SNotCached -> 0x04000000l (* 0x04000000 *)
- | SNotPaged -> 0x08000000l (* 0x08000000 *)
- | SShared -> 0x10000000l (* 0x10000000 *)
- | SExec -> 0x20000000l (* 0x20000000 *)
- | SRead -> 0x40000000l (* 0x40000000 *)
- | SWrite -> 0x80000000l (* 0x80000000 *)
- ) acc
- ) 0l props
- let int_of_pe_magic m = match m with
- | P32 -> 0x10b
- | PRom -> 0x107
- | P64 -> 0x20b
- let int_of_subsystem s = match s with
- | SUnknown -> 0 (* 0 *)
- | SNative -> 1 (* 1 *)
- | SWGui -> 2 (* 2 *)
- | SWCui -> 3 (* 3 *)
- | SPCui -> 7 (* 7 *)
- | SWCeGui -> 9 (* 9 *)
- | SEfi -> 10 (* 10 *)
- | SEfiBoot -> 11 (* 11 *)
- | SEfiRuntime -> 12 (* 12 *)
- | SEfiRom -> 13 (* 13 *)
- | SXbox -> 14 (* 14 *)
- let int_of_dll_props props = List.fold_left (fun acc prop ->
- (match prop with
- | DDynamicBase -> 0x0040 (* 0x0040 *)
- | DForceIntegrity -> 0x0080 (* 0x0080 *)
- | DNxCompat -> 0x0100 (* 0x0100 *)
- | DNoIsolation -> 0x0200 (* 0x0200 *)
- | DNoSeh -> 0x0400 (* 0x0400 *)
- | DNoBind -> 0x0800 (* 0x0800 *)
- | DWdmDriver -> 0x2000 (* 0x2000 *)
- | DTerminalServer -> 0x8000 (* 0x8000 *)
- ) lor acc
- ) 0 props
- let int_of_clr_flags props = List.fold_left (fun acc prop ->
- (match prop with
- | FIlOnly -> 0x1 (* 0x1 *)
- | F32BitRequired -> 0x2 (* 0x2 *)
- | FIlLibrary -> 0x4 (* 0x4 *)
- | FSigned -> 0x8 (* 0x8 *)
- | FNativeEntry -> 0x10 (* 0x10 *)
- | FTrackDebug -> 0x10000 (* 0x10000 *)
- ) lor acc
- ) 0 props
|