Esempio n. 1
0
        private byte[] ReadCDTracks(long Sector)
        {
            if (m_CurrentSectorType == SectorType.NONE)
            {
                CDRomGetSectorMode();
            }

            uint oneSectorSize = m_SectorSize[(int)m_CurrentSectorType];

            // Complete sector
            byte[] trackBuffer = new byte[m_TrackSize];

            // only for data (skip sync pattern & unneeded stuff)
            byte[] saveBuffer = new byte[oneSectorSize];

            // add the specified LBA start (for CVM and Xbox 360).
            Sector += m_StartLBA;

            UInt64 offset = (UInt64)(Sector * m_TrackSize);

            trackBuffer = m_FileReader.Read(offset, m_TrackSize);

            MemoryReader.BytesCopy(trackBuffer, m_SyncPattLength, saveBuffer, 0, oneSectorSize);
            return(saveBuffer);
        }
Esempio n. 2
0
        private UInt64 ReadBuffer(ref byte[] readBuffer, UInt64 Offset, UInt64 Length)
        {
            UInt64 LengthToRead = Length;
            UInt64 LengthRead;
            UInt64 TotalLengthRead = 0;

            // if the needed buffer is allready in memory ...
            if ((Offset >= streamFile.Offset) && (Offset + Length <= streamFile.Offset + streamFile.ValidSize))
            {
                MemoryReader.BytesCopy(streamFile.Buffer, (Offset - streamFile.Offset), readBuffer, 0, Length);
                return(Length);
            }

            try
            {
                // if not, we have to read for it ...
                while (Length > 0)
                {
                    streamFile.fReader.Position = (Int64)Offset;
                    streamFile.Offset           = Offset;

                    // we can't read more than the buffer size !
                    if (Length > (UInt64)streamFile.BufferSize)
                    {
                        LengthToRead = (UInt64)streamFile.BufferSize;
                    }
                    else
                    {
                        LengthToRead = Length;
                    }

                    LengthRead = (UInt64)streamFile.fReader.Read(streamFile.Buffer, 0, streamFile.BufferSize);

                    m_EOF = (LengthRead == 0);

                    streamFile.ValidSize = (UInt64)streamFile.BufferSize; // LengthRead;
                    Offset += LengthRead;

                    // We copy what we read into the dest buffer ...
                    MemoryReader.BytesCopy(streamFile.Buffer, 0, readBuffer, TotalLengthRead, LengthToRead);

                    // ... until we get all is needed
                    TotalLengthRead += LengthToRead;
                    if (LengthRead < LengthToRead)
                    {
                        return(TotalLengthRead);
                    }

                    Length -= LengthToRead;
                }
                return(TotalLengthRead);
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
                return(0);
            }
        }
Esempio n. 3
0
        public byte[] Read(UInt64 Offset, UInt64 Length)
        {
            byte[] tmpBuffer = new byte[Length];

            // if the needed buffer is allready in memory ...
            if ((Offset >= streamFile.Offset) && (Offset + Length <= streamFile.Offset + streamFile.ValidSize))
            {
                MemoryReader.BytesCopy(streamFile.Buffer, (Offset - streamFile.Offset), tmpBuffer, 0, Length);
                return(tmpBuffer);
            }

            ReadBuffer(ref tmpBuffer, Offset, Length);
            return(tmpBuffer);
        }
Esempio n. 4
0
        private byte[] ReadCDBuffer(long Sector, UInt64 length)
        {
            byte[] CFDSBuffer = new byte[length];

            uint buffOffset    = 0;
            uint oneSectorSize = m_SectorSize[(int)m_CurrentSectorType];

            do
            {
                byte[] readBuffer = ReadCDTracks(Sector);
                MemoryReader.BytesCopy(readBuffer, 0, CFDSBuffer, buffOffset, oneSectorSize);

                buffOffset += oneSectorSize;
                length     -= oneSectorSize;

                Sector++;
            } while (length > 0);

            return(CFDSBuffer);
        }
Esempio n. 5
0
        private void NGC_ParseRoot(byte[] buffer, int Session, string sPath, bool isWII)
        {
            UInt64 fileNumbers = MemoryReader.ReadLongBE(ref buffer, 0x08);
            UInt64 fstSize     = fileNumbers * 0x0C;
            UInt64 fstNameSize = (UInt64)buffer.Length - (fileNumbers * 0x0C);

            // Read FST Table ...
            byte[] fst = new byte[fstSize];
            MemoryReader.BytesCopy(buffer, 0, fst, 0, fstSize);

            // Read name Table
            byte[] fstName = new byte[fstNameSize];
            MemoryReader.BytesCopy(buffer, fstSize, fstName, 0, fstNameSize);

            uint LastDir = MemoryReader.ReadLongBE(ref buffer, 0x08) & 0x00ffffff;

            m_FST.FST_Folder.Add(new FST.cFolder((byte)Session, 0, 1, "\\", 0x800));

            NGC_ParseDir(buffer, fstName, Session, 0x0C, 1, LastDir * 0x0C, sPath, isWII);
        }
        public byte[] Read(UInt64 Offset, UInt64 Length)
        {
            uint oneSectorSize = m_SectorSize[(int)m_CurrentSectorType];
            int  sector        = (int)(Offset / oneSectorSize);

            uint cache_offset = (uint)(Offset % oneSectorSize);

            UInt64 cache_size = 0;

            byte[] buffer = new byte[Length];

            UInt64 buffer_offset = 0;

            while (Length != 0)
            {
                cache_size = Length;

                if (cache_size + cache_offset > oneSectorSize)
                {
                    cache_size = oneSectorSize - cache_offset;
                }

                if (this.ISOType == ISO_Type.WII)
                {
                    buffer = DecryptBlock(Length, m_SessionID, Offset);
                    return(buffer);
                }
                else
                {
                    MemoryReader.BytesCopy(ReadCDBuffer(sector, oneSectorSize), cache_offset, buffer, buffer_offset, cache_size);
                }

                buffer_offset += cache_size;
                Length        -= cache_size;
                cache_offset   = 0;
                sector++;
            }
            return(buffer);
        }
Esempio n. 7
0
        private void ISO_GetFile(FST PreviousFST, string sPath, string SessionName)
        {
            byte[] FI_Data;
            byte[] buffer;
            UInt64 bufferOffset  = 0;
            uint   oneSectorSize = m_SectorSize[(int)m_CurrentSectorType];

            FST CurrentFST = new FST();

            DirectoryRecord FileInfo = new DirectoryRecord();

            FileInfo.Recording_Date_and_Time = new byte[6];

            foreach (FST.cFolder f in PreviousFST.FST_Folder)
            {
                if (f.SessionID == m_SessionID)
                {
                    bufferOffset = 0;
                    buffer       = new byte[f.FolderLength];
                    buffer       = ReadCDBuffer(f.FolderID, f.FolderLength < 0x800 ? 0x800 : f.FolderLength);

                    do
                    {
                        if (bufferOffset >= (UInt64)buffer.Length)
                        {
                            break;
                        }

                        FileInfo = (DirectoryRecord)MemoryReader.BytesToStuct(buffer, FileInfo.GetType(), bufferOffset);

                        if (FileInfo.Directory_Record_Length != 0)
                        {
                            if (FileInfo.File_Identifier_Length != 0)
                            {
                                FI_Data = new byte[FileInfo.File_Identifier_Length];
                                MemoryReader.BytesCopy(buffer, bufferOffset + (UInt64)(Marshal.SizeOf(FileInfo) - 1), FI_Data, 0, FileInfo.File_Identifier_Length);

                                FileInfo.File_Identifier = Encoding.Default.GetString(FI_Data);

                                if (FileInfo.File_Identifier.Contains(";"))
                                {
                                    FileInfo.File_Identifier = FileInfo.File_Identifier.Replace(";1", "");
                                }

                                if (!FileInfo.File_Identifier.Equals("\0") && (!FileInfo.File_Identifier.Equals("")))
                                {
                                    if (FileInfo.File_Flags == 0x02)
                                    {
                                        CurrentFST.FST_Folder.Add(new FST.cFolder(f.SessionID,
                                                                                  f.FolderID,
                                                                                  (uint)(FileInfo.Location_of_Extent_LE),
                                                                                  FileInfo.File_Identifier,
                                                                                  (UInt64)FileInfo.Data_Length_LE));
                                    }
                                    else
                                    {
                                        m_FST.FST_File.Add(new FST.cFile(f.SessionID,
                                                                         f.FolderID,
                                                                         0,
                                                                         FileInfo.File_Identifier,
                                                                         sPath,
                                                                         sPath, (UInt64)((FileInfo.Location_of_Extent_LE + m_StartLBA) * oneSectorSize),
                                                                         (UInt64)FileInfo.Data_Length_LE,
                                                                         FileInfo.Recording_Date_and_Time, _isCVM));
                                    }
                                }
                            }

                            bufferOffset += FileInfo.Directory_Record_Length;
                        }
                        else
                        {
                            if (bufferOffset < (UInt64)((buffer.Length - Marshal.SizeOf(FileInfo))))
                            {
                                bufferOffset++;
                            }
                            else
                            {
                                break;
                            }
                        }
                    } while (1 == 1);
                }
            }

            // Add each Folder to current FST ...
            if (CurrentFST.FST_Folder.Count > 0)
            {
                for (int i = 0; i < CurrentFST.FST_Folder.Count; i++)
                {
                    m_FST.FST_Folder.Add(CurrentFST.FST_Folder[i]);
                }
                ISO_GetFile(CurrentFST, sPath, SessionName);
            }
        }