showing executable console

Did you ever try to write to the standard output using STDOUT but never seen your output in the console?

This is a little known thing about PE executable on windows that were compiled to be GUI.

The PE header contains information that indicate a mode of execution: console or GUI.

So even if your favorite compiler such as PowerBuilder (classic or .Net) doesn’t support the console application, you can turn it on just by switching 1 byte.

Here is a Perl 5.8+ script that can switch between console/GUI one or more file, (useful in a post-build process when available).

Enable console Perl script Script enable_console.pl

#!/usr/bin/perl
use strict;
$|=1;
sub patch{
  my $filename = shift;
  my $mode = shift;
  print "file $filename ";
  open my $FH, '+<', $filename or die "Unable to open file $filename!$/$!$/";
  binmode $FH;
  my ($buffer, $offset);
  read $FH, $buffer, 0x40 or die "Unable to read file $filename $/$!$/";
  die "Not a DOS executable!$/" if substr($buffer,0,2) ne 'MZ' ;
  $offset = unpack( 'L', substr($buffer,0x03C,4) ) or die "Invalid PE address!";
  seek ($FH,  $offset,  0) or die "Unable to move at byte $offset in file $filename $!$/";
  read $FH, $buffer, 0x2 or die "Unable to read file $filename $/$!$/";
  die "Invalid PE format!$/" if substr($buffer,0,2) ne 'PE' ;
  $offset += 0x5C;
  seek ($FH,  $offset,  0) or die "Unable to move at byte $offset in file $filename $!$/";
  print $FH pack('c', $mode);
  close $FH;
  print " => OK.$/";
}
print <<USAGE unless @ARGV;
Usage: 
  $0 [-mode=gui|console] file1 file2 file3...
  The default mode is set to console
  
USAGE
my $mode = 0x03;
foreach(@ARGV){
  if(/^-mode\s*=\s*([A-Za-z]+)/){
    die "Unknow mode $1!$/" if $1 ne 'gui' && $1 ne 'console';
    print "set mode to $1$/";
    $mode = 0x02 if $1 eq 'gui';
    next;
  }  
  foreach my $f ( glob $_ ){
    patch $f, $mode;
  }  
}

Turn to console all executable of the current folder:

perl enable_console.pl "*.exe"

Turn to GUI an executable:

perl enable_console.pl --mode=gui "..\build\my_app.exe"

You can try to switch IDE so it will display it console (helpfull to debug without compiling):

perl enable_console.pl "C:\Program Files\Sybase\PowerBuilder 10.5\PB105.EXE"

BE CAREFUL: if you close the console, it will kill your application too with no way to cancel or save your pending data!

MIT LICENSE: you have a brain, take your responsibility, and do backup yourself!

If you wonder how your Powerbuilder application can write to console: