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); }
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); } }
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); }
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); }
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); }
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); } }