соотв-но пришлось озаботиться и смастерить на perl парзер файла заголовков ntstatus.h от wdk и конвертор в idc
Исходный код под катом
#!/usr/bin/perl # Lame script for NTSTATUS to idc converting # 15 Feb 2011 (C) RedPlait use strict; use warnings; sub parse { my($fname, $href) = @_; my($str, $fh, $name, $value, $res); $res = 0; open($fh, '<', $fname) or die("Cannot open $fname, error $!\n"); while( $str = <$fh> ) { chomp $str; next if ( $str =~ /^\s*\/\// ); next if ( $str !~ /^\s*#\s*define\s+(\w+).*\(NTSTATUS\)(\w+)\)/ ); $name = $1; $value = $2; # check if name contains STATUS next if ( $name !~ /status/i ); $value =~ s/l//ig; if ( $value =~ /^0x(.*)$/i ) { $value = hex($1); } else { $value = int($value); } next if ( exists $href->{$value} ); $href->{$value} = $name; $res++; } close $fh; return $res; } sub dump_idc { my $href = shift; print<<EOF1; #include <idc.idc> static Enums(void) { auto id,cid; id = AddEnum( 0, "NTSTATUS", 0x1100000 ); if ( id == -1 ) { id = GetEnum("NTSTATUS"); } if ( id != -1 ) { EOF1 my $iter; foreach $iter ( sort { $a <=> $b } keys %$href ) { printf(" AddConstEx( id, \"%s\", 0x%X, -1);\n",
$href->{$iter}, $iter); } print<<EOF2; } } static main(void) { Enums();
} EOF2 } # main my %hdb; parse($_, \%hdb) foreach @ARGV; dump_idc(\%hdb);
Комментариев нет:
Отправить комментарий