diff options
Diffstat (limited to 'win32/bin')
-rw-r--r-- | win32/bin/exetype.pl | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/win32/bin/exetype.pl b/win32/bin/exetype.pl new file mode 100644 index 0000000000..5846b3ee3b --- /dev/null +++ b/win32/bin/exetype.pl @@ -0,0 +1,61 @@ +#!perl -w +use strict; +unless (@ARGV == 2) { + print "Usage: $0 exefile [CONSOLE|WINDOWS]\n"; + exit; +} +unless ($ARGV[1] =~ /^(console|windows)$/i) { + print "Invalid subsystem $ARGV[1], please use CONSOLE or WINDOWS\n"; + exit; +} +my ($record,$magic,$offset,$size); +open EXE, "+< $ARGV[0]" or die "Cannot open $ARGV[0]: $!"; +binmode EXE; +read EXE, $record, 32*4; +($magic,$offset) = unpack "Sx58L", $record; +die "Not an MSDOS executable file" unless $magic == 0x5a4d; +seek EXE, $offset, 0; +read EXE, $record, 24; +($magic,$size) = unpack "Lx16S", $record; +die "PE header not found" unless $magic == 0x4550; +die "Optional header not in NT32 format" unless $size == 224; +seek EXE, $offset+24+68, 0; +print EXE pack "S", uc($ARGV[1]) eq 'CONSOLE' ? 3 : 2; +close EXE; +__END__ + +=head1 NAME + +exetype - Change executable subsystem type between "Console" and "Windows" + +=head1 SYNOPSIS + + C:\perl\bin> copy perl.exe guiperl.exe + C:\perl\bin> exetype guiperl.exe windows + +=head1 DESCRIPTION + +This program edits an executable file to indicate which subsystem the +operating system must invoke for execution. + +You can specify any of the following subsystems: + +=over + +=item CONSOLE + +The CONSOLE subsystem handles a Win32 character-mode application that +use a console supplied by the operating system. + +=item WINDOWS + +The WINDOWS subsystem handles an application that does not require a +console and creates its own windows, if required. + +=back + +=head1 AUTHOR + +Jan Dubois <jand@activestate.com> + +=cut |