Exemplo n.º 1
0
        public override ExternalProcedure SignatureFromName(string fnName)
        {
            StructField_v1 field = null;

            try
            {
                var gcc = new GccMangledNameParser(fnName, this.PointerType.Size);
                field = gcc.Parse();
            }
            catch (Exception ex)
            {
                Debug.Print("*** Error parsing {0}. {1}", fnName, ex.Message);
                return(null);
            }
            if (field == null)
            {
                return(null);
            }
            var sproc = field.Type as SerializedSignature;

            if (sproc != null)
            {
                var loader = new TypeLibraryDeserializer(this, false, Metadata);
                var sser   = this.CreateProcedureSerializer(loader, sproc.Convention);
                var sig    = sser.Deserialize(sproc, this.Architecture.CreateFrame()); //$BUGBUG: catch dupes?
                return(new ExternalProcedure(field.Name, sig)
                {
                    EnclosingType = sproc.EnclosingType
                });
            }
            return(null);
        }
Exemplo n.º 2
0
        public override ProcedureBase_v1 SignatureFromName(string fnName)
        {
            StructField_v1 field = null;

            try
            {
                var gcc = new GccMangledNameParser(fnName, this.PointerType.Size);
                field = gcc.Parse();
            }
            catch (Exception ex)
            {
                Debug.Print("*** Error parsing {0}. {1}", fnName, ex.Message);
                return(null);
            }
            if (field == null)
            {
                return(null);
            }
            if (field.Type is SerializedSignature sproc)
            {
                return(new Procedure_v1
                {
                    Name = field.Name,
                    Signature = sproc,
                });
            }
            return(null);
        }
Exemplo n.º 3
0
        private IEnumerable <StructField_v1> VisitFields(List <Core.Pascal.Field> fields)
        {
            var result = new List <StructField_v1>();

            foreach (var recfield in fields)
            {
                var dt = recfield.Type.Accept(this);
                foreach (string fieldName in recfield.Names)
                {
                    var field = new StructField_v1
                    {
                        Name = fieldName,
                        Type = dt
                    };
                    result.Add(field);
                    //$REVIEW: alignment?
                }
            }
            return(result);
        }
Exemplo n.º 4
0
        private void BuildStructure(Structure st, StructType_v1 str)
        {
            var fieldTypes =
                (object[])dictionary[st.TypeList].Leaves[0];
            var fieldNamesOffsets =
                (object[])dictionary[st.NameOffsetList].Leaves[0];

            if (2 * fieldTypes.Length != fieldNamesOffsets.Length ||
                fieldTypes.Length != st.FieldCount)
            {
                throw new FormatException();
            }
            var fields = new StructField_v1[st.FieldCount];

            for (int i = 0; i < st.FieldCount; ++i)
            {
                var type   = TranslateType(Convert.ToInt32(fieldTypes[i]));
                var name   = (string)fieldNamesOffsets[i * 2];
                var offset = Convert.ToInt32(fieldNamesOffsets[i * 2 + 1]);
                fields[i] = new StructField_v1(offset, name, type);
            }
            str.Fields   = fields;
            str.ByteSize = (st.BitSize + 7) / 8;
        }
Exemplo n.º 5
0
        /// <summary>
        /// Guesses the signature of a procedure based on its name.
        /// </summary>
        /// <param name="fnName"></param>
        /// <param name="loader"></param>
        /// <param name="arch"></param>
        /// <returns></returns>
        public static ExternalProcedure SignatureFromName(string fnName, TypeLibraryDeserializer loader, IPlatform platform)
        {
            int argBytes;

            if (fnName[0] == '_')
            {
                // Win32 prefixes cdecl and stdcall functions with '_'. Stdcalls will have @<nn>
                // where <nn> is the number of bytes pushed on the stack. If 0 bytes are pushed
                // the result is indistinguishable from the corresponding cdecl call, which is OK.
                int lastAt = fnName.LastIndexOf('@');
                if (lastAt < 0)
                {
                    return(CdeclSignature(fnName.Substring(1), platform.Architecture));
                }
                string name = fnName.Substring(1, lastAt - 1);
                if (!Int32.TryParse(fnName.Substring(lastAt + 1), out argBytes))
                {
                    return(CdeclSignature(name, platform.Architecture));
                }
                else
                {
                    return(StdcallSignature(name, argBytes, platform.Architecture));
                }
            }
            else if (fnName[0] == '@')
            {
                // Win32 prefixes fastcall functions with '@'.
                int lastAt = fnName.LastIndexOf('@');
                if (lastAt <= 0)
                {
                    return(CdeclSignature(fnName.Substring(1), platform.Architecture));
                }
                string name = fnName.Substring(1, lastAt - 1);
                if (!Int32.TryParse(fnName.Substring(lastAt + 1), out argBytes))
                {
                    return(CdeclSignature(name, platform.Architecture));
                }
                else
                {
                    return(FastcallSignature(name, argBytes, platform.Architecture));
                }
            }
            else if (fnName[0] == '?')
            {
                // Microsoft-mangled signatures begin with '?'
                var            pmnp  = new MsMangledNameParser(fnName);
                StructField_v1 field = null;
                try
                {
                    field = pmnp.Parse();
                }
                catch (Exception ex)
                {
                    Debug.Print("*** Error parsing {0}. {1}", fnName, ex.Message);
                    return(null);
                }
                var sproc = field.Type as SerializedSignature;
                if (sproc != null)
                {
                    var sser = platform.CreateProcedureSerializer(loader, sproc.Convention);
                    var sig  = sser.Deserialize(sproc, platform.Architecture.CreateFrame());   //$BUGBUG: catch dupes?
                    return(new ExternalProcedure(field.Name, sig)
                    {
                        EnclosingType = sproc.EnclosingType
                    });
                }
            }
            return(null);
        }