コード例 #1
0
        public CR2WFile()
        {
            names      = new List <CR2WNameWrapper>();      //block 2
            imports    = new List <CR2WImportWrapper>();    //block 3
            properties = new List <CR2WPropertyWrapper>();  //block 4
            chunks     = new List <CR2WExportWrapper>();    //block 5
            buffers    = new List <CR2WBufferWrapper>();    //block 6
            embedded   = new List <CR2WEmbeddedWrapper>();  //block 7

            m_fileheader = new CR2WFileHeader()
            {
                version = 162,
            };
        }
コード例 #2
0
ファイル: CR2WFile.cs プロジェクト: sw3dg1n/Wolven-kit
        public CR2WFile()
        {
            names = new List <CR2WString> {
                new CR2WString()
            };
            imports = new List <CR2WHandle>();
            chunks  = new List <CR2WChunk>();
            //table4 = new List<CR2WHeaderBlock4>();
            buffers  = new List <CR2WBuffer>();
            embedded = new List <CR2WEmbedded>();

            m_fileheader         = new CR2WFileHeader();
            m_fileheader.version = 162;
        }
コード例 #3
0
ファイル: CR2WFile.cs プロジェクト: eprilx/CP77Tools
        public CR2WFile()
        {
            Names      = new List <CR2WNameWrapper>();      //block 2
            Imports    = new List <CR2WImportWrapper>();    //block 3
            Properties = new List <CR2WPropertyWrapper>();  //block 4
            Chunks     = new List <CR2WExportWrapper>();    //block 5
            Buffers    = new List <CR2WBufferWrapper>();    //block 6
            Embedded   = new List <CR2WEmbeddedWrapper>();  //block 7

            m_fileheader = new CR2WFileHeader()
            {
                version = 162,
            };


            Logger = ServiceLocator.Default.ResolveType <ILoggerService>();

            StringDictionary = new Dictionary <uint, string>();
            m_tableheaders   = new CR2WTable[10];
        }
コード例 #4
0
        private void ProcessFile()
        {
            var id = ReadStruct <uint>();

            if (id != MAGIC)
            {
                throw new FormatException($"Not a CR2W file, Magic read as 0x{id:X8}");
            }

            m_fileheader = ReadStruct <CR2WFileHeader>();
            if (m_fileheader.version > 163 || m_fileheader.version < 159)
            {
                throw new FormatException($"Unknown Version {m_fileheader.version}. Supported versions: 159 - 163.");
            }

            var dt = new CDateTime(m_fileheader.timeStamp);

            m_hasInternalBuffer = m_fileheader.bufferSize > m_fileheader.fileSize;
            m_tableheaders      = ReadStructs <CR2WTable>(10);

            m_strings  = ReadStringsBuffer();
            m_names    = ReadTable <CR2WName>(1);
            m_imports  = ReadTable <CR2WImport>(2);
            m_table4   = ReadTable <CR2WProperty>(3);
            m_exports  = ReadTable <CR2WExport>(4);
            m_buffers  = ReadTable <CR2WBuffer>(5);
            m_embedded = ReadTable <CR2WEmbedded>(6);

            // Fixing
            for (int i = 0; i < m_names.Length; i++)
            {
                FixNameFNV1A(ref m_names[i]);
            }

            for (int i = 0; i < m_exports.Length; i++)
            {
                FixExportCRC32(ref m_exports[i]);
            }

            for (int i = 0; i < m_buffers.Length; i++)
            {
                FixBufferCRC32(ref m_buffers[i]);
            }

            // Write File
            m_stream.Seek(160, SeekOrigin.Begin);

            WriteStringBuffer();
            WriteTable <CR2WName>(m_names, 1);
            WriteTable <CR2WImport>(m_imports, 2);
            WriteTable <CR2WProperty>(m_table4, 3);
            WriteTable <CR2WExport>(m_exports, 4);
            WriteTable <CR2WBuffer>(m_buffers, 5);
            WriteTable <CR2WEmbedded>(m_embedded, 6);

            // Write Header again
            m_stream.Seek(0, SeekOrigin.Begin);

            m_fileheader.timeStamp = CDateTime.Now.ToUInt64();
            m_fileheader.crc32     = CalculateHeaderCRC32();

            WriteStruct <uint>(MAGIC);
            WriteStruct <CR2WFileHeader>(m_fileheader);
            WriteStructs <CR2WTable>(m_tableheaders);
        }
コード例 #5
0
        public void Read(BinaryReader file)
        {
            m_stream = file.BaseStream;

            #region Read Headers
            // read file header
            var id = ReadStruct <uint>();
            if (id != MAGIC)
            {
                throw new FormatException($"Not a CR2W file, Magic read as 0x{id:X8}");
            }

            m_fileheader = ReadStruct <CR2WFileHeader>();
            if (m_fileheader.version > 163 || m_fileheader.version < 159)
            {
                throw new FormatException($"Unknown Version {m_fileheader.version}. Supported versions: 159 - 163.");
            }

            var dt = new CDateTime(m_fileheader.timeStamp);

            m_tableheaders = ReadStructs <CR2WTable>(10);

            // read strings
            m_strings = ReadStringsBuffer();

            // read tables
            names = ReadTable <CR2WName>(1).Select(_ => new CR2WNameWrapper(_)
            {
                Str = m_dictionary[_.value],
            }).ToList();
            imports = ReadTable <CR2WImport>(2).Select(_ => new CR2WImportWrapper(_)
            {
                DepotPathStr = m_dictionary[_.depotPath],
                ClassNameStr = names[_.className].Str,
            }).ToList();
            properties = ReadTable <CR2WProperty>(3).Select(_ => new CR2WPropertyWrapper(_)).ToList();
            chunks     = ReadTable <CR2WExport>(4).Select(_ => new CR2WExportWrapper(this, _)
            {
                //ParentChunkId = _.parentID
            }).ToList();
            buffers  = ReadTable <CR2WBuffer>(5).Select(_ => new CR2WBufferWrapper(_)).ToList();
            embedded = ReadTable <CR2WEmbedded>(6).Select(_ => new CR2WEmbeddedWrapper(_)
            {
                ParentImports = imports,
                Handle        = m_dictionary[_.path],
            }).ToList();
            #endregion

            #region Read Data
            // Read object data //block 5
            foreach (var chunk in chunks)
            {
                chunk.ReadData(file);
            }
            // Read buffer data //block 6
            foreach (var buffer in buffers)
            {
                //buffer.ReadData(file);
            }
            // Read embedded files //block 7
            foreach (var emb in embedded)
            {
                emb.ReadData(file);
            }
            #endregion



            //this never actually triggers

            /*#region Read Buffer
             * file.BaseStream.Seek(m_fileheader.fileSize, SeekOrigin.Begin);
             * m_hasInternalBuffer = m_fileheader.bufferSize > m_fileheader.fileSize;
             * byte[] bufferdata;
             * var actualbuffersize = (int)(m_fileheader.bufferSize - m_fileheader.fileSize);
             * if (actualbuffersize > 0)
             * {
             *  bufferdata = new byte[actualbuffersize];
             *  file.BaseStream.Read(bufferdata, 0, actualbuffersize);
             * }
             #endregion*/

            m_stream = null;
        }
コード例 #6
0
ファイル: CR2WFile.cs プロジェクト: sw3dg1n/Wolven-kit
        public void Read(BinaryReader file)
        {
            m_stream = file.BaseStream;

            #region Read Headers
            var id = ReadStruct <uint>();
            if (id != MAGIC)
            {
                throw new FormatException($"Not a CR2W file, Magic read as 0x{id:X8}");
            }

            m_fileheader = ReadStruct <CR2WFileHeader>();
            if (m_fileheader.version > 163 || m_fileheader.version < 159)
            {
                throw new FormatException($"Unknown Version {m_fileheader.version}. Supported versions: 159 - 163.");
            }

            var dt = new CDateTime(m_fileheader.timeStamp);

            m_hasInternalBuffer = m_fileheader.bufferSize > m_fileheader.fileSize;
            m_tableheaders      = ReadStructs <CR2WTableHeader>(10);

            m_strings  = ReadStringsBuffer();
            m_names    = ReadTable <CR2WName>(1);
            m_imports  = ReadTable <CR2WImportHeader>(2);
            m_table4   = ReadTable <CR2WTable4Item>(3);
            m_exports  = ReadTable <CR2WExportHeader>(4);
            m_buffers  = ReadTable <CR2WBufferHeader>(5);
            m_embedded = ReadTable <CR2WEmbeddedHeader>(6);
            #endregion

            #region Read Data
            // read Name data
            names = (from n in m_names
                     let str = new CR2WString()
            {
                hash = n.hash,
                offset = n.value,
                str = m_dictionary[n.value]
            }
                     select str).ToList();
            // Read Handle data (imports)
            imports = (from i in m_imports
                       let handle = new CR2WHandle()
            {
                offset = i.depotPath,
                filetype = i.className,
                flags = i.flags,
                str = m_dictionary[i.depotPath]
            }
                       select handle).ToList();
            // Read Chunk data (exports)
            chunks = new List <CR2WChunk>();
            foreach (var c in m_exports)
            {
                var chunk = new CR2WChunk(this)
                {
                    typeId        = c.className,
                    Flags         = c.objectFlags,
                    ParentChunkId = c.parentID,
                    size          = c.dataSize,
                    offset        = c.dataOffset,
                    template      = c.template,
                    crc           = c.crc32
                };
                chunks.Add(chunk);
                chunk.ReadData(file);
            }

            // Read Buffer Data (block 6)
            buffers = new List <CR2WBuffer>();
            foreach (var b in m_buffers)
            {
                var buffer = new CR2WBuffer()
                {
                    flags   = b.flags,
                    index   = b.index,
                    offset  = b.offset,
                    size    = b.diskSize,
                    memsize = b.memSize,
                    crc     = b.crc32
                };
                buffers.Add(buffer);
            }
            // Read Embedded Data (Block 7)
            embedded = new List <CR2WEmbedded>();
            foreach (var e in m_embedded)
            {
                var emb = new CR2WEmbedded()
                {
                    handle_name_count  = e.importIndex,
                    handle_name_offset = e.path,
                    pathHash           = e.pathHash,
                    offset             = e.dataOffset,
                    size = e.dataSize
                };
                var offset = e.path;
                for (int i = 0; i < e.importIndex; i++)
                {
                    if (offset > m_dictionary.Last().Key)
                    {
                        continue;
                    }
                    emb.handles.Add(m_dictionary[offset]);
                    offset += (uint)m_dictionary[offset].Length + 1;
                }
                embedded.Add(emb);
                emb.ReadData(file);
            }
            #endregion

            #region Read Buffer

            file.BaseStream.Seek(m_fileheader.fileSize, SeekOrigin.Begin);

            var actualbuffersize = (int)(m_fileheader.bufferSize - m_fileheader.fileSize);
            if (actualbuffersize > 0)
            {
                bufferdata = new byte[actualbuffersize];
                file.BaseStream.Read(bufferdata, 0, actualbuffersize);
            }
            #endregion

            m_stream = null;
        }