#!perl -w use strict; # this script dumps the wince<->gsm IPC buffer from a samsung phone system("pmemdump -p 0 0x4000 dpram.nb"); open DP, "; close DP; sub word { return unpack 'v', substr($dpram,$_[0],2); } printf("head: %04x %04x, tail: %04x, irq:%04x %04x\n", word(0), word(2), word(0x3fec), word(0x3ffc), word(0x3ffe)); if (substr($dpram, 0x3fee, 14) != "\x00" x 14) { printf("3fee: %s\n", unpack 'H*', substr($dpram, 0x3fee, 14)); } dumpcircularbuffer("wr1", word(4), word(6), substr($dpram, 8, 0x3fc)); dumpcircularbuffer("wr2", word(0x404), word(0x406), substr($dpram, 0x408, 0xe90)); dumpcircularbuffer("rd1", word(0x1298), word(0x129a), substr($dpram, 0x129c, 0x3fc)); dumpcircularbuffer("rd2", word(0x1698), word(0x169a), substr($dpram, 0x169c, 0x2950)); sub uniq { my %x; $x{$_}++ for @_; return keys %x; } sub dumpcircularbuffer { my ($name, $p1, $p2, $data)= @_; my @ptrs= sort {$a <=> $b } uniq 0, $p1, $p2, length($data); my @chunks; for (1..$#ptrs) { push @chunks, substr($data, $ptrs[$_-1], $ptrs[$_]-$ptrs[$_-1]); } printf("%s %04x/%04x %s\n", $name, $p1, $p2, join(" ", map { unpack("H*", $_) } @chunks)); }