blob: 226302fb2d5bb6123e1fd38a2b180d62a30b28a1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
(* OCaml-Win32
* mkwinapp.ml
* Copyright (c) 2002-2004 by Harry Chomsky
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*)
(*********************************************************************
* This program alters an .exe file to make it use the "windows subsystem"
* instead of the "console subsystem". In other words, when Windows runs
* the program, it will not create a console for it.
*)
(* Pierre Letouzey 23/12/2010 : modification to allow selecting the
subsystem to use instead of just setting the windows subsystem *)
(* This tool can be run directly via :
ocaml unix.cma mkwinapp.ml [-set|-unset] <filename>
*)
exception Invalid_file_format
let input_word ic =
let lo = input_byte ic in
let hi = input_byte ic in
(hi lsl 8) + lo
let find_pe_header ic =
seek_in ic 0x3C;
let peheader = input_word ic in
seek_in ic peheader;
if input_char ic <> 'P' then
raise Invalid_file_format;
if input_char ic <> 'E' then
raise Invalid_file_format;
peheader
let find_optional_header ic =
let peheader = find_pe_header ic in
let coffheader = peheader + 4 in
seek_in ic (coffheader + 16);
let optsize = input_word ic in
if optsize < 96 then
raise Invalid_file_format;
let optheader = coffheader + 20 in
seek_in ic optheader;
let magic = input_word ic in
if magic <> 0x010B && magic <> 0x020B then
raise Invalid_file_format;
optheader
let change flag ic oc =
let optheader = find_optional_header ic in
seek_out oc (optheader + 64);
for i = 1 to 4 do
output_byte oc 0
done;
output_byte oc (if flag then 2 else 3)
let usage () =
print_endline "Alters a Win32 executable file to use the Windows subsystem or not.";
print_endline "Usage: mkwinapp [-set|-unset] <filename>";
print_endline "Giving no option is equivalent to -set";
exit 1
let main () =
let n = Array.length Sys.argv - 1 in
if not (n = 1 || n = 2) then usage ();
let flag =
if n = 1 then true
else if Sys.argv.(1) = "-set" then true
else if Sys.argv.(1) = "-unset" then false
else usage ()
in
let filename = Sys.argv.(n) in
let f = Unix.openfile filename [Unix.O_RDWR] 0 in
let ic = Unix.in_channel_of_descr f and oc = Unix.out_channel_of_descr f in
change flag ic oc
let _ = main ()
|