1 /*
2 type characteristic =
3     | IMAGE_FILE_RELOCS_STRIPPED
4     | IMAGE_FILE_EXECUTABLE_IMAGE
5     | IMAGE_FILE_LINE_NUMS_STRIPPED
6     | IMAGE_FILE_LOCAL_SYMS_STRIPPED
7     | IMAGE_FILE_AGGRESSIVE_WS_TRIM
8     | IMAGE_FILE_LARGE_ADDRESS_AWARE
9     | RESERVED
10     | IMAGE_FILE_BYTES_REVERSED_LO
11     | IMAGE_FILE_32BIT_MACHINE
12     | IMAGE_FILE_DEBUG_STRIPPED
13     | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
14     | IMAGE_FILE_NET_RUN_FROM_SWAP
15     | IMAGE_FILE_SYSTEM
16     | IMAGE_FILE_DLL
17     | IMAGE_FILE_UP_SYSTEM_ONLY
18     | IMAGE_FILE_BYTES_REVERSED_HI
19     | UNKNOWN of int
20 
21 let get_characteristic =
22   function
23   | 0x0001 -> IMAGE_FILE_RELOCS_STRIPPED
24   | 0x0002 -> IMAGE_FILE_EXECUTABLE_IMAGE
25   | 0x0004 -> IMAGE_FILE_LINE_NUMS_STRIPPED
26   | 0x0008 -> IMAGE_FILE_LOCAL_SYMS_STRIPPED
27   | 0x0010 -> IMAGE_FILE_AGGRESSIVE_WS_TRIM
28   | 0x0020 -> IMAGE_FILE_LARGE_ADDRESS_AWARE
29   | 0x0040 -> RESERVED
30   | 0x0080 -> IMAGE_FILE_BYTES_REVERSED_LO
31   | 0x0100 -> IMAGE_FILE_32BIT_MACHINE
32   | 0x0200 -> IMAGE_FILE_DEBUG_STRIPPED
33   | 0x0400 -> IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
34   | 0x0800 -> IMAGE_FILE_NET_RUN_FROM_SWAP
35   | 0x1000 -> IMAGE_FILE_SYSTEM
36   | 0x2000 -> IMAGE_FILE_DLL
37   | 0x4000 -> IMAGE_FILE_UP_SYSTEM_ONLY
38   | 0x8000 -> IMAGE_FILE_BYTES_REVERSED_HI
39   | x -> UNKNOWN x
40 
41 let characteristic_to_string =
42   function
43   | IMAGE_FILE_RELOCS_STRIPPED -> "IMAGE_FILE_RELOCS_STRIPPED"
44   | IMAGE_FILE_EXECUTABLE_IMAGE -> "IMAGE_FILE_EXECUTABLE_IMAGE"
45   | IMAGE_FILE_LINE_NUMS_STRIPPED -> "IMAGE_FILE_LINE_NUMS_STRIPPED"
46   | IMAGE_FILE_LOCAL_SYMS_STRIPPED -> "IMAGE_FILE_LOCAL_SYMS_STRIPPED"
47   | IMAGE_FILE_AGGRESSIVE_WS_TRIM -> "IMAGE_FILE_AGGRESSIVE_WS_TRIM"
48   | IMAGE_FILE_LARGE_ADDRESS_AWARE -> "IMAGE_FILE_LARGE_ADDRESS_AWARE"
49   | RESERVED -> "RESERVED"
50   | IMAGE_FILE_BYTES_REVERSED_LO -> "IMAGE_FILE_BYTES_REVERSED_LO"
51   | IMAGE_FILE_32BIT_MACHINE -> "IMAGE_FILE_32BIT_MACHINE"
52   | IMAGE_FILE_DEBUG_STRIPPED -> "IMAGE_FILE_DEBUG_STRIPPED"
53   | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP -> "IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP"
54   | IMAGE_FILE_NET_RUN_FROM_SWAP -> "IMAGE_FILE_NET_RUN_FROM_SWAP"
55   | IMAGE_FILE_SYSTEM -> "IMAGE_FILE_SYSTEM"
56   | IMAGE_FILE_DLL -> "IMAGE_FILE_DLL"
57   | IMAGE_FILE_UP_SYSTEM_ONLY -> "IMAGE_FILE_UP_SYSTEM_ONLY"
58   | IMAGE_FILE_BYTES_REVERSED_HI -> "IMAGE_FILE_BYTES_REVERSED_HI"
59   | UNKNOWN x -> Printf.sprintf "UNKNOWN_CHARACTERISTIC 0x%x" x
60 
61 let is_dll characteristics =
62   let characteristic = characteristic_to_int IMAGE_FILE_DLL in
63   characteristics land characteristic = characteristic
64 
65 let has characteristic characteristics =
66   let characteristic = characteristic_to_int characteristic in
67   characteristics land characteristic = characteristic
68 
69 (* TODO: this is a mad hack *)
70 let show_type characteristics =
71   if (has IMAGE_FILE_DLL characteristics) then "DLL"
72   else if (has IMAGE_FILE_EXECUTABLE_IMAGE characteristics) then "EXE"
73   else "MANY"                   (* print all *)
74  */
75 
76 pub const IMAGE_FILE_RELOCS_STRIPPED: u16 = 0x0001;
77 pub const IMAGE_FILE_EXECUTABLE_IMAGE: u16 = 0x0002;
78 pub const IMAGE_FILE_LINE_NUMS_STRIPPED: u16 = 0x0004;
79 pub const IMAGE_FILE_LOCAL_SYMS_STRIPPED: u16 = 0x0008;
80 pub const IMAGE_FILE_AGGRESSIVE_WS_TRIM: u16 = 0x0010;
81 pub const IMAGE_FILE_LARGE_ADDRESS_AWARE: u16 = 0x0020;
82 pub const RESERVED: u16 = 0x0040;
83 pub const IMAGE_FILE_BYTES_REVERSED_LO: u16 = 0x0080;
84 pub const IMAGE_FILE_32BIT_MACHINE: u16 = 0x0100;
85 pub const IMAGE_FILE_DEBUG_STRIPPED: u16 = 0x0200;
86 pub const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP: u16 = 0x0400;
87 pub const IMAGE_FILE_NET_RUN_FROM_SWAP: u16 = 0x0800;
88 pub const IMAGE_FILE_SYSTEM: u16 = 0x1000;
89 pub const IMAGE_FILE_DLL: u16 = 0x2000;
90 pub const IMAGE_FILE_UP_SYSTEM_ONLY: u16 = 0x4000;
91 pub const IMAGE_FILE_BYTES_REVERSED_HI: u16 = 0x8000;
92 
is_dll(characteristics: u16) -> bool93 pub fn is_dll(characteristics: u16) -> bool {
94     characteristics & IMAGE_FILE_DLL == IMAGE_FILE_DLL
95 }
96 
is_exe(characteristics: u16) -> bool97 pub fn is_exe(characteristics: u16) -> bool {
98     characteristics & IMAGE_FILE_EXECUTABLE_IMAGE == IMAGE_FILE_EXECUTABLE_IMAGE
99 }
100