Here is a perl script to parse your driver inf files :
#/usr/bin/perl
use Data::Dumper;
use File::Find;
use CGI qw(:standard);
my $q = new CGI();
$| = 1;
my $ROOT = 'C:/dev/infs';
my $DEBUG = $q->param('debug');
#
# Find all .INF within $ROOT subdir
#
my @FILES = ();
sub wanted { push @FILES ,$File::Find::name if $File::Find::name =~ /\.inf$/i; }
if ($q->param('subdir') eq 'no') { @FILES = glob("$ROOT/*.inf"); }
else { find(\&wanted, $ROOT);}
my %INI = ();
my $regex = qr/^\[([^\]]+)]+\s*?\n # [Section Header]
(.*?)\n # Section body
(?=^\[|\Z) # [Next Section Header or EOF]
/xsm; # multiline support
my $regex2 = qr/^([^=]+)=([^\n]+)\n/xsm; # key=value
foreach my $i (@FILES) {
printf "\nParsing $i...\n" ; #if $DEBUG;
local $/ = undef; # \n treated as normal char
open (FOO, "<$i") || die $!;
$_ = <FOO>;
close(FOO);
%INI=();
$INI{"\U$1\E"}{tmp} = $2 while /$regex/g;
foreach my $key (sort keys %INI) {
print "KEY = [$key] :\n" if $DEBUG;
#1 while $INI{$key}{tmp} =~ s/\"//g; # wipe out quotes
1 while $INI{$key}{tmp} =~ s/\;.*//g; # wipe out comments
1 while $INI{$key}{tmp} =~ s/^\n$//gxsm; # wipe out empty lines
%temp = ();
$temp{$key}{$1} = $2 while $INI{$key}{tmp} =~ /$regex2/g;
while(my($k, $v) = each %{$temp{$key}}) {
$k =~ s/^\s+//; $k =~ s/\s+$//;
$v =~ s/^\s+//; $v =~ s/\s+$//;
$INI{$key}{$k} = $v;
print " $k => $v\n" if $DEBUG == 2;
}
delete $INI{$key}{tmp};
}
#[Version]
#Provider=%CANON% --+
#[Strings] |--> Provider = "Canon" (=Manufacturer)
#CANON="Canon" <--+
#[Manufacturer]
# "Canon" = Canon,NTx86.5.1 => change to Canon.NTx86.5.1 for [Canon.NTx86.5.1]
#[Canon.NTx86.5.1]
#"Canon S9000" = CNMS9000XP, LPTENUM\CanonS9000EEDB, Canon_S9000
map { $INI{MANUFACTURER}{$_} =~ s/,/\./ } keys %{$INI{MANUFACTURER}};
$provider="";
if ($INI{VERSION}{Provider} =~ /%(\S+)%/) { # $1 = CANON
if (exists $INI{STRINGS}{$1} ) { # => "Canon"
$provider = $INI{STRINGS}{$1};
print "Strings [$1] = $provider\n" if $DEBUG;
}
elsif (exists $INI{MANUFACTURER}{$1}) {
$provider = $INI{MANUFACTURER}{$1};
}
}
else { $provider = $INI{VERSION}{Provider}; }
print "PROVIDER : $INI{VERSION}{Provider} => $provider\n" if $DEBUG;
($manufacturer) = values %{$INI{MANUFACTURER}}; # Canon.NTx86.5.1 => CANON.NTX86.5.1
print "MANUFACTURER : $manufacturer\n" if $DEBUG;
print "CLASS : $INI{VERSION}{Class}\n" if $DEBUG;
if (exists $INI{ uc $manufacturer }) {
print "DEVICES : ", Dumper \%{$INI{ uc $manufacturer }} if $DEBUG;
map { $dev = (( /^%(.*)%$/ ) ? $INI{STRINGS}{$1} : $_) ; # %MN130.DeviceDesc% => "Microsoft(R) PCI Adapter MN-130"
printf "%10s\t%10s\t%15s\t%20s\t%20s\n",
$provider,
$INI{VERSION}{Class},
$INI{VERSION}{CatalogFile},
$INI{VERSION}{DriverVer},
$dev;
} sort keys %{$INI{ uc $manufacturer }};
}
}
1/ Install ActivePerl : http://www.activestate.com/Products/ActivePerl/
2/ Run it (ouputs html) :
perl parse_ini.pl infroot=c:\my_inf_files > index.html
3/ it's "out of the box", so not perfect.