コード例 #1
0
        public void Initialize(FileStream isoStream, long offset, bool isRawDump)
        {
            byte[] volumeIdentifierBytes;

            this.DiscBaseOffset = offset;
            this.DiscReader     = new NintendoWiiEncryptedDiscReader();

            this.WiiDiscId  = ByteConversion.GetAsciiText(ParseFile.ParseSimpleOffset(isoStream, this.DiscBaseOffset, 1));
            this.GameCode   = ByteConversion.GetAsciiText(ParseFile.ParseSimpleOffset(isoStream, this.DiscBaseOffset + 1, 2));
            this.RegionCode = ByteConversion.GetAsciiText(ParseFile.ParseSimpleOffset(isoStream, this.DiscBaseOffset + 3, 1));
            this.MakerCode  = ParseFile.ParseSimpleOffset(isoStream, this.DiscBaseOffset + 4, 2);

            this.IsRawDump = isRawDump;

            // get identifier
            volumeIdentifierBytes = ParseFile.ParseSimpleOffset(isoStream, this.DiscBaseOffset + 0x20, 64);
            volumeIdentifierBytes = FileUtil.ReplaceNullByteWithSpace(volumeIdentifierBytes);

            // initialize partition info
            this.InitializePartitions(isoStream);

            // initialize volumes
            this.VolumeArrayList = new ArrayList();
            this.LoadVolumes(isoStream);
        }
コード例 #2
0
 public NintendoWiiOpticalDiscVolume(long volumeBaseOffset, long dataOffset,
                                     byte[] partitionKey, NintendoWiiEncryptedDiscReader discReader)
 {
     this.VolumeBaseOffset = volumeBaseOffset;
     this.DataOffset       = dataOffset;
     this.PartitionKey     = partitionKey;
     this.DiscReader       = discReader;
     this.DiscReader.CurrentDecryptedBlockNumber = -1;
     this.DiscReader.CurrentDecryptedBlock       = null;
 }
コード例 #3
0
 public NintendoWiiOpticalDiscFileStructure(string parentDirectoryName,
                                            string sourceFilePath, string fileName, long volumeBaseOffset,
                                            long dataSectionOffset, long lba, long size, DateTime fileTime,
                                            NintendoWiiEncryptedDiscReader discReader, byte[] partitionKey)
 {
     this.ParentDirectoryName = parentDirectoryName;
     this.SourceFilePath      = sourceFilePath;
     this.FileName            = fileName;
     this.VolumeBaseOffset    = volumeBaseOffset;
     this.DataSectionOffset   = dataSectionOffset;
     this.Lba              = lba;
     this.IsRaw            = false;
     this.NonRawSectorSize = -1;
     this.Size             = size;
     this.FileMode         = CdSectorType.Unknown;
     this.FileDateTime     = fileTime;
     this.DiscReader       = discReader;
     this.PartitionKey     = partitionKey;
 }
コード例 #4
0
        public NintendoWiiOpticalDiscDirectoryStructure(
            FileStream isoStream,
            string sourceFilePath,
            NintendoWiiOpticalDiscDirectoryRecord directoryRecord,
            DateTime creationDateTime,
            long baseOffset,
            long dataSectionOffset,
            long rootDirectoryOffset,
            long directoryOffset,
            long nameTableOffset,
            string directoryName,
            string parentDirectory,
            NintendoWiiEncryptedDiscReader discReader,
            byte[] partitionKey)
        {
            string nextDirectory;

            this.SourceFilePath        = sourceFilePath;
            this.SubDirectoryArray     = new ArrayList();
            this.FileArray             = new ArrayList();
            this.DirectoryRecordOffset = directoryOffset;

            if (String.IsNullOrEmpty(parentDirectory))
            {
                this.ParentDirectoryName = String.Empty;
                this.DirectoryName       = directoryName;
                nextDirectory            = this.DirectoryName;
            }
            else
            {
                this.ParentDirectoryName = parentDirectory;
                this.DirectoryName       = directoryName;
                nextDirectory            = this.ParentDirectoryName + Path.DirectorySeparatorChar + this.DirectoryName;
            }

            this.parseDirectoryRecord(isoStream, directoryRecord, creationDateTime, baseOffset, dataSectionOffset, rootDirectoryOffset, directoryOffset, nameTableOffset, nextDirectory, discReader, partitionKey);
        }
コード例 #5
0
        private void parseDirectoryRecord(
            FileStream isoStream,
            NintendoWiiOpticalDiscDirectoryRecord directoryRecord,
            DateTime creationDateTime,
            long baseOffset,
            long dataSectionOffset,
            long rootDirectoryOffset,
            long directoryOffset,
            long nameTableOffset,
            string parentDirectory,
            NintendoWiiEncryptedDiscReader discReader,
            byte[] partitionKey)
        {
            long directoryRecordEndOffset;
            long newDirectoryEndOffset;
            long currentOffset = directoryOffset;

            int itemNameSize;

            byte[] itemNameBytes;
            string itemName;

            byte[] newDirectoryRecordBytes;
            NintendoWiiOpticalDiscDirectoryRecord    newDirectoryRecord;
            NintendoWiiOpticalDiscDirectoryStructure newDirectory;
            NintendoWiiOpticalDiscFileStructure      newFile;

            directoryRecordEndOffset = rootDirectoryOffset + (directoryRecord.FileSize * 0xC);
            currentOffset           += 0xC;

            while (currentOffset < directoryRecordEndOffset)
            {
                newDirectoryRecordBytes = discReader.GetBytes(isoStream, baseOffset, dataSectionOffset,
                                                              currentOffset, 0xC, partitionKey);
                newDirectoryRecord = new NintendoWiiOpticalDiscDirectoryRecord(newDirectoryRecordBytes);

                itemNameBytes = discReader.GetBytes(isoStream, baseOffset, dataSectionOffset,
                                                    nameTableOffset + newDirectoryRecord.NameOffset, 512, partitionKey);
                itemNameSize  = ParseFile.GetSegmentLength(itemNameBytes, 0, Constants.NullByteArray);
                itemNameBytes = discReader.GetBytes(isoStream, baseOffset, dataSectionOffset,
                                                    nameTableOffset + newDirectoryRecord.NameOffset, itemNameSize, partitionKey);
                itemName = ByteConversion.GetEncodedText(itemNameBytes, ByteConversion.GetPredictedCodePageForTags(itemNameBytes));

                if (!newDirectoryRecord.IsDirectory)
                {
                    newFile = new NintendoWiiOpticalDiscFileStructure(parentDirectory,
                                                                      this.SourceFilePath, itemName,
                                                                      baseOffset, dataSectionOffset, newDirectoryRecord.FileOffset,
                                                                      newDirectoryRecord.FileSize, creationDateTime, discReader,
                                                                      partitionKey);

                    this.FileArray.Add(newFile);
                    currentOffset += 0xC;
                }
                else
                {
                    newDirectory =
                        new NintendoWiiOpticalDiscDirectoryStructure(isoStream,
                                                                     isoStream.Name, newDirectoryRecord,
                                                                     creationDateTime, baseOffset, dataSectionOffset, rootDirectoryOffset,
                                                                     currentOffset, nameTableOffset,
                                                                     itemName, parentDirectory, discReader, partitionKey);

                    this.SubDirectoryArray.Add(newDirectory);

                    newDirectoryEndOffset = rootDirectoryOffset + (newDirectoryRecord.FileSize * 0xC);
                    currentOffset         = newDirectoryEndOffset;
                }
            }
        }