Win32::PEFile - Portable Executable File parser


    use Win32::PEFile;

    my $pe = Win32::PEFile->new (-file => 'someFile.exe');

    print "someFile.exe has a entry point for EntryPoint1"
        if $pe->getEntryPoint ("EntryPoint1");

    my $strings = $pe->getVersionStrings ();
    print "someFile.exe version $strings->{'ProductVersion'}\n";


Win32::PEFile provides the following public methods.

new (%parameters)

Parses a PE file and returns an object used to access the results. The following parameters may be passed:

-file: file name, required

The file name (and path if required) of the PE file to process.


Return the list of named sections present in the PEFile.


Set the MS-DOS stub code. $stub contains the code as a raw binary blob.


Return a string containing MS-DOS stub code as a raw binary blob.

Section methods

The helper module Win32::PEFile::SectionHandlers provides handlers for various sections. At present only a few of the standard sections are handled and documented here. If there are sections that you would like to be able to manipulate that are not currently handled enter a ticket using CPAN's request tracker (see below).


Resource section. At present only access to the version resource is provided, although the other resources are parsed internally.

getVersionStrings ($language)

Returns a hash reference containing the strings in the version resource keyed by string name.

getVersionCount ($language)

Returns a count of version resources.

$language: optional

Selected language specified as a MicroSoft LangID. If the language is not specified all language variants are counted.

getFixedVersionValues ($language)

Returns a hash reference containing the fixed version resource values keyed by value name.

getResourceData ($type, $name, $language)

Returns a string containg the raw data for the specified resource or undef if the resource doesn't exist.

$language: optional

Preferred language for the strings specified as a MicroSoft LangID. US English is preferred by default.

If the preferred language is not available one of the available languages will be used instead.


Exports section.

getExportNames ()

Returns a list of all the named entry points.

getExportOrdinalsCount ()

Returns the count of all the ordinal entry points.

haveExportEntry ($entryPointName)

Returns true if the given entry point exists in the exports table. For compatibility with previous versions of the module getEntryPoint ($entryPointName) is provided as an alias for haveExportEntry ($entryPointName).

$entryPointName: required

Name of the entry point to search for in the Exports table of the PE file.


getImportNames ()

Returns a hash keyed by .DLL name of lists of all the named entry points.

getImportNamesArray ()

Returns the list of .DLL names in table entry order.

haveImportEntry ($entryPath)

Returns true if the given entry point exists in the imports table.

$entryPath: required

Path to the entry point to search for in the Imorts table of the PE file. The path is in the form 'dll name/entry name'. For example:

    my $havePrintf = $pe->haveImportEntry('MSVCR80.dll/printf');

would set $havePrintf true if the PE file has an import entry for the MicroSoft C standard library version of printf.


Please report any bugs or feature requests to bug-Win32-PEFile at, or through the web interface at I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.


This module is supported by the author through CPAN. The following links may be of assistance:


Win32::Exe and Win32::PEFile

Win32::PEFile overlaps in functionality with Win32::Exe. Win32::Exe is a much more mature module and is more comprehensive. The only current (small) disadvantages of Win32::Exe are that it is not pure Perl and that has a larger dependency tree than Win32::PEFile.

For some applications a larger problem with Win32::Exe is that some file editing operations are not portable across systems.

The intent is that Win32::PEFile will remain pure Perl and low dependency. Over time PEFile will acquire various editing functions and will remain both cross- platform and endien agnostic.


Thank you Engin Bulanik for contributing the seed code for getVersionCount().


    Peter Jaquiery


This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the LICENSE file included with this module.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 157:

'=item' outside of any '=over'