#!/usr/bin/perl -w
use strict;
use vars qw/ $EXE_FILE
   $re_Xsnip              $re_Xbin                $re_Xany
   $re_CompanyName        $re_FileDescription     $re_FileVersion
   $re_InternalName       $re_LegalCopyright      $re_LegalTrademarks
   $re_OriginalFilename   $re_ProductName         $re_ProductVersion
   $re_Comments           $re_License             $re_SpecialBuild
   $re_PrivateBuild       $re_OLESelfRegister     $re_BuildDate
   $re_BuildVersion       $re_APIVersion          $re_WWW
   $re_RegistryKey        $re_SMemoryVersion
/;

# reads a Windows 32 bit executable and returns the embeded meta data for the
# file, such as CompanyName, Version, etc.  Specify the executable file or dll
# you want read by typing in its system path and file name as the value for
# the $EXE_FILE variable immediately below.
$EXE_FILE = 'wubble/wibble/noot.exe';

&read_exe($EXE_FILE);

sub read_exe {

   my ($s) = shift(@_);

   die(qq[No filename provided!  usage: &read_exe([filename]]) unless $s;

   die(qq[File "$s" is not a windows 32 bit executable!]) unless -B $s;

   local(*EXE); open(EXE, $s) or die(qq[Couldn't open "$s" $!]);

   $s =~ s/$re_Xbin+//g; $s =~ s/$re_Xsnip/${\$1}_=NULL_/;

   my ($cpy) = $s;

   my(
     $CompanyName,        $FileDescription,    $FileVersion,
     $InternalName,       $LegalCopyright,     $LegalTrademarks,
     $OriginalFilename,   $ProductName,        $ProductVersion,
     $Comments,           $License,            $SpecialBuild,
     $PrivateBuild,       $OLESelfRegister,    $BuildDate,
     $BuildVersion,       $APIVersion,         $WWW,
     $RegistryKey,        $SMemoryVersion
   );

              $s =~ s/$re_CompanyName(.*?)$re_Xany/$CompanyName=$1/e;
   $s = $cpy; $s =~ s/$re_FileDescription(.*?)$re_Xany/$FileDescription=$1/e;
   $s = $cpy; $s =~ s/$re_FileVersion(.*?)$re_Xany/$FileVersion=$1/e;
   $s = $cpy; $s =~ s/$re_InternalName(.*?)$re_Xany/$InternalName=$1/e;
   $s = $cpy; $s =~ s/$re_LegalCopyright(.*?)$re_Xany/$LegalCopyright=$1/e;
   $s = $cpy; $s =~ s/$re_LegalTrademarks(.*?)$re_Xany/$LegalTrademarks=$1/e;
   $s = $cpy; $s =~ s/$re_OriginalFilename(.*?)$re_Xany/$OriginalFilename=$1/e;
   $s = $cpy; $s =~ s/$re_ProductName(.*?)$re_Xany/$ProductName=$1/e;
   $s = $cpy; $s =~ s/$re_ProductVersion(.*?)$re_Xany/$ProductVersion=$1/e;
   $s = $cpy; $s =~ s/$re_Comments(.*?)$re_Xany/$Comments=$1/e;
   $s = $cpy; $s =~ s/$re_License(.*?)$re_Xany/$License=$1/e;
   $s = $cpy; $s =~ s/$re_SpecialBuild(.*?)$re_Xany/$SpecialBuild=$1/e;
   $s = $cpy; $s =~ s/$re_PrivateBuild(.*?)$re_Xany/$PrivateBuild=$1/e;
   $s = $cpy; $s =~ s/$re_OLESelfRegister(.*?)$re_Xany/$OLESelfRegister=$1/e;
   $s = $cpy; $s =~ s/$re_BuildDate(.*?)$re_Xany/$BuildDate=$1/e;
   $s = $cpy; $s =~ s/$re_BuildVersion(.*?)$re_Xany/$BuildVersion=$1/e;
   $s = $cpy; $s =~ s/$re_APIVersion(.*?)$re_Xany/$APIVersion=$1/e;
   $s = $cpy; $s =~ s/$re_WWW(.*?)$re_Xany/$WWW=$1/e;
   $s = $cpy; $s =~ s/$re_RegistryKey(.*?)$re_Xany/$RegistryKey=$1/e;
   $s = $cpy; $s =~ s/$re_SMemoryVersion(.*?)$re_Xany/$SMemoryVersion=$1/e;
   $s = $cpy;

   $CompanyName         = '' unless defined $CompanyName;
   $FileDescription     = '' unless defined $FileDescription;
   $FileVersion         = '' unless defined $FileVersion;
   $InternalName        = '' unless defined $InternalName;
   $LegalCopyright      = '' unless defined $LegalCopyright;
   $LegalTrademarks     = '' unless defined $LegalTrademarks;
   $OriginalFilename    = '' unless defined $OriginalFilename;
   $ProductName         = '' unless defined $ProductName;
   $ProductVersion      = '' unless defined $ProductVersion;
   $Comments            = '' unless defined $Comments;
   $License             = '' unless defined $License;
   $SpecialBuild        = '' unless defined $SpecialBuild;
   $PrivateBuild        = '' unless defined $PrivateBuild;
   $OLESelfRegister     = '' unless defined $OLESelfRegister;
   $BuildDate           = '' unless defined $BuildDate;
   $BuildVersion        = '' unless defined $BuildVersion;
   $APIVersion          = '' unless defined $APIVersion;
   $WWW                 = '' unless defined $WWW;
   $RegistryKey         = '' unless defined $RegistryKey;
   $SMemoryVersion      = '' unless defined $SMemoryVersion;

   $CompanyName         = substr($CompanyName,0,-1);
   $ProductVersion      = substr($ProductVersion,0,-1);
   $LegalTrademarks     = substr($LegalTrademarks,0,-1);
   $FileDescription     = substr($FileDescription,0,-1);
   $LegalCopyright      = substr($LegalCopyright,0,-1);
   $SpecialBuild        = substr($SpecialBuild,0,-1);
   $ProductName         = substr($ProductName,0,-1);
   $InternalName        = substr($InternalName,0,-1);
   $BuildDate           = substr($BuildDate,0,-1);
   $OriginalFilename    = substr($OriginalFilename,0,-1);

   print <<__EXE__

+===============================================================================
| 32 Bit executable    |  $s                                                    
+----------------------+--------------------------------------------------------
| CompanyName          |  $CompanyName                                          
+----------------------+--------------------------------------------------------
| FileDescription      |  $FileDescription                                      
+----------------------+--------------------------------------------------------
| FileVersion          |  $FileVersion                                          
+----------------------+--------------------------------------------------------
| InternalName         |  $InternalName                                         
+----------------------+--------------------------------------------------------
| LegalCopyright       |  $LegalCopyright                                       
+----------------------+--------------------------------------------------------
| LegalTrademarks      |  $LegalTrademarks                                      
+----------------------+--------------------------------------------------------
| OriginalFilename     |  $OriginalFilename                                     
+----------------------+--------------------------------------------------------
| ProductName          |  $ProductName                                          
+----------------------+--------------------------------------------------------
| ProductVersion       |  $ProductVersion                                       
+----------------------+--------------------------------------------------------
| Comments             |  $Comments                                             
+----------------------+--------------------------------------------------------
| License              |  $License                                              
+----------------------+--------------------------------------------------------
| SpecialBuild         |  $SpecialBuild                                         
+----------------------+--------------------------------------------------------
| PrivateBuild         |  $PrivateBuild                                         
+----------------------+--------------------------------------------------------
| OLESelfRegister      |  $OLESelfRegister                                      
+----------------------+--------------------------------------------------------
| BuildDate            |  $BuildDate                                            
+----------------------+--------------------------------------------------------
| BuildVersion         |  $BuildVersion                                         
+----------------------+--------------------------------------------------------
| APIVersion           |  $APIVersion                                           
+----------------------+--------------------------------------------------------
| WWW                  |  $WWW                                                  
+----------------------+--------------------------------------------------------
| RegistryKey          |  $RegistryKey                                          
+----------------------+--------------------------------------------------------
| SharedMemoryVersion  |  $SMemoryVersion                                       
+----------------------+--------------------------------------------------------


__EXE__
} BEGIN {

   ++$|;

   $re_CompanyName         = qr/CompanyName/;
   $re_FileDescription     = qr/FileDescription/;
   $re_FileVersion         = qr/FileVersion/;
   $re_InternalName        = qr/InternalName/;
   $re_LegalCopyright      = qr/LegalCopyright/;
   $re_LegalTrademarks     = qr/LegalTrademarks/;
   $re_OriginalFilename    = qr/OriginalFilename/;
   $re_ProductName         = qr/ProductName/;
   $re_ProductVersion      = qr/ProductVersion/;
   $re_Comments            = qr/Comments/;
   $re_License             = qr/License/;
   $re_SpecialBuild        = qr/SpecialBuild/;
   $re_PrivateBuild        = qr/PrivateBuild/;
   $re_OLESelfRegister     = qr/OLESelfRegister/;
   $re_BuildDate           = qr/BuildDate/;
   $re_BuildVersion        = qr/BuildVersion/;
   $re_APIVersion          = qr/APIVersion/;
   $re_WWW                 = qr/WWW/;
   $re_RegistryKey         = qr/RegistryKey/;
   $re_SMemoryVersion      = qr/SharedMemoryVersion/;

   $re_Xsnip = qr/
   ^.*
      S.{0,1}
      t.{0,1}
      r.{0,1}
      i.{0,1}
      n.{0,1}
      g.{0,1}
      F.{0,1}
      i.{0,1}
      l.{0,1}
      e.{0,1}
      I.{0,1}
      n.{0,1}
      f.{0,1}
      o
      (.*?)
      V.{0,1}
      a.{0,1}
      r.{0,1}
      F.{0,1}
      i.{0,1}
      l.{0,1}
      e.{0,1}
      I.{0,1}
      n.{0,1}
      f.{0,1}
      o
   .*/x;

   $re_Xbin = qr
   /[
      \000\001\002\003\004
      \005\006\007\010\013
      \014\016\017\020\021
      \022\023\024\025\026
      \027\030\031\032\033
      \034\035\036\037
   ]/x;

   $re_Xany = qr
   /
      CompanyName    | FileDescription | FileVersion       | InternalName |
      LegalCopyright | LegalTrademarks | OriginalFilename  | ProductName  |
      ProductVersion | Comments        | License           | SpecialBuild |
      PrivateBuild   | OLESelfRegister | BuildDate         | BuildVersion |
      APIVersion     | WWW             | RegistryKey       | SharedMemoryVersion
      |_=NULL_
   /x;
}