示例#1
0
        public void DumpTagLayout(MoonfishTagGroup tag, string folder)
        {
            _definitionsDictionary.Clear();

            var info = BeginProcessTagBlockDefinition(tag.Definition);

            using (var stream = new FileStream(Path.Combine(folder, info.Name + ".cs"), FileMode.Create,
                                               FileAccess.Write, FileShare.ReadWrite))
            {
                var size = tag.Definition.CalculateSizeOfFieldSet();

                var hasParent = h2Tags.Any(x => x.Class == tag.ParentClass);
                if (hasParent)
                {
                    var parentTag = new MoonfishTagGroup(h2Tags.First(x => x.Class == tag.ParentClass));
                    info.BaseClass = new ClassInfo(TokenDictionary.GenerateValidIdentifier(
                                                       ToTypeName(parentTag.Definition.Name)));

                    // loop through all the parents summing up thier sizes
                    while (hasParent)
                    {
                        size     += parentTag.Definition.CalculateSizeOfFieldSet();
                        hasParent = h2Tags.Any(x => x.Class == parentTag.ParentClass);
                        if (hasParent)
                        {
                            parentTag = new MoonfishTagGroup(h2Tags.First(x => x.Class == parentTag.ParentClass));
                        }
                    }
                }
                else
                {
                    info.BaseClass = new ClassInfo("GuerillaBlock");
                }

                var alignment = tag.Definition.Alignment;
                var property  = info.Properties.Single(x => x.Name == "SerializedSize");
                property.GetBody = string.Format("return {0};", size);

                info.Attributes.Add(new AttributeInfo(typeof(TagClassAttribute))
                {
                    Parameters = { "\"" + tag.Class + "\"" }
                });
                var streamWriter = new StreamWriter(stream);
                info.Generate();
                GenerateOutputForClass(info, streamWriter);
            }

            var localDefinitions = _definitionsDictionary.Select(x => x.Value);


            foreach (var item in localDefinitions)
            {
                using (var stream = new FileStream(Path.Combine(folder, item.Name + ".cs"), FileMode.Create,
                                                   FileAccess.Write, FileShare.ReadWrite))
                {
                    item.Generate();
                    GenerateOutputForClass(item, new StreamWriter(stream));
                }
            }
        }
示例#2
0
        private ElementArray CompileElementArray(MoonfishTagGroup tag, IEnumerable <MoonfishTagGroup> tags, int offset)
        {
            ElementArray elementArray;

            if (tag.ParentClass != TagClass.Null)
            {
                var guerillaTagGroups = tags as IList <MoonfishTagGroup> ?? tags.ToList();
                var parentClass       = guerillaTagGroups.Single(x => x.Class == tag.ParentClass);
                if (parentClass.ParentClass != TagClass.Null)
                {
                    var baseClass = guerillaTagGroups.Single(x => x.Class == parentClass.ParentClass);
                    elementArray = ProcessTagBlockDefinition(baseClass.Definition, ref offset, true);
                    elementArray.Append(ProcessTagBlockDefinition(parentClass.Definition, ref offset, true));
                    elementArray.Append(ProcessTagBlockDefinition(tag.Definition, ref offset, true));
                }
                else
                {
                    elementArray = ProcessTagBlockDefinition(parentClass.Definition, ref offset, true);
                    elementArray.Append(ProcessTagBlockDefinition(tag.Definition, ref offset, true));
                }
            }
            else
            {
                elementArray = ProcessTagBlockDefinition(tag.Definition, ref offset, true);
            }
            return(elementArray);
        }
示例#3
0
        public void Validate(TagDatum datum, Stream dataStream)
        {
            error = false;

            _pointersList = new List <Tuple <BlamPointer, ElementArray> >();
            _writeMessage = Console.WriteLine;

            var offset = 0;

            var definition =
                new MoonfishTagGroup(Guerilla.h2Tags.First(x => x.Class == datum.Class));
            var definitionPool = Guerilla.h2Tags.Select(x => new MoonfishTagGroup(x));

            var elementArray = CompileElementArray(definition, definitionPool, offset);

            elementArray.count = 1;

            var binaryReader = new BinaryReader(dataStream);

            var virtualTagMemory = new VirtualMappedAddress
            {
                Address = datum.VirtualAddress,
                Length  = datum.Length
            };

            _isValidDelegate             = virtualTagMemory.Contains;
            _isPointerOwnedByTagDelegate = virtualTagMemory.Contains;

            offset = (int)dataStream.Seek(datum.VirtualAddress, SeekOrigin.Begin);


            elementArray.virtualAddress = datum.VirtualAddress;
            ValidateTagBlock(elementArray, elementArray.ToFixedArrayPointer(), binaryReader, ref offset);

            if (error)
            {
                OnWriteMessage(string.Format("Tag ({0}.{1})", datum.Path, datum.Class.ToTokenString()));
            }
        }
示例#4
0
        public bool Validate(MoonfishTagGroup validateTag, IEnumerable <MoonfishTagGroup> tagPool, string[] filenames)
        {
            error         = false;
            _pointersList = new List <Tuple <BlamPointer, ElementArray> >();
            var filename = string.Format(@"{1}\test_analysis\analysis.txt",
                                         validateTag.Class.ToTokenString(), Local.MapsDirectory);
            var stringWriter = File.AppendText(filename);

            _writeMessage = (stringWriter.WriteLine);

            var offset       = 0;
            var elementArray = CompileElementArray(validateTag, tagPool, offset);

            elementArray.count = 1;

            foreach (var file in filenames)
            {
                using (var map = new CacheStream(file))
                {
                    var binaryReader = new BinaryReader(map);

                    //OnWriteMessage(string.Format("Begin ({0})", map.MapName));

                    foreach (var tag in map.Index)
                    {
                        error = false;
                        if (!(tag.Class == validateTag.Class))
                        {
                            continue;
                        }

                        var metaTableMemory = map.DefaultMemoryBlock;
                        if (tag.Class == (TagClass)"sbsp" || tag.Class == (TagClass)"ltmp")
                        {
                            metaTableMemory =
                                map.StructureMemoryBlocks[map.StructureMemoryBlockBindings[tag.Identifier]];
                            map.ActiveAllocation(StructureCache.VirtualStructureCache0 +
                                                 map.StructureMemoryBlockBindings[tag.Identifier]);
                        }
                        var virtualTagMemory = new VirtualMappedAddress
                        {
                            Address = tag.VirtualAddress,
                            Length  = tag.Length
                        };

                        _isValidDelegate             = metaTableMemory.Contains;
                        _isPointerOwnedByTagDelegate = virtualTagMemory.Contains;
                        _pointersList.Clear();

                        offset = (int)map.Seek(tag.Identifier);


                        elementArray.virtualAddress = map.Index[tag.Identifier].VirtualAddress;
                        ValidateTagBlock(elementArray, elementArray.ToFixedArrayPointer(), binaryReader, ref offset);

                        if (error)
                        {
                            OnWriteMessage(string.Format("Tag ({0}.{1})", tag.Path, validateTag.Class.ToTokenString()));
                        }

                        stringWriter.Flush();
                    }

                    Console.WriteLine(@"Parsed ({0})", map.Header.Name);
                }
            }
            stringWriter.Close();


            return(error);
        }