|
|
1.1 ! root 1: #!/usr/bin/perl -w ! 2: # ! 3: # Program to reverse the device identifier IDs in the PCIR and PnP ! 4: # structures in a ROM for old non-compliant BIOSes ! 5: # ! 6: # GPL, Ken Yap 2001 ! 7: # ! 8: ! 9: use bytes; ! 10: ! 11: use IO::Seekable; ! 12: ! 13: sub swaplocs ($$$) ! 14: { ! 15: my ($dataref, $loc1, $loc2) = @_; ! 16: my ($t); ! 17: ! 18: $t = substr($$dataref, $loc1, 1); ! 19: substr($$dataref, $loc1, 1) = substr($$dataref, $loc2, 1); ! 20: substr($$dataref, $loc2, 1) = $t; ! 21: } ! 22: ! 23: sub printdevids ($$) ! 24: { ! 25: my ($dataref, $loc) = @_; ! 26: ! 27: return (sprintf "%02x %02x %02x", unpack('C3', substr($$dataref, $loc, 3))); ! 28: } ! 29: ! 30: $#ARGV >= 0 or die "Usage: $0 romimage\n"; ! 31: $file = $ARGV[0]; ! 32: open(F, "+<$file") or die "$file: $!\n"; ! 33: binmode(F); ! 34: # Handle up to 64kB ROM images ! 35: $len = read(F, $data, 64*1024); ! 36: defined($len) or die "$file: $!\n"; ! 37: substr($data, 0, 2) eq "\x55\xAA" or die "$file: Not a boot ROM image\n"; ! 38: ($pci, $pnp) = unpack('v2', substr($data, 0x18, 4)); ! 39: ($pci < $len and $pnp < $len) or die "$file: Not a PCI PnP ROM image\n"; ! 40: (substr($data, $pci, 4) eq 'PCIR' and substr($data, $pnp, 4) eq '$PnP') ! 41: or die "$file: No PCI and PNP structures, not a PCI PNP ROM image\n"; ! 42: &swaplocs(\$data, $pci+13, $pci+15); ! 43: &swaplocs(\$data, $pnp+18, $pnp+20); ! 44: seek(F, 0, SEEK_SET) or die "$file: Cannot seek to beginning\n"; ! 45: print F $data; ! 46: close(F); ! 47: print "PCI devids now: ", &printdevids(\$data, $pci+13), "\n"; ! 48: print "PnP devids now: ", &printdevids(\$data, $pnp+18), "\n"; ! 49: exit(0);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.