Exemplo n.º 1
0
        public static PropertySubBlock[] ParseSubBlocks(byte[] buffer, ulong offset, ulong startPos, ulong maxLength)
        {
            ArrayList subBlockList  = new ArrayList();
            ulong     currentOffset = offset + startPos;
            ulong     endOffset     = offset + startPos + maxLength;
            ulong     blockNum      = 0;

            while (currentOffset + 0x0C < endOffset)
            {
                PropertySubBlock subBlock = new PropertySubBlock();

                subBlock.ValidFlag = GetUInt32(buffer, currentOffset);
                subBlock.Id        = GetUInt32(buffer, currentOffset + 4);
                if (subBlock.Id == 0x00FF0000)
                {
                    UInt32 propTypes  = GetUInt32(buffer, currentOffset + 8);
                    UInt32 remainSize = GetUInt32(buffer, currentOffset + 0x0C);
                    UInt32 unknown    = GetUInt32(buffer, currentOffset + 0x10);
                    Console.Out.WriteLine("  [I] Advanced subblock. [Prop: {0:X8}, Remain: {1:X8}, Unk: {2:X8}", propTypes, remainSize, unknown);
                    currentOffset += 0x0C;
                }

                subBlock.TotalLength = GetUInt32(buffer, currentOffset + 8);

                Log.WriteLine("  [SubBlock: {0:X2}, Length: {1:X8}, Flag: {2:X8}] [Base: {3:X8}]", blockNum, subBlock.TotalLength, subBlock.ValidFlag, currentOffset);

                if ((subBlock.TotalLength > 0x0C) && (currentOffset + subBlock.TotalLength <= endOffset))
                {
                    subBlock.Properties = ParseProperties(buffer, currentOffset, 0x0C, subBlock.TotalLength - 0x0C);
                }
                else
                {
                    Console.Out.WriteLine("    [E] Invalid subblock size");
                }
                subBlockList.Add(subBlock);

                currentOffset += subBlock.TotalLength;
                blockNum++;
            }

            return((PropertySubBlock[])subBlockList.ToArray(typeof(PropertySubBlock)));
        }
        public static PropertySubBlock[] ParseSubBlocks(byte[] buffer, ulong offset, ulong startPos, ulong maxLength)
        {
            ArrayList subBlockList = new ArrayList();
            ulong currentOffset = offset + startPos;
            ulong endOffset = offset + startPos + maxLength;
            ulong blockNum = 0;

            while (currentOffset + 0x0C < endOffset)
            {
                PropertySubBlock subBlock = new PropertySubBlock();

                subBlock.ValidFlag = GetUInt32(buffer, currentOffset);
                subBlock.Id = GetUInt32(buffer, currentOffset + 4);
                if (subBlock.Id == 0x00FF0000)
                {
                    UInt32 propTypes = GetUInt32(buffer, currentOffset + 8);
                    UInt32 remainSize = GetUInt32(buffer, currentOffset + 0x0C);
                    UInt32 unknown = GetUInt32(buffer, currentOffset + 0x10);
                    Console.Out.WriteLine("  [I] Advanced subblock. [Prop: {0:X8}, Remain: {1:X8}, Unk: {2:X8}", propTypes, remainSize, unknown);
                    currentOffset += 0x0C;
                }

                subBlock.TotalLength = GetUInt32(buffer, currentOffset + 8);

                Log.WriteLine("  [SubBlock: {0:X2}, Length: {1:X8}, Flag: {2:X8}] [Base: {3:X8}]", blockNum, subBlock.TotalLength, subBlock.ValidFlag, currentOffset);

                if ((subBlock.TotalLength > 0x0C) && (currentOffset + subBlock.TotalLength <= endOffset))
                {
                    subBlock.Properties = ParseProperties(buffer, currentOffset, 0x0C, subBlock.TotalLength - 0x0C);
                }
                else
                {
                    Console.Out.WriteLine("    [E] Invalid subblock size");
                }
                subBlockList.Add(subBlock);

                currentOffset += subBlock.TotalLength;
                blockNum++;
            }

            return (PropertySubBlock[])subBlockList.ToArray(typeof(PropertySubBlock));
        }