#!perl -w use strict; # pregutl hklm\drivers\builtin hklm\services | perl devoverview.pl # will present a summary of devices found on your wince device. # $|=1; my $curkey; my @drv; while (<>) { s/\s+$//; next if length($_)==0; if (/\[(?:HKLM|HKEY_LOCAL_MACHINE)\\(drivers\\builtin|services)\\([^\\]+)\]/i) { my ($type, $name)=($1,$2); $type = ($type =~ /services/i) ? "svc" : "drv"; $curkey= { type=>$type, name=>$name }; push @drv, $curkey; } elsif (/^\s*"?([^="]+)"?=(.*)/) { my ($name,$val)=($1,$2); if ($val=~/^dword:(\w+)/) { $val= hex($1); } elsif ($val=~/^\"(.*)\"/) { $val=$1; } elsif ($val=~/^hex:(\w\w),(\w\w),(\w\w),(\w\w)$/) { $val=hex("$4$3$2$1"); } $curkey->{lc($name)}= $val; } else { printf("unknown: %s\n", $_); } } my %fmt= ( type=>["%-3s","%-3s"], name=>["%-20s","%-20s"], dll=>["%-30s","%-30s"], keep=>["%d","%s"], flags=>["%08x","%8s"], priority256=>["%02x","%2s"], order=>["%02x","%2s"], prefix=>["%4s","%4s"], index=>["%d","%s"], friendlyname=>["%s","%s"], ); sub cmporder { my ($a,$b)=@_; $a=exists $a->{order} ? $a->{order} : 0; $b=exists $b->{order} ? $b->{order} : 0; return $a <=> $b; } my @fields= qw(type name dll keep flags priority256 order prefix index friendlyname); printf("%s\n",join(" ", map { sprintf($fmt{$_}[1], $_) } @fields)); for my $key (sort { $a->{type} cmp $b->{type} || cmporder($a,$b) } @drv) { printf("%s\n", join(" ",map { exists $key->{$_}?sprintf($fmt{$_}[0], $key->{$_}):sprintf($fmt{$_}[1], "-") } @fields)); }