Ejemplo n.º 1
0
        public List <SearchVariable> parseVariables(PcmFile PCM)
        {
            List <SearchVariable> searchVariables = new List <SearchVariable>();

            string[] varlist = Variables.Split(',');
            for (int v = 0; v < varlist.Length; v++)
            {
                string[] varParts = varlist[v].Split('=');
                if (varParts.Length < 2)
                {
                    Debug.WriteLine("Unknown variable: " + varlist[v]);
                }
                else
                {
                    if (varParts[1].StartsWith("@"))
                    {
                        SearchVariable SV = new SearchVariable();
                        SV.Name = varParts[0].Trim();
                        uint     location;
                        int      bytes;
                        string[] svDataParts = varParts[1].Split(':');

                        if (!HexToUint(svDataParts[0].Replace("@", ""), out location))
                        {
                            throw new Exception("Can't decode variable location: " + varlist[v]);
                        }
                        if (!HexToInt(svDataParts[1].Replace("@", ""), out bytes))
                        {
                            throw new Exception("Can't decode variable size: " + varlist[v]);
                        }

                        for (int i = 0; i < bytes; i++)
                        {
                            SV.Data += PCM.buf[location + i].ToString("X2") + " ";
                        }
                        SV.Data = SV.Data.Trim();
                        searchVariables.Add(SV);
                        Debug.WriteLine("New variable: " + SV.Name + "=" + SV.Data);
                    }
                    else
                    {
                        string[] svDataParts = varParts[1].Split(';');
                        foreach (string svDataPart in svDataParts)
                        {
                            SearchVariable SV = new SearchVariable();
                            SV.Name = varParts[0].Trim();;
                            SV.Data = svDataPart.Trim();
                            searchVariables.Add(SV);
                            Debug.WriteLine("New variable: " + SV.Name + "=" + SV.Data);
                        }
                    }
                }
            }
            return(searchVariables);
        }
Ejemplo n.º 2
0
        private TableSearchResult parseMatch(PcmFile PCM, TableSearchConfig.ParsedTableSearchConfig parsedConfig, TableSearchConfig tableSearchConfig, uint addr)
        {
            TableSearchResult tsr = new TableSearchResult();

            tsr.OS     = PCM.OS;
            tsr.File   = PCM.FileName;
            tsr.Search = parsedConfig.searchString;
            tsr.Name   = tableSearchConfig.Name;
            tsr.Found  = addr.ToString("X8") + ":";
            for (uint t = 0; t < parsedConfig.searchParts.Count; t++)
            {
                if (t > 0)
                {
                    tsr.Found += " ";
                }
                tsr.Found += PCM.buf[addr + t].ToString("X2");
            }
            if (tableSearchConfig.Items.Length > 0)
            {
                string[] items = tableSearchConfig.Items.Split(',');
                for (int p = 0; p < items.Length; p++)
                {
                    string[] itemParts = items[p].Split(':');
                    uint     location  = (uint)(addr + int.Parse(itemParts[1]));
                    if (itemParts.Length == 3)
                    {
                        SearchVariable SV = new SearchVariable();
                        SV.Name = itemParts[0];
                        if (itemParts[2].ToLower() == "e")
                        {
                            location += (uint)parsedConfig.searchParts.Count;
                        }
                        tsr.AddressInt = location;
                        tsr.Data       = SV.Name;
                        SV.Data        = ((location & 0xFF000000) >> 24).ToString("X2") + " " + ((location & 0xFF0000) >> 16).ToString("X2") + " " + ((location & 0xFF00) >> 8).ToString("X2") + " " + (location & 0xFF).ToString("X2");
                        searchVariables.Add(SV);
                    }
                    else
                    {
                        if (itemParts.Length != 4)
                        {
                            throw new Exception("item needs 4 parts: name:location:bytes:type, for example: rows:1:2:int");
                        }

                        if (itemParts[0].StartsWith("@"))
                        {
                            tsr.AddressInt = BEToUint32(PCM.buf, location);
                        }
                        if (tsr.Data != null && tsr.Data.Length > 1)
                        {
                            tsr.Data += "; ";
                        }
                        tsr.Data += itemParts[0] + ":";   //Item name

                        string formatString = "";
                        if (itemParts[3].ToLower() == "hex")
                        {
                            formatString = "X";
                        }
                        if (itemParts[2] == "1")
                        {
                            tsr.Data += PCM.buf[location].ToString(formatString);
                        }
                        if (itemParts[2] == "2")
                        {
                            tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString);
                        }
                        if (itemParts[2] == "4")
                        {
                            tsr.Data += BEToUint32(PCM.buf, location).ToString(formatString);
                        }
                        if (itemParts[2] == "8")
                        {
                            tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString);
                        }
                    }
                    for (int seg = 0; seg < Segments.Count; seg++)
                    {
                        for (int b = 0; b < PCM.binfile[seg].SegmentBlocks.Count; b++)
                        {
                            if (tsr.AddressInt >= PCM.binfile[seg].SegmentBlocks[b].Start && tsr.AddressInt <= PCM.binfile[seg].SegmentBlocks[b].End)
                            {
                                tsr.Segment = PCM.segmentinfos[seg].Name;
                            }
                        }
                    }
                }
            }
            if (parsedConfig.searchString.Contains(":"))
            {
                int k = 0;
                while (k < parsedConfig.searchParts.Count)
                {
                    if (parsedConfig.searchParts[k].Contains(":"))
                    {
                        string[] varParts = parsedConfig.searchParts[k].Split(':');
                        if (varParts.Length == 2)
                        {
                            //Set variable
                            SearchVariable SV = new SearchVariable();
                            SV.Name   = varParts[0];
                            tsr.Data += SV.Name;
                            int  bytes    = int.Parse(varParts[1]);
                            uint location = (uint)(addr + k);
                            tsr.AddressInt = location;
                            for (uint l = 0; l < bytes; l++)
                            {
                                SV.Data += PCM.buf[location + l].ToString("X2") + " ";
                            }
                            SV.Data = SV.Data.Trim();
                            searchVariables.Add(SV);
                        }
                        else
                        {
                            //Its's item, show it.
                            uint location = (uint)(addr + k);
                            if (varParts[0].ToLower().StartsWith("@"))
                            {
                                tsr.AddressInt = BEToUint32(PCM.buf, location);
                            }
                            if (varParts[0].ToLower().StartsWith("row"))
                            {
                                tsr.Rows = PCM.buf[location];
                            }
                            if (tsr.Data != null && tsr.Data.Length > 1)
                            {
                                tsr.Data += "; ";
                            }
                            tsr.Data += varParts[0] + ":";
                            string formatString = "";
                            if (varParts[2].ToLower() == "hex")
                            {
                                formatString = "X";
                            }
                            if (varParts[1] == "1")
                            {
                                tsr.Data += PCM.buf[location].ToString(formatString);
                            }
                            if (varParts[1] == "2")
                            {
                                tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString);
                            }
                            if (varParts[1] == "4")
                            {
                                tsr.Data += BEToUint32(PCM.buf, location).ToString(formatString);
                            }
                            if (varParts[1] == "8")
                            {
                                tsr.Data += BEToUint64(PCM.buf, location).ToString(formatString);
                            }
                        }
                        for (int seg = 0; seg < Segments.Count; seg++)
                        {
                            for (int b = 0; b < PCM.binfile[seg].SegmentBlocks.Count; b++)
                            {
                                if (tsr.AddressInt >= PCM.binfile[seg].SegmentBlocks[b].Start && tsr.AddressInt <= PCM.binfile[seg].SegmentBlocks[b].End)
                                {
                                    tsr.Segment = PCM.segmentinfos[seg].Name;
                                }
                            }
                        }
                        k += int.Parse(varParts[1]) - 1;
                    }
                    k++;
                }
            }
            for (int o = 0; o < PCM.osaAddressList.Count; o++)
            {
                if (PCM.osaAddressList[o].address == tsr.AddressInt)
                {
                    tsr.Category = PCM.osaAddressList[o].category;
                    tsr.Label    = PCM.osaAddressList[o].label;
                    tsr.Size     = PCM.osaAddressList[o].size;
                    break;
                }
            }

            TableSearchResult tsrNoFilter = new TableSearchResult();

            tsrNoFilter.AddressInt = tsr.AddressInt;
            tsrNoFilter.Address    = tsr.AddressInt.ToString("X8");
            tsrNoFilter.Data       = tsr.Data;
            tsrNoFilter.File       = tsr.File;
            tsrNoFilter.Found      = tsr.Found;
            tsrNoFilter.hitCount   = 1;
            tsrNoFilter.Name       = tsr.Name;
            tsrNoFilter.OS         = tsr.OS;
            tsrNoFilter.Search     = tsr.Search;
            tsrNoFilter.Segment    = tsr.Segment;

            tableSearchResultNoFilters.Add(tsrNoFilter);
            return(tsr);
        }