Example #1
0
 private void btnLoad_Click(object sender, EventArgs e)
 {
     lblTitle.Text = "Loading..."; lblTitle.Refresh();  // Set the title text and refresh
     //lsbContents.Items.Clear();  // Clear the items before we begin
     DBPF dbpfFile = new DBPF(txbPath.Text);
     DBPFEntry dbpfFileEntry = new DBPFEntry();
     // ----------------------------
     // Test UI Data file info
     // ----------------------------
     // Index info:
     // ----------------------------
     // Index type: ptShortFileIndex
     // Version: 0x0000000100000001
     // Hole index empty
     // ----------------------------
     // File info:
     // ----------------------------
     // Instance ID: 0x49060F07
     // Instance (high): 0x00000000
     // Group: 0xA99D8A11
     // Type: UI (0x00000000)
     // Compressed: Yes :(
     // Size: 0x000014cf
     // ----------------------------
     Package pkg = new Package(txbPath.Text);
     //richTextBox1.Text = pkg.Read(0x0000047E, 0x0000006A, pkg.file_);
     richTextBox2.Text = pkg.Read(1, pkg.file_);
     //lblLeftLen.Text = richTextBox1.Text.Length.ToString();
     lblD2.Text = richTextBox2.Text.Length.ToString() + " bytes";
     MessageBox.Show(pkg.numFiles.ToString());
     int i = 1;
     while (i < pkg.numFiles)
     {
         //lsbContents.Items.Add("File " + i.ToString());
     }
     this.lblTitle.Text = "The Sims 2 Package Extractor";
     // ----------------------------
 }
Example #2
0
 /// <summary>
 /// Read a file from the package
 /// </summary>
 /// <param name="filenumber">The number of the file to read</param>
 /// <param name="file">The package file's IoBuffer</param>
 /// <returns></returns>
 public string Read(int filenumber, IoBuffer file)
 {
     // Read header
     int i = 1;
     string toReturn = "";
     DBPF dFile = new DBPF(filePath);
     DBPFEntry dEntry = new DBPFEntry();
     UInt32 lastPos = 0x00000000;
     file.Seek(SeekOrigin.Begin, 0);
     file.Skip(24);
     UInt32 numEntries = file.ReadUInt32();
     numFiles = (int) numEntries;
     //UInt32 indOffset = file.ReadUInt32();
     //file.Skip(16);
     file.Skip(20);
     UInt32 minVersion = file.ReadUInt32();
     //file.Seek(SeekOrigin.Begin, indOffset);            // Goto the start of the index
     file.Seek(SeekOrigin.Begin, 86);            // Goto the start of the index
     Byte[] fOffset;
     Byte[] fSize;
     while (i <= filenumber)
     {
         file.Seek(SeekOrigin.Begin, lastPos + 86);
         if ((int)minVersion == 1)
         {
             file.ReadBytes(11);
             fOffset = file.ReadBytes(2);
             String temp = BitConverter.ToString(fOffset).Replace("-", "");
             lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             dEntry.FileOffset = 0x00000066 + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             //uifile1.FileOffset = fOffset;
             file.Seek(SeekOrigin.Current, -2);
             fSize = file.ReadBytes(3);
             temp = BitConverter.ToString(fSize).Replace("-", "");
             lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             //uifile1.FileSize = fSize;
             dEntry.FileSize = UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             //prevFileStop = BitConverter.ToInt64(fOffset, 0) + BitConverter.ToInt64(fSize, 0);
         }
         else
         {
             file.ReadBytes(16);
             fOffset = file.ReadBytes(2);
             String temp = BitConverter.ToString(fOffset).Replace("-", "");
             lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             dEntry.FileOffset = 0x00000066 + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             //uifile1.FileOffset = fOffset;
             file.Seek(SeekOrigin.Current, -2);
             fSize = file.ReadBytes(3);
             temp = BitConverter.ToString(fSize).Replace("-", "");
             lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             //uifile1.FileSize = fSize;
             dEntry.FileSize = UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier);
             //prevFileStop = BitConverter.ToInt64(fOffset, 0) + BitConverter.ToInt64(fSize, 0);
         }
         if (i != filenumber) i++;
         else break;
     }
     toReturn = Hex2Ascii(BitConverter.ToString(dFile.GetEntry(dEntry)).Replace("-", ""));
     return toReturn;
 }
Example #3
0
 /// <summary>
 /// Read a file from the package
 /// </summary>
 /// <param name="fileSize">The size of the file</param>
 /// <param name="fileOffset">The offset of the file</param>
 /// <param name="file">The package file's IoBuffer</param>
 /// <returns></returns>
 public string Read(UInt32 fileSize, UInt32 fileOffset, IoBuffer file)
 {
     string toReturn = "";
     DBPF dFile = new DBPF(filePath);
     DBPFEntry dEntry = new DBPFEntry();
     file.Seek(SeekOrigin.Begin, 0);
     file.Skip(24);
     UInt32 numEntries = file.ReadUInt32();
     file.Skip(20);
     UInt32 minVersion = file.ReadUInt32();
     file.Seek(SeekOrigin.Begin, 86);            // Go to the start of the index
     dEntry.FileOffset = fileOffset;
     dEntry.FileSize = fileSize;
     toReturn = Hex2Ascii(BitConverter.ToString(dFile.GetEntry(dEntry)).Replace("-", ""));
     return toReturn;
 }
Example #4
0
        /// <summary>
        /// Gets a DBPFEntry's data from this DBPF instance.
        /// </summary>
        /// <param name="entry">Entry to retrieve data for.</param>
        /// <returns>Data for entry.</returns>
        public byte[] GetEntry(DBPFEntry entry)
        {
            m_Reader.Seek(SeekOrigin.Begin, entry.FileOffset);

            return m_Reader.ReadBytes((int)entry.FileSize);
        }
Example #5
0
        /// <summary>
        /// Reads a DBPF archive from a stream.
        /// </summary>
        /// <param name="stream">The stream to read from.</param>
        public void Read(Stream stream)
        {
            m_EntryByID = new Dictionary<ulong, DBPFEntry>();
            m_EntriesList = new List<DBPFEntry>();

            var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN);
            m_Reader = io;
            this.Io = io;

            var magic = io.ReadCString(4);
            if (magic != "DBPF")
            {
                throw new Exception("Not a DBPF file");
            }

            var majorVersion = io.ReadUInt32();
            var minorVersion = io.ReadUInt32();
            var version = majorVersion + (((double)minorVersion) / 10.0);

            /** Unknown, set to 0 **/
            io.Skip(12);

            if (version == 1.0)
            {
                this.DateCreated = io.ReadInt32();
                this.DateModified = io.ReadInt32();
            }

            if (version < 2.0)
            {
                IndexMajorVersion = io.ReadUInt32();
            }

            NumEntries = io.ReadUInt32();
            uint indexOffset = 0;
            if (version < 2.0)
            {
                indexOffset = io.ReadUInt32();
            }
            var indexSize = io.ReadUInt32();

            if (version < 2.0)
            {
                var trashEntryCount = io.ReadUInt32();
                var trashIndexOffset = io.ReadUInt32();
                var trashIndexSize = io.ReadUInt32();
                var indexMinor = io.ReadUInt32();
            }
            else if (version == 2.0)
            {
                var indexMinor = io.ReadUInt32();
                indexOffset = io.ReadUInt32();
                io.Skip(4);
            }

            /** Padding **/
            io.Skip(32);

            io.Seek(SeekOrigin.Begin, indexOffset);
            for (int i = 0; i < NumEntries; i++)
            {
                var entry = new DBPFEntry();
                entry.TypeID = (DBPFTypeID)io.ReadUInt32();
                entry.GroupID = (DBPFGroupID)io.ReadUInt32();
                entry.InstanceID = io.ReadUInt32();
                entry.SecondInstanceID = io.ReadUInt32();
                entry.FileOffset = io.ReadUInt32();
                entry.FileSize = io.ReadUInt32();

                m_EntriesList.Add(entry);
                ulong id = (((ulong)entry.InstanceID) << 32) + (ulong)entry.TypeID;
                if (!m_EntryByID.ContainsKey(id))
                    m_EntryByID.Add(id, entry);

                if (!m_EntriesByType.ContainsKey(entry.TypeID))
                    m_EntriesByType.Add(entry.TypeID, new List<DBPFEntry>());

                m_EntriesByType[entry.TypeID].Add(entry);
            }
        }