예제 #1
0
        public UInt64 NGC_ParseDir(byte[] buffer, byte[] fstName, int SessionID, UInt64 bufferOffset, uint ParentID, UInt64 lastOffset, string sPath, bool isWII)
        {
            byte[] dateStamp = { 0, 0, 0, 0, 0, 0, 0 };

            do
            {
                uint   nameOffset = MemoryReader.ReadLongBE(ref buffer, bufferOffset) & 0x00ffffff;
                string Filename   = MemoryReader.GetString(ref fstName, nameOffset);

                if (buffer[bufferOffset] == 0x01)
                {
                    uint LastDir = MemoryReader.ReadLongBE(ref buffer, bufferOffset + 0x08) & 0x00ffffff;
                    ParentID = MemoryReader.ReadLongBE(ref buffer, bufferOffset + 0x04) + 1;
                    m_FST.FST_Folder.Add(new FST.cFolder((byte)SessionID, ParentID, (uint)((bufferOffset / 0x0C) + 1), Filename, 0));
                    bufferOffset = NGC_ParseDir(buffer, fstName, SessionID, bufferOffset + 0x0C, (uint)((bufferOffset / 0x0C) + 1), LastDir * 0x0C, sPath, isWII);
                }
                else
                {
                    UInt64 fileOffset = (UInt64)(MemoryReader.ReadLongBE(ref buffer, bufferOffset + 0x04) * (isWII ? 4 : 1));
                    UInt64 fileSize   = MemoryReader.ReadLongBE(ref buffer, bufferOffset + 0x08);
                    m_FST.FST_File.Add(new FST.cFile((byte)SessionID, ParentID, 0, Filename, sPath, sPath, fileOffset, fileSize, dateStamp, false));
                    bufferOffset += 0x0C;
                }
            } while (bufferOffset < lastOffset);
            return(bufferOffset);
        }
예제 #2
0
        private void NGC_GetFST(string sPath, bool isWII)
        {
            // Read the first sector to grab disc info & rootDirectory offset & size
            byte[] buffer = m_FileReader.Read(0, 0x800);

            string SessionName = MemoryReader.GetString(ref buffer, 0x20);

            m_FST.FST_Session.Add(new FST.cSession(1, SessionName, 0, sPath));

            uint   fstNGCSize   = MemoryReader.ReadLongBE(ref buffer, 0x42C);
            UInt64 fstNGCOffset = MemoryReader.ReadLongBE(ref buffer, 0x424);

            // Ensure that we read the all FST
            byte[] fstNGC = m_FileReader.Read(fstNGCOffset, fstNGCSize);
            NGC_ParseRoot(fstNGC, 1, sPath, isWII);
        }
예제 #3
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 UInt32 Read_32bitsBE(UInt64 Offset)
 {
     byte[] buffer = new byte[4];
     buffer = this.Read(Offset, 4);
     return(MemoryReader.ReadLongBE(ref buffer, 0));
 }