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); } } }
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(); } } }
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); }
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; }
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); //释放节点位图 }
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)); }
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); }
private void updateInterface() { MemoryInterface mi = MemoryDomains.MemoryInterfaces[cbSelectedMemoryDomain.SelectedItem.ToString()]; long fullRange = mi.Size; btnGenerateVMD.Enabled = true; }
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); }
public override void redo() { base.redo(); MemoryInterface.getInstance().releaseInode(node.id); List <int> temp = new List <int>(); MemoryInterface.getInstance().releaseBlock(node.getBlockPtr().ToList <int>()); }
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(); }
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(); }
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(); }
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); }
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); }
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); } }
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); }
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))); } }
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; }
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(); }
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); }
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); }
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); }
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)); }
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()); } }
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); }
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); }
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); }
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); }
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; }