| Index: embios/trunk/tools/embios.py | 
| — | — | @@ -825,6 +825,107 @@ | 
| 826 | 826 |          self.logger.info(" done\n")
 | 
| 827 | 827 |  
 | 
| 828 | 828 |      @command
 | 
|   | 829 | +    def getvolumeinfo(self, volume):
 | 
|   | 830 | +        """
 | 
|   | 831 | +            Gathers some information about a storage volume used
 | 
|   | 832 | +        """
 | 
|   | 833 | +        volume = self._hexint(volume)
 | 
|   | 834 | +        data = self.embios.storage_get_info(volume)
 | 
|   | 835 | +        self.logger.info("Sector size: "+str(data["sectorsize"])+"\n")
 | 
|   | 836 | +        self.logger.info("Number of sectors: "+str(data["numsectors"])+"\n")
 | 
|   | 837 | +        self.logger.info("Vendor: "+data["vendor"]+"\n")
 | 
|   | 838 | +        self.logger.info("Product: "+data["product"]+"\n")
 | 
|   | 839 | +        self.logger.info("Revision: "+data["revision"])
 | 
|   | 840 | +
 | 
|   | 841 | +    @command
 | 
|   | 842 | +    def readrawstorage(self, volume, sector, count, addr):
 | 
|   | 843 | +        """
 | 
|   | 844 | +            Reads <count> sectors starting at <sector> from storage <volume> to memory at <addr>.
 | 
|   | 845 | +        """
 | 
|   | 846 | +        volume = self._hexint(volume)
 | 
|   | 847 | +        sector = self._hexint(sector)
 | 
|   | 848 | +        count = self._hexint(count)
 | 
|   | 849 | +        addr = self._hexint(addr)
 | 
|   | 850 | +        self.logger.info("Reading volume %s sectors %X - %X to %08X..." % (volume, sector, sector + count - 1, addr))
 | 
|   | 851 | +        self.embios.lib.dev.timeout = 50000
 | 
|   | 852 | +        self.embios.storage_read_sectors_md(volume, sector, count, addr)
 | 
|   | 853 | +        self.logger.info("done\n")
 | 
|   | 854 | +
 | 
|   | 855 | +    @command
 | 
|   | 856 | +    def writerawstorage(self, volume, sector, count, addr):
 | 
|   | 857 | +        """
 | 
|   | 858 | +            Writes memory contents at <addr> to <count> sectors starting at <sector> on storage <volume>.
 | 
|   | 859 | +        """
 | 
|   | 860 | +        volume = self._hexint(volume)
 | 
|   | 861 | +        sector = self._hexint(sector)
 | 
|   | 862 | +        count = self._hexint(count)
 | 
|   | 863 | +        addr = self._hexint(addr)
 | 
|   | 864 | +        self.logger.info("Writing %08X to volume %s sectors %X - %X..." % (addr, volume, sector, sector + count - 1))
 | 
|   | 865 | +        self.embios.lib.dev.timeout = 50000
 | 
|   | 866 | +        self.embios.storage_write_sectors_md(volume, sector, count, addr)
 | 
|   | 867 | +        self.logger.info("done\n")
 | 
|   | 868 | +
 | 
|   | 869 | +    @command
 | 
|   | 870 | +    def readrawstoragefile(self, volume, sector, count, file, buffer = False, buffsize = "100000"):
 | 
|   | 871 | +        """
 | 
|   | 872 | +            Reads <count> sectors starting at <sector> from storage <volume> to file <file>,
 | 
|   | 873 | +            buffering them in memory at <buffer> in chunks of <buffsize> bytes (both optional).
 | 
|   | 874 | +        """
 | 
|   | 875 | +        volume = self._hexint(volume)
 | 
|   | 876 | +        sector = self._hexint(sector)
 | 
|   | 877 | +        count = self._hexint(count)
 | 
|   | 878 | +        if buffer == False: buffer = self.embios.lib.dev.usermem.lower
 | 
|   | 879 | +        else: buffer = self._hexint(buffer)
 | 
|   | 880 | +        buffsize = self._hexint(buffsize)
 | 
|   | 881 | +        try:
 | 
|   | 882 | +            f = open(file, 'wb')
 | 
|   | 883 | +        except IOError:
 | 
|   | 884 | +            raise ArgumentError("Could not open local file for writing.")
 | 
|   | 885 | +        self.logger.info("Reading volume %s sectors %X - %X to %s..." % (volume, sector, sector + count - 1, file))
 | 
|   | 886 | +        self.embios.lib.dev.timeout = 50000
 | 
|   | 887 | +        storageinfo = self.embios.storage_get_info(volume)
 | 
|   | 888 | +        while count > 0:
 | 
|   | 889 | +            sectors = min(count, int(buffsize / storageinfo.sectorsize))
 | 
|   | 890 | +            self.embios.storage_read_sectors_md(volume, sector, sectors, buffer)
 | 
|   | 891 | +            f.write(self.embios.read(buffer, storageinfo.sectorsize * sectors))
 | 
|   | 892 | +            sector = sector + sectors
 | 
|   | 893 | +            count = count - sectors
 | 
|   | 894 | +        f.close()
 | 
|   | 895 | +        self.logger.info("done\n")
 | 
|   | 896 | +
 | 
|   | 897 | +    @command
 | 
|   | 898 | +    def writerawstoragefile(self, volume, sector, count, file, buffer = False, buffsize = "100000"):
 | 
|   | 899 | +        """
 | 
|   | 900 | +            Writes contents of <file> to <count> sectors starting at <sector> on storage <volume>,
 | 
|   | 901 | +            buffering them in memory at <buffer> in chunks of <buffsize> bytes (both optional).
 | 
|   | 902 | +        """
 | 
|   | 903 | +        volume = self._hexint(volume)
 | 
|   | 904 | +        sector = self._hexint(sector)
 | 
|   | 905 | +        count = self._hexint(count)
 | 
|   | 906 | +        if buffer == False: buffer = self.embios.lib.dev.usermem.lower
 | 
|   | 907 | +        else: buffer = self._hexint(buffer)
 | 
|   | 908 | +        buffsize = self._hexint(buffsize)
 | 
|   | 909 | +        try:
 | 
|   | 910 | +            f = open(file, 'rb')
 | 
|   | 911 | +        except IOError:
 | 
|   | 912 | +            raise ArgumentError("Could not open local file for reading.")
 | 
|   | 913 | +        self.logger.info("Writing %s to volume %s sectors %X - %X..." % (file, volume, sector, sector + count - 1))
 | 
|   | 914 | +        self.embios.lib.dev.timeout = 50000
 | 
|   | 915 | +        storageinfo = self.embios.storage_get_info(volume)
 | 
|   | 916 | +        while count > 0:
 | 
|   | 917 | +            sectors = min(count, int(buffsize / storageinfo.sectorsize))
 | 
|   | 918 | +            bytes = storageinfo.sectorsize * sectors
 | 
|   | 919 | +            data = f.read(bytes)
 | 
|   | 920 | +            if len(data) == 0: break
 | 
|   | 921 | +            while len(data) < bytes: data = data + f.read(bytes - len(data))
 | 
|   | 922 | +            self.embios.write(buffer, data)
 | 
|   | 923 | +            self.embios.storage_write_sectors_md(volume, sector, sectors, buffer)
 | 
|   | 924 | +            sector = sector + sectors
 | 
|   | 925 | +            count = count - sectors
 | 
|   | 926 | +        f.close()
 | 
|   | 927 | +        self.logger.info("done\n")
 | 
|   | 928 | +
 | 
|   | 929 | +    @command
 | 
| 829 | 930 |      def mkdir(self, dirname):
 | 
| 830 | 931 |          """
 | 
| 831 | 932 |              Creates a directory
 | 
| Index: embios/trunk/tools/libembios.py | 
| — | — | @@ -538,11 +538,14 @@ | 
| 539 | 539 |                  count = 1
 | 
| 540 | 540 |          self.ipodclassic_hddaccess(1, sector, count, tempaddr + offset)
 | 
| 541 | 541 |      
 | 
| 542 |   | -    def storage_get_info(self):
 | 
|   | 542 | +    def storage_get_info(self, volume):
 | 
| 543 | 543 |          """ Get information about a storage device """
 | 
| 544 |   | -        result = self.lib.monitorcommand(struct.pack("IIII", 27, 0, 0, 0), "IIIIIIII", ("version", None, None, "sectorsize", "numsectors", "vendorptr", "productptr", "revisionptr"))
 | 
|   | 544 | +        result = self.lib.monitorcommand(struct.pack("IIII", 27, volume, 0, 0), "IIIIIIII", ("version", None, None, "sectorsize", "numsectors", "vendorptr", "productptr", "revisionptr"))
 | 
| 545 | 545 |          if result.version != 1:
 | 
| 546 | 546 |              raise ValueError("Unknown version of storage_info struct: %d" % result.version)
 | 
|   | 547 | +        result.vendor = self.readstring(result.vendorptr)
 | 
|   | 548 | +        result.product = self.readstring(result.productptr)
 | 
|   | 549 | +        result.revision = self.readstring(result.revisionptr)
 | 
| 547 | 550 |          return result
 | 
| 548 | 551 |      
 | 
| 549 | 552 |      def storage_read_sectors_md(self, volume, sector, count, addr):
 |