Пример #1
0
        public void Usb_ParseFunctionDeclaration_UserDefinedTypes()
        {
            program.EnvironmentMetadata.Types.Add(
                "BYTE", PrimitiveType.Create(PrimitiveType.Byte.Domain, 8));

            Given_Procedure(0x1000);

            var usb = new UserSignatureBuilder(program);

            //should accept user defined type USRDEF1
            program.EnvironmentMetadata.Types.Add(
                "USRDEF1", PrimitiveType.Create(PrimitiveType.Int16.Domain, 16));

            var sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, BYTE b)");

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,USRDEF1),arg(b,BYTE)))",
                sProc.Signature.ToString());

            //should not accept undefined type USRDEF2
            sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, USRDEF2 b)");
            Assert.AreEqual(null, sProc);

            //define USRDEF2 so parser should accept it

            program.EnvironmentMetadata.Types.Add(
                "USRDEF2", PrimitiveType.Create(PrimitiveType.Int16.Domain, 16));

            sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, USRDEF2 b)");

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,USRDEF1),arg(b,USRDEF2)))",
                sProc.Signature.ToString());
        }
        protected void Signature_TextChanged(object sender, EventArgs e)
        {
            // Attempt to parse the signature.
            var CSignature         = dlg.Signature.Text.Trim();
            ProcedureBase_v1 sProc = null;
            bool             isValid;

            if (!string.IsNullOrEmpty(CSignature))
            {
                var usb = new UserSignatureBuilder(program);
                sProc   = usb.ParseFunctionDeclaration(CSignature);
                isValid = (sProc != null);
            }
            else
            {
                CSignature = null;
                isValid    = true;
            }
            EnableControls(isValid);
            if (isValid)
            {
                if (sProc != null)
                {
                    dlg.ProcedureName.Text = sProc.Name;
                }
                EnableProcedureName();
            }
        }
Пример #3
0
        private bool TryGetNoDecompiledProcedure(Address addr, out ExternalProcedure ep)
        {
            Procedure_v1 sProc;

            if (!program.User.Procedures.TryGetValue(addr, out sProc) ||
                sProc.Decompile)
            {
                ep = null;
                return(false);
            }

            ProcedureSignature sig = null;

            if (!string.IsNullOrEmpty(sProc.CSignature))
            {
                var usb      = new UserSignatureBuilder(program);
                var procDecl = usb.ParseFunctionDeclaration(sProc.CSignature);
                if (procDecl != null)
                {
                    var ser = program.CreateProcedureSerializer();
                    sig = ser.Deserialize(
                        procDecl.Signature,
                        program.Architecture.CreateFrame());
                }
            }
            else
            {
                Warn(addr, "The user-defined procedure at address {0} did not have a signature.", addr);
            }

            ep = new ExternalProcedure(sProc.Name, sig);
            return(true);
        }
Пример #4
0
        private bool TryGetNoDecompiledParsedProcedure(Address addr, out Procedure_v1 parsedProc)
        {
            if (!TryGetNoDecompiledProcedure(addr, out Procedure_v1 sProc))
            {
                parsedProc = null;
                return(false);
            }
            if (noDecompiledProcs.TryGetValue(addr, out parsedProc))
            {
                return(true);
            }
            parsedProc = new Procedure_v1()
            {
                Name = sProc.Name,
            };
            noDecompiledProcs[addr] = parsedProc;
            if (string.IsNullOrEmpty(sProc.CSignature))
            {
                Warn(addr, "The user-defined procedure at address {0} did not have a signature.", addr);
                return(true);
            }
            var usb      = new UserSignatureBuilder(Program);
            var procDecl = usb.ParseFunctionDeclaration(sProc.CSignature);

            if (procDecl == null)
            {
                Warn(addr, "The user-defined procedure signature at address {0} could not be parsed.", addr);
                return(true);
            }
            parsedProc.Signature = procDecl.Signature;
            return(true);
        }
Пример #5
0
        public void SetUserProcedure(ulong linearAddress, string decl)
        {
            var    addr = Addr(linearAddress);
            string name;
            string?CSignature;

            if (UserSignatureBuilder.IsValidCIdentifier(decl))
            {
                name       = decl;
                CSignature = null;
            }
            else
            {
                var usb   = new UserSignatureBuilder(program);
                var sProc = usb.ParseFunctionDeclaration(decl);
                if (sProc is null || sProc.Name is null)
                {
                    throw new ArgumentException(
                              $"Failed to parse procedure declaration: '{decl}'");
                }
                name       = sProc.Name;
                CSignature = decl;
            }
            program.User.Procedures[addr] = new UserProcedure(addr, name)
            {
                CSignature = CSignature,
            };
            if (program.Procedures.TryGetValue(addr, out var proc))
            {
                proc.Name = name;
            }
        }
Пример #6
0
        public void Usb_ParseFunctionDeclaration()
        {
            Given_Procedure(0x1000);

            var usb   = new UserSignatureBuilder(program);
            var sProc = usb.ParseFunctionDeclaration("int foo(char *)");

            Assert.AreEqual(
                "fn(arg(prim(SignedInt,4)),(arg(ptr(prim(Character,1)))))",
                sProc.Signature.ToString());
        }
Пример #7
0
        private bool TryParseSignature(string txtSignature, out ProcedureBase_v1 sProc)
        {
            sProc = null;
            if (program == null || program.Platform == null)
            {
                return(false);
            }

            // Attempt to parse the signature.
            var usb = new UserSignatureBuilder(program);

            sProc = usb.ParseFunctionDeclaration(txtSignature);
            return(sProc != null);
        }
Пример #8
0
        public void Usb_ParseFunctionDeclaration_PlatfromTypes()
        {
            program.EnvironmentMetadata.Types.Add(
                "BYTE",
                PrimitiveType.Create(PrimitiveType.Byte.Domain, 8));
            Given_Procedure(0x1000);

            var usb   = new UserSignatureBuilder(program);
            var sProc = usb.ParseFunctionDeclaration("BYTE foo(BYTE a, BYTE b)");

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,BYTE),arg(b,BYTE)))",
                sProc.Signature.ToString());
        }