Ejemplo n.º 1
0
        public Directory(int nodeIndex, string name)
        {
            entries   = new List <Entry>();
            this.name = name;
            this.node = nodeIndex;
            this.time = MemoryInterface.getInstance().getInodeByIndex(nodeIndex).getTime();
            int nodeTableBlock = MemoryInterface.getInstance().getInodeByIndex(nodeIndex).getBlock(0);

            for (int i = 2; ; i++)
            {
                string _name = MemoryInterface.getInstance().getDataBlockByIndex(nodeTableBlock).findInode(i);
                if (_name == null)
                {
                    break;
                }

                inode _node = MemoryInterface.getInstance().getInodeByIndex(MemoryInterface.getInstance().getInodeIndexByName(nodeIndex, _name));


                if (_node.getType().Equals("文件"))
                {
                    File file = new File(_node, _name);
                    entries.Add(file);
                }
                else
                {
                    Directory dir = new Directory(_node.id, _name);
                    entries.Add(dir);
                }
            }
        }
Ejemplo n.º 2
0
        private void lbLoadedVmdList_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lbLoadedVmdList.SelectedItem == null)
            {
                return;
            }

            string          vmdName = lbLoadedVmdList.SelectedItem.ToString();
            MemoryInterface mi      = MemoryDomains.VmdPool[vmdName];

            lbVmdSizeValue.Text = mi.Size.ToString() + " (0x" + mi.Size.ToString("X") + ")";

            var vmd = (mi as VirtualMemoryDomain);

            if (vmd.Compacted)
            {
                lbRealDomainValue.Text = (vmd.CompactPointerDomains.Length > 1 ? "Hybrid" : vmd.CompactPointerDomains.First());
            }
            else
            {
                if (vmd.PointerDomains.Distinct().Count() > 1)
                {
                    lbRealDomainValue.Text = "Hybrid";
                }
                else
                {
                    lbRealDomainValue.Text = vmd.PointerDomains.FirstOrDefault();
                }
            }
        }
Ejemplo n.º 3
0
        internal void AutoProfile(MemoryInterface mi, string limiter)
        {
            btnLoadDomains_Click(null, null);

            var ceForm = S.GET <RTC_CorruptionEngine_Form>();

            foreach (var item in cbSelectedMemoryDomain.Items)
            {
                if (item.ToString() == mi.ToString())
                {
                    cbSelectedMemoryDomain.SelectedItem = item;
                    break;
                }
            }

            foreach (ComboBoxItem <string> item in ceForm.cbVectorLimiterList.Items)
            {
                if (item.Name == limiter)
                {
                    ceForm.cbVectorLimiterList.SelectedItem = item;
                    break;
                }
            }

            ComboBoxItem <string> cbItem = (ComboBoxItem <string>)((ComboBox)ceForm.cbVectorLimiterList).SelectedItem;

            if (cbItem != null)
            {
                LimiterListHash = cbItem.Value;
            }

            tbVmdName.Text = $"{mi} -- {limiter}";

            GenerateVMD(true);
        }
Ejemplo n.º 4
0
        private void updateInterface()
        {
            MemoryInterface mi = MemoryDomains.MemoryInterfaces[cbSelectedMemoryDomain.SelectedItem.ToString()];

            long fullRange = mi.Size;

            if (mtbStartAddress.Value > fullRange)
            {
                mtbStartAddress.Value = fullRange;
            }

            if (mtbStartAddress.Maximum != fullRange)
            {
                mtbStartAddress.Maximum = fullRange;
            }

            if (mtbRange.Maximum != fullRange)
            {
                mtbRange.Maximum = fullRange;
            }

            mtbStartAddress.Enabled = true;
            mtbRange.Enabled        = true;
            btnGenerateVMD.Enabled  = true;
        }
Ejemplo n.º 5
0
        private void remove(ref CompoundCmd cmd, string name, int parent)
        {
            inode _node = MemoryInterface.getInstance().getInodeByIndex(parent);

            cmd.newOpe(new EditCmd(parent));
            int id = MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(0)).removeInode(name);      //找到删除文件的inode

            _node = MemoryInterface.getInstance().getInodeByIndex(id);
            cmd.newOpe(new DeleteCmd(id));

            if (_node.getType().Equals("文件夹"))
            {
                for (int i = 0; ; i++)       //释放inodetable中信息
                {
                    string _name = MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(0)).findInode(2);

                    if (_name != null)
                    {
                        remove(ref cmd, _name, id);
                    }
                    else
                    {
                        break;
                    }
                }
            }

            List <int> b = _node.getBlockPtr().ToList <int>();  //获得该节点占用的全部块

            MemoryInterface.getInstance().releaseBlock(b);      //释放块位图
            MemoryInterface.getInstance().releaseInode(id);     //释放节点位图
        }
Ejemplo n.º 6
0
        public static BlastUnit GenerateUnit(string domain, long address, int precision, int alignment)
        {
            // Randomly selects a memory operation according to the selected algorithm

            if (domain == null)
            {
                return(null);
            }
            BlastTarget     pipeStart = RtcCore.GetBlastTarget();
            MemoryInterface mi        = MemoryDomains.GetInterface(domain);
            MemoryInterface startmi   = MemoryDomains.GetInterface(pipeStart.Domain);

            long safeAddress = address - (address % precision) + alignment;

            long safePipeStartAddress = pipeStart.Address - (pipeStart.Address % precision) + alignment;

            if (safeAddress > mi.Size - precision && mi.Size > precision)
            {
                safeAddress = mi.Size - (2 * precision) + alignment; //If we're out of range, hit the last aligned address
            }
            if (safePipeStartAddress > startmi.Size - precision && startmi.Size > precision)
            {
                safePipeStartAddress = startmi.Size - (2 * precision) + alignment;                 //If we're out of range, hit the last aligned address
            }
            return(new BlastUnit(StoreType.CONTINUOUS, StoreTime.PREEXECUTE, domain, safeAddress, pipeStart.Domain, safePipeStartAddress, precision, mi.BigEndian, 0, 0));
        }
Ejemplo n.º 7
0
        public override bool write(string content)
        {
            this.content = content;
            int num = MemoryInterface.getInstance().getInodeByIndex(node).getBlockNum();       //获取文件已有磁盘块数目

            byte[] buffer = Encoding.Default.GetBytes(content);

            int n      = buffer.Length / 100;   //计算所需磁盘块
            int offset = buffer.Length % 100;

            if (n > 13)
            {
                return(false);
            }

            List <int> mem;

            if (offset > 0)
            {
                mem = MemoryInterface.getInstance().getRequireBlocks(n + 1 - num);
            }
            else
            {
                mem = MemoryInterface.getInstance().getRequireBlocks(n - num);
            }

            if (mem == null && n - num > 0)      //需要新块但找不到空的磁盘块
            {
                return(false);
            }

            for (int i = 0; i <= n; i++)
            {
                string con;
                if (i < n)
                {
                    con = Encoding.Default.GetString(buffer, 100 * i, 100);
                }
                else
                {
                    con = Encoding.Default.GetString(buffer, 100 * i, offset);
                }
                if (MemoryInterface.getInstance().getInodeByIndex(node).getBlock(i) == 0)
                {
                    MemoryInterface.getInstance().getInodeByIndex(node).setBlock(mem[0], i);   //为文件分配新的磁盘块
                    MemoryInterface.getInstance().getDataBlockByIndex(mem[0]).data = con;      //存储信息
                    mem.RemoveAt(0);
                }
                else
                {
                    MemoryInterface.getInstance().getDataBlockByIndex(MemoryInterface.getInstance().getInodeByIndex(node).getBlock(i)).data = con;
                }
            }

            MemoryInterface.getInstance().getInodeByIndex(node).setTime(DateTime.Now);
            MemoryInterface.getInstance().write();
            this.size = calculate(MemoryInterface.getInstance().getInodeByIndex(node));
            return(true);
        }
Ejemplo n.º 8
0
        private void updateInterface()
        {
            MemoryInterface mi = MemoryDomains.MemoryInterfaces[cbSelectedMemoryDomain.SelectedItem.ToString()];

            long fullRange = mi.Size;

            btnGenerateVMD.Enabled = true;
        }
Ejemplo n.º 9
0
        public override void undo()
        {
            base.undo();
            MemoryInterface.getInstance().setInodeByIndex(node.id, node);
            List <int> temp = new List <int>();

            MemoryInterface.getInstance().setDataBlockByIndex(node.getBlockPtr().ToList <int>(), list);
        }
Ejemplo n.º 10
0
        public override void redo()
        {
            base.redo();
            MemoryInterface.getInstance().releaseInode(node.id);
            List <int> temp = new List <int>();

            MemoryInterface.getInstance().releaseBlock(node.getBlockPtr().ToList <int>());
        }
Ejemplo n.º 11
0
        public override void removeEntry(int selectedItem, string name)
        {
            entries.RemoveAt(selectedItem);
            CompoundCmd cmd = new CompoundCmd();

            remove(ref cmd, name, node);
            UndoManager.getInstance().newOpe(cmd);
            MemoryInterface.getInstance().write();
        }
Ejemplo n.º 12
0
        public override void reNameEntry(string newName, int _index)
        {
            inode _node = MemoryInterface.getInstance().getInodeByIndex(node);

            UndoManager.getInstance().newOpe(new EditCmd(node));
            string oldName = MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(0)).reNameInode(newName, _index + 2);      //在父目录的inodetable中进行修改

            entries[_index].name = newName;
            MemoryInterface.getInstance().write();
        }
Ejemplo n.º 13
0
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            //Show/Hide MemoryDesktop control
            //this.Visible = !this.Visible;

            //Toggle next one
            this.timer1.Stop();
            this.label1.Text = MemoryInterface.GetMemoryString(appPrefix);
            this.timer1.Start();
        }
Ejemplo n.º 14
0
        private void toolStripMenuItem4_Click(object sender, EventArgs e)
        {
            //3
            int   gradeValue = 3;
            float prevGradeValue = 0.0f, currentGradeValue = 0.0f;

            ConfigurationFile.GradeLatestMemoryString(gradeValue, out prevGradeValue, out currentGradeValue, appPrefix);

            this.label1.Text = MemoryInterface.GetMemoryString(appPrefix);
        }
Ejemplo n.º 15
0
        private void toolStripMenuItem5_Click(object sender, EventArgs e)
        {
            //2
            int   gradeValue = 2;
            float prevGradeValue = 0.0f, currentGradeValue = 0.0f;

            ConfigurationFile.GradeLatestMemoryString(gradeValue, out prevGradeValue, out currentGradeValue, appPrefix);
            MessageBox.Show("previous grade: " + prevGradeValue + " current grade:" + currentGradeValue);

            this.label1.Text = MemoryInterface.GetMemoryString(appPrefix);
        }
Ejemplo n.º 16
0
        public static BlastUnit GenerateUnit(string _domain, long _address)
        {
            long safeAddress;

            // Randomly seleclong safeAddress ts a memory operation according to the selected algorithm
            if (vectorAligned)
            {
                safeAddress = (_address - ((_address % 4)) + vectorOffset);
            }
            else
            {
                safeAddress = (_address + vectorOffset);
            }


            MemoryInterface mi = WGH_Core.currentMemoryInterface;

            //MemoryDomainProxy md = RTC_MemoryDomains.getProxyFromString(_domain);

            if (mi == null)
            {
                return(null);
            }

            //Don't peek out of range
            if (safeAddress + 4 > mi.lastMemorySize)
            {
                return(null);
            }

            try
            {
                BlastVector bv = null;

                lastValues = read32bits(mi, safeAddress);
                lastDomain = _domain;


                if (isConstant(lastValues, limiterList))
                {
                    bv = new BlastVector(_domain, _address, getRandomConstant(valueList), true);
                }

                return(bv);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Something went wrong in the RTC Vector Engine. \n" +
                                "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" +
                                ex.ToString());
                return(null);
            }
        }
Ejemplo n.º 17
0
        private string initDir(List <int> blocks, int parent, int current)
        {
            string name = "新建文件夹";

            name = MemoryInterface.getInstance().addNewInodeTableItem(MemoryInterface.getInstance().getInodeByIndex(parent).getBlock(0), name, current);

            MemoryInterface.getInstance().addNewInodeTableItem(blocks[0], "..", parent);
            MemoryInterface.getInstance().addNewInodeTableItem(blocks[0], ".", current);

            MemoryInterface.getInstance().getInodeByIndex(current).init(current, blocks, "文件夹", DateTime.Now);
            return(name);
        }
Ejemplo n.º 18
0
 public EditCmd(int node_index) : base(node_index)
 {
     new_data = new List <dataBlock>();
     for (int i = 0; i < 13; i++)
     {
         if (node.getBlock(i) == 0)
         {
             break;
         }
         new_data.Add(MemoryInterface.getInstance().getDataBlockByIndex(node.getBlock(i)));
     }
 }
Ejemplo n.º 19
0
        private void btnActiveTableDumpsReset_Click(object sender, EventArgs e)
        {
            ActLoadedFromFile = false;

            if (!FirstInit)
            {
                FirstInit = true;
                btnActiveTableDumpsReset.Text      = "Reset";
                btnActiveTableDumpsReset.ForeColor = Color.Black;

                btnActiveTableAddDump.Font      = new Font("Segoe UI Semibold", 8);
                btnActiveTableGenerate.Enabled  = true;
                btnActiveTableAddDump.Enabled   = true;
                btnActiveTableLoad.Enabled      = true;
                btnActiveTableQuickSave.Enabled = true;
                cbAutoAddDump.Enabled           = true;
            }
            MemoryInterface mi = MemoryDomains.GetInterface(cbSelectedMemoryDomain.SelectedItem.ToString());

            if (mi == null)
            {
                MessageBox.Show("The currently selected domain doesn't exist!\nMake sure you have the correct core loaded and have refreshed the domains.");
                return;
            }
            decimal memoryDomainSize = mi.Size;

            //Verify they want to continue if the domain size is larger than 32MB
            if (memoryDomainSize > 0x2000000)
            {
                DialogResult result = MessageBox.Show("The domain you have selected is larger than 32MB\n The domain size is " + (memoryDomainSize / (1024 * 1024)) + "MB.\n Are you sure you want to continue?", "Large Domain Detected", MessageBoxButtons.YesNo);
                if (result == DialogResult.No)
                {
                    return;
                }
            }

            lbDomainAddressSize.Text   = "Domain size: 0x" + mi.Size.ToString("X");
            lbFreezeEngineNbDumps.Text = "Memory dumps collected: 0";
            lbActiveTableSize.Text     = "Active table size: 0x0";
            ActiveTableReady           = false;

            ActiveTableGenerated = null;

            ActiveTableDumps = new List <string>();

            foreach (string file in Directory.GetFiles(Path.Combine(CorruptCore.RtcCore.workingDir, "MEMORYDUMPS")))
            {
                File.Delete(file);
            }

            currentFilename = null;
        }
Ejemplo n.º 20
0
        public static void OpenAnalyticsTool(MemoryInterface mi, List <string> memoryDumpPaths)
        {
            S.GET <RTC_AnalyticsTool_Form>().Close();
            var stf = new RTC_AnalyticsTool_Form();

            S.SET(stf);

            stf.MemoryInterface  = mi;
            stf.ActiveTableDumps = memoryDumpPaths;

            stf.DumpSource.Clear();

            foreach (var dump in memoryDumpPaths)
            {
                var fi = new FileInfo(dump);
                stf.DumpSource.Add(new {
                    key   = fi.Name,
                    value = fi.FullName
                });
            }

            stf.lbDumps.DataSource = null;
            stf.lbDumps.DataSource = stf.DumpSource;

            stf.btnSelectAllDumps_Click(null, null);

            stf.lbDomainSize.Text = $"Domain size: {mi.Size}";

            stf.WordSize = mi.WordSize;
            switch (mi.WordSize)
            {
            default:
            case 1:
                stf.cbWordSize.SelectedIndex = 0;
                break;

            case 2:
                stf.cbWordSize.SelectedIndex = 1;
                break;

            case 4:
                stf.cbWordSize.SelectedIndex = 2;
                break;

            case 8:
                stf.cbWordSize.SelectedIndex = 3;
                break;
            }

            stf.Show();
        }
Ejemplo n.º 21
0
        public object OnMessageReceived(object sender, NetCoreEventArgs e)
        {
            //Use setReturnValue to handle returns
            var message         = e.message;
            var advancedMessage = message as NetCoreAdvancedMessage;

            switch (e.message.Type)
            {
            case NetcoreCommands.REMOTE_OPENHEXEDITOR:
            {
                SyncObjectSingleton.FormExecute(() =>
                    {
                        if (S.GET <HexEditor>().IsDisposed)
                        {
                            S.SET(new HexEditor());
                        }
                        S.GET <HexEditor>().Restart();
                        S.GET <HexEditor>().Show();
                    });
            }
            break;

            case NetcoreCommands.EMU_OPEN_HEXEDITOR_ADDRESS:
            {
                var    temp    = advancedMessage.objectValue as object[];
                string domain  = (string)temp[0];
                long   address = (long)temp[1];

                MemoryInterface mi = MemoryDomains.GetInterface(domain);
                if (mi == null)
                {
                    break;
                }

                SyncObjectSingleton.FormExecute(() =>
                    {
                        if (S.GET <HexEditor>().IsDisposed)
                        {
                            S.SET(new HexEditor());
                        }
                        S.GET <HexEditor>().Restart();
                        S.GET <HexEditor>().Show();
                        S.GET <HexEditor>().SetDomain(mi);
                        S.GET <HexEditor>().GoToAddress(address);
                    });
            }
            break;
            }
            return(e.returnMessage);
        }
Ejemplo n.º 22
0
        private void lbLoadedVmdList_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnSendToMyVMDs.Enabled = false;
            btnSaveVmd.Enabled      = false;
            btnRenameVmd.Enabled    = false;
            btnUnloadVmd.Enabled    = false;


            if (lbLoadedVmdList.SelectedItem == null)
            {
                return;
            }


            if (lbLoadedVmdList.SelectedItems.Count == 1)
            {
                btnSaveVmd.Enabled   = true;
                btnRenameVmd.Enabled = true;
            }

            btnSendToMyVMDs.Enabled = true;
            btnUnloadVmd.Enabled    = true;

            string          vmdName = lbLoadedVmdList.SelectedItem.ToString();
            MemoryInterface mi      = MemoryDomains.VmdPool[vmdName];

            lbVmdSizeValue.Text = mi.Size.ToString() + " (0x" + mi.Size.ToString("X") + ")";

            var vmd = (mi as VirtualMemoryDomain);

            if (vmd.Compacted)
            {
                lbRealDomainValue.Text = (vmd.CompactPointerDomains.Length > 1 ? "Hybrid" : vmd.CompactPointerDomains.First());
            }
            else
            {
                if (vmd.PointerDomains.Distinct().Count() > 1)
                {
                    lbRealDomainValue.Text = "Hybrid";
                }
                else
                {
                    lbRealDomainValue.Text = vmd.PointerDomains.FirstOrDefault();
                }
            }

            //display proto here

            tbVmdPrototype.Text = DisplayVMD(vmd);
        }
Ejemplo n.º 23
0
        public bool ComputeActiveTableActivity()
        {
            if (ActiveTableDumps == null || ActiveTableDumps.Count < 2)
            {
                MessageBox.Show("Not enough dumps for generation");
                return(false);
            }

            List <long> newActiveTableActivity = new List <long>();

            MemoryInterface mi = MemoryDomains.GetInterface(cbSelectedMemoryDomain.SelectedItem.ToString());

            if (mi == null)
            {
                MessageBox.Show("The currently selected domain doesn't exist!\nMake sure you have the correct core loaded and you've refreshed the domains.");
                return(false);
            }

            long domainSize = MemoryDomains.GetInterface(cbSelectedMemoryDomain.SelectedItem.ToString()).Size;

            for (long i = 0; i < domainSize; i++)
            {
                newActiveTableActivity.Add(0);
            }

            ActiveTableActivity = newActiveTableActivity.ToArray();

            byte[] lastDump = null;

            for (int i = 0; i < ActiveTableDumps.Count; i++)
            {
                if (i == 0)
                {
                    lastDump = GetDumpFromFile(ActiveTableDumps[i]);
                    continue;
                }

                byte[] currentDump = GetDumpFromFile(ActiveTableDumps[i]);

                for (int j = 0; j < ActiveTableActivity.Length; j++)
                {
                    if (lastDump[j] != currentDump[j])
                    {
                        ActiveTableActivity[j]++;
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 24
0
        public static BlastUnit GenerateUnit(string domain, long address, int precision, int alignment)
        {
            if (domain == null)
            {
                return(null);
            }
            MemoryInterface mi          = MemoryDomains.GetInterface(domain);
            long            safeAddress = address - (address % precision) + alignment;

            if (safeAddress > mi.Size - precision && mi.Size > precision)
            {
                safeAddress = mi.Size - (2 * precision) + alignment; //If we're out of range, hit the last aligned address
            }
            return(new BlastUnit(StoreType.ONCE, StoreTime.PREEXECUTE, domain, safeAddress, domain, safeAddress, precision, mi.BigEndian, 0, 0));
        }
Ejemplo n.º 25
0
        public Cmd(int node_index)
        {
            inode node = MemoryInterface.getInstance().getInodeByIndex(node_index);

            this.node = (inode)node.Clone();
            this.list = new List <dataBlock>();
            for (int i = 0; i < 13; i++)
            {
                if (node.getBlock(i) == 0)
                {
                    break;
                }
                list.Add((dataBlock)MemoryInterface.getInstance().getDataBlockByIndex(node.getBlock(i)).Clone());
            }
        }
Ejemplo n.º 26
0
        private void cbSelectedMemoryDomain_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(cbSelectedMemoryDomain.SelectedItem?.ToString()) || !MemoryDomains.MemoryInterfaces.ContainsKey(cbSelectedMemoryDomain.SelectedItem.ToString()))
            {
                cbSelectedMemoryDomain.Items.Clear();
                return;
            }

            MemoryInterface mi = MemoryDomains.MemoryInterfaces[cbSelectedMemoryDomain.SelectedItem.ToString()];

            lbDomainSizeValue.Text = "0x" + mi.Size.ToString("X");
            lbWordSizeValue.Text   = $"{mi.WordSize * 8} bits";
            lbEndianTypeValue.Text = (mi.BigEndian ? "Big" : "Little");

            currentDomainSize = Convert.ToInt64(mi.Size);
        }
Ejemplo n.º 27
0
        public override string createEntry(string _name, string type)
        {
            int         parent = -1;
            UndoableCmd cmd1   = new EditCmd(node);

            if (_name != null)                                                           //点击文件夹创建
            {
                parent = MemoryInterface.getInstance().getInodeIndexByName(node, _name); //选中文件夹为父目录
            }
            else                                                                         //直接新建
            {
                parent = node;                                                           //当前目录为父目录
            }

            List <int> nodeLoc  = MemoryInterface.getInstance().getRequireInodes(1);      //找到未使用的inode节点
            List <int> blockLoc = MemoryInterface.getInstance().getRequireBlocks(1);      //找到空闲磁盘块


            if (nodeLoc == null || blockLoc == null)        //inodeMap或blockMap用尽
            {
                return(null);
            }
            string name = null;

            if (type.Equals("文件夹"))
            {
                name = initDir(blockLoc, parent, nodeLoc[0]);
                entries.Add(new Directory(nodeLoc[0], name));
            }
            else
            {
                name = "新建文件";
                name = MemoryInterface.getInstance().addNewInodeTableItem(MemoryInterface.getInstance().getInodeByIndex(parent).getBlock(0), name, nodeLoc[0]);
                inode temp = MemoryInterface.getInstance().getInodeByIndex(nodeLoc[0]);
                temp.init(nodeLoc[0], blockLoc, "文件", DateTime.Now);
                entries.Add(new File(temp, name));
            }
            UndoableCmd cmd2 = new AddCmd(nodeLoc[0]);
            CompoundCmd cmd3 = new CompoundCmd();

            cmd3.newOpe(cmd1);
            cmd3.newOpe(cmd2);
            UndoManager.getInstance().newOpe(cmd3);
            MemoryInterface.getInstance().write();

            return(name);
        }
Ejemplo n.º 28
0
        public static BlastLayer GetBlastLayerFromDiff(byte[] Original, byte[] Corrupt)
        {
            BlastLayer bl = new BlastLayer();

            string thisSystem  = (string)RTCV.NetCore.AllSpec.VanguardSpec[VSPEC.SYSTEM];
            string romFilename = (string)RTCV.NetCore.AllSpec.VanguardSpec[VSPEC.OPENROMFILENAME];

            var rp = MemoryDomains.GetRomParts(thisSystem, romFilename);

            if (rp.Error != null)
            {
                MessageBox.Show(rp.Error);
                return(null);
            }

            if (Original.Length != Corrupt.Length)
            {
                MessageBox.Show("ERROR, ROM SIZE MISMATCH");
                return(null);
            }

            MemoryInterface mi         = MemoryDomains.GetInterface(rp.PrimaryDomain);
            long            maxaddress = mi.Size;

            for (int i = 0; i < Original.Length; i++)
            {
                if (Original[i] != Corrupt[i] && i >= rp.SkipBytes)
                {
                    if (i - rp.SkipBytes >= maxaddress)
                    {
                        bl.Layer.Add(new BlastUnit(new byte[] { Corrupt[i] }, rp.SecondDomain, (i - rp.SkipBytes) - maxaddress, 1, mi.BigEndian));
                    }
                    else
                    {
                        bl.Layer.Add(new BlastUnit(new byte[] { Corrupt[i] }, rp.PrimaryDomain, (i - rp.SkipBytes), 1, mi.BigEndian));
                    }
                }
            }

            if (bl.Layer.Count == 0)
            {
                return(null);
            }

            return(bl);
        }
Ejemplo n.º 29
0
        private int calculate(inode _node)     //计算文件大小
        {
            int[]  ptr     = _node.getBlockPtr();
            string content = "";

            for (int i = 0; i < 13; i++)        //遍历该文件的所有块,计算大小
            {
                if (MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]) != null && MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]).data != null && !MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]).data.Equals(""))
                {
                    content += MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]).data;
                    continue;
                }
                break;
            }
            byte[] sarr = Encoding.Default.GetBytes(content);
            return(sarr.Length);
        }
Ejemplo n.º 30
0
        public File(inode _node, string name)
        {
            string   type = _node.getType();
            DateTime time = _node.getTime();

            this.size = calculate(_node);
            this.name = name;
            this.node = _node.id;
            this.time = _node.getTime();
            int    num     = _node.getBlockNum(); //获取磁盘块数目
            string content = "";

            for (int i = 0; i < num; i++)       //遍历磁盘块
            {
                content += MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(i)).data;
            }
            this.content = content;
        }