resistance has asked for the wisdom of the Perl Monks concerning the following question:

Hi

Is it possible to get VersionInfo from windows executable without using of WinAPI?

I found this module: Win32-File-VersionInfo but it runs only on Windows.

May be such code for linux was already written?

Replies are listed 'Best First'.
Re: Get EXE VersionInfo
by Corion (Patriarch) on Jun 28, 2008 at 20:28 UTC

    Maybe Win32::Exe contains enough information for you to enhance it to also extract the version information from it. If all else fails, you can always look at what WINE does and make an XS module out of that.

Re: Get EXE VersionInfo
by BrowserUk (Patriarch) on Jun 29, 2008 at 01:37 UTC

    If the intent is to extract the version information embedded in windows executables, whilst running under Linux, then it is a fairly trivial process to open the file, locate the appropriate offset and then read and interpret the relevant 32-bit integer.

    The full MS specification for the PE & COFF file formats is downloadable, though enough information to locate and interpret the various version fields is freely obtainable many places on-line. For example: here.

    To get you started here is a crude script I knocked up a couple of years ago to extract the timestamp field:

    #! perl -slw use strict; open EXE, '<:raw', $ARGV[0] or die "$ARGV[0] : $!"; my $dos = do{ local $/ = \65536; <EXE> }; die "$ARGV[0] is not a .exe or .dll (sig='${ \substr $dos, 0, 2 }')" unless substr( $dos, 0, 2 ) eq 'MZ'; my $coffoff = 8+ unpack 'x60 V', $dos; read( EXE, $dos, $coffoff - 65536 + 4, 65536 ) or die $! if $coffoff > 65536; my $ts = unpack "x$coffoff V", $dos; print "$ARGV[0] : ", defined $ts ? ( scalar( localtime $ts) || "has unfathomable timestamp value $t +s" ) : 'has no timestamp'; __END__ C:\cl>p:exetime.pl atlprov.dll Sat Jan 5 11:46:16 2002 C:\cl>p:exetime.pl cl.exe Sat Jan 5 10:48:19 2002

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Thanks BrowserUK for the example, it works (mostly)!

      Still not completely understand how to locate the appropriate offset. Looking at VersionInfo.xs code and winver.h and still unable to find the offsets.

      Just a question: is it possible to compile Win32::File::VersionInfo module on linux if I have WinVer.h somewhere in path or in the build directory?

      Sure if I write the code myself it were very helpful for understanding of EXE format but it seems to be not so trivial :-(

      regards
      Hi, what this problem? This function (unpack) is native on perl? javaserver:~/teste-rnt # ./exetime.pl T080720081328.exe Global symbol "$t" requires explicit package name at ./exetime.pl line 16. Execution of ./exetime.pl aborted due to compilation errors. javaserver:~/teste-rnt # perl --version This is perl, v5.8.8 built for x86_64-linux-thread-multi thanks

        It would be a lot easier to diagnose if you posted the relevant code.

        The error message means that you've attempted to use a variable $t but haven't declared it: my $t anywhere in your code. My guess is that you've made a change to the code above, and have typed $t instead of $ts somewhere, but that's pure speculation.


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: Get EXE VersionInfo
by igelkott (Priest) on Jun 28, 2008 at 21:50 UTC
    VersionInfo for linux

    If you really are looking for the version info for linux files, you won't find an equivalent module because that sort of information isn't standardized with linux. There may be some subsets but AFAIK it's far from general.

    Many executables respond to a -V or similar option but I've sometimes had to run a strings command. In other words, it's hard to script dependably.

Re: Get EXE VersionInfo
by shmem (Chancellor) on Jun 29, 2008 at 00:09 UTC
    May be such code for linux was already written?

    On linux distributions, you could query the package the executable is part of (rpm -qf $file, dpkg -S $file, ...)

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}