public void NextScan(ref NetCheatX.Core.Containers.SearchResultContainer <ISearchResult> result, ISearchType searchType, object[] args, Types.SetProgressCallback setProgress) { if (_host == null || result == null || result.Count == 0) { return; } // Grab parameters byte[] param0 = (byte[])args[0]; bool sign = (bool)args[1]; // Perform scan Search.NextScan(_host, this, setProgress, result, Search.SearchType.GreaterThanOrEqualTo, sign, param0); }
public void FirstScan(ref NetCheatX.Core.Containers.SearchResultContainer <ISearchResult> result, ISearchType searchType, object[] args, Types.MemoryRange[] range, Types.SetProgressCallback setProgress) { if (result == null) { result = new NetCheatX.Core.Containers.SearchResultContainer <ISearchResult>(); } if (_host == null) { return; } // Grab parameters byte[] param0 = (byte[])args[0]; // Loop through each range and scan foreach (Types.MemoryRange r in range) { Search.FirstScan(_host, this, setProgress, r, result, Search.SearchType.GreaterThanOrEqualTo, searchType.Signed, searchType.Alignment, param0); } }
public static bool FirstScan(IPluginHost host, ISearchMethod method, Types.SetProgressCallback setProgress, Types.MemoryRange range, NetCheatX.Core.Containers.SearchResultContainer <ISearchResult> result, SearchType type, bool signed, int align, byte[] param0, byte[] param1 = null) { bool pass = false; int progress = 0, lastProgress = 0; Stopwatch watch = new Stopwatch(); // Return false if param is invalid if (param0 == null || param0.Length == 0 || (type == SearchType.ValueBetween && (param0 == null || param1.Length < 2))) { return(false); } // Return false if any of the other arguments are invalid if (host == null || method == null || result == null) { return(false); } // Define total range ulong distance = range.stop - range.start; // Define max block size ulong blockSize = SEARCH_BLOCK_SIZE; if (blockSize > distance) { blockSize = distance; } // Define block increment value // Subtract param0.Length-1 to ensure memory at end of blocks is scanned ulong blockInc = blockSize - (ulong)(param0.Length - align); // Initialize our buffers byte[] block = new byte[blockSize]; byte[] compare = new byte[param0.Length]; // Reset progress bar to 0 setProgress.Invoke(method, 0, 100, ""); // Loop through memory, grabbing blocks and comparing them watch.Start(); for (ulong addr = range.start; addr < range.stop; addr += blockInc) { // Update progress bar progress = (int)((float)((float)(addr - range.start) / (float)distance) * 100f); if (progress > lastProgress) { lastProgress = progress; setProgress.Invoke(method, progress, 100, result.Count().ToString("N0") + " results found"); } // Update blockSize if range smaller than SEARCH_BLOCK_SIZE if (blockSize > (range.stop - addr)) { blockSize = (range.stop - addr); } // Grab block if (host.ActiveCommunicator.GetBytes(addr, ref block)) { for (int off = 0; off < (int)blockInc; off += align) { // Copy section for comparison Array.Copy(block, off, compare, 0, param0.Length); // Compare based on SearchType switch (type) { case SearchType.EqualTo: pass = NetCheatX.Core.Bitlogic.Compare.BAEqual(param0, compare); break; case SearchType.NotEqualTo: pass = NetCheatX.Core.Bitlogic.Compare.BANotEqual(param0, compare); break; case SearchType.LessThan: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanUnsigned(compare, param0); } break; case SearchType.LessThanOrEqualTo: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualUnsigned(compare, param0); } break; case SearchType.GreaterThan: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanUnsigned(compare, param0); } break; case SearchType.GreaterThanOrEqualTo: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualUnsigned(compare, param0); } break; case SearchType.ValueBetween: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualSigned(compare, param0); if (pass) { pass &= NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualSigned(compare, param1); } } else { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualUnsigned(compare, param0); if (pass) { pass &= NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualUnsigned(compare, param1); } } break; } // If passed then add the result if (pass) { result.Add(new NetCheatX.Core.Basic.BasicSearchResult() { Address = addr + (ulong)off, Value = (byte[])compare.Clone() }); } } } } watch.Stop(); // Finish progress setProgress.Invoke(method, 100, 100, result.Count().ToString("N0") + " results found in " + watch.Elapsed.ToString("ss\\.fff") + " seconds"); return(true); }
public static bool NextScan(IPluginHost host, ISearchMethod method, Types.SetProgressCallback setProgress, NetCheatX.Core.Containers.SearchResultContainer <ISearchResult> result, SearchType type, bool signed, byte[] param0, byte[] param1 = null) { bool pass = false; int progress = 0, lastProgress = 0; ulong lastAddr = 0; NetCheatX.Core.Basic.BasicSearchResult resultEdit; // Return false if param is invalid if (param0 == null || param0.Length == 0 || (type == SearchType.ValueBetween && (param0 == null || param1.Length < 2))) { return(false); } // Return false if any of the other arguments are invalid if (host == null || method == null || result == null || result.Count == 0) { return(false); } // Initialize counters int resultSize = result.Count; int resultIndex = 0; int resultFound = 0; // Initialize our buffers byte[] block = new byte[SEARCH_BLOCK_SIZE]; byte[] compare = new byte[param0.Length]; // Reset progress bar to 0 setProgress.Invoke(method, 0, 100, ""); for (int off = 0; off < result.Count; off++) { // Update progress bar progress = (int)((float)((float)resultIndex / (float)resultSize) * 100f); if (progress > lastProgress) { lastProgress = progress; setProgress.Invoke(method, progress, 100, resultFound.ToString() + " results found"); } // Grab current result resultEdit = (NetCheatX.Core.Basic.BasicSearchResult)result.ElementAt(off); // Update block if address is out of block range if (resultEdit.Address > (lastAddr + SEARCH_BLOCK_SIZE - (ulong)(param0.Length - 1)) || off == 0) { // Load block lastAddr = result[off].Address; host.ActiveCommunicator.GetBytes(lastAddr, ref block); } // Copy section for comparison Array.Copy(block, (int)(resultEdit.Address - lastAddr), compare, 0, param0.Length); // Compare based on SearchType switch (type) { case SearchType.EqualTo: pass = NetCheatX.Core.Bitlogic.Compare.BAEqual(param0, compare); break; case SearchType.NotEqualTo: pass = NetCheatX.Core.Bitlogic.Compare.BANotEqual(param0, compare); break; case SearchType.LessThan: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanUnsigned(compare, param0); } break; case SearchType.LessThanOrEqualTo: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualUnsigned(compare, param0); } break; case SearchType.GreaterThan: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanUnsigned(compare, param0); } break; case SearchType.GreaterThanOrEqualTo: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualSigned(compare, param0); } else { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualUnsigned(compare, param0); } break; case SearchType.ValueBetween: if (signed) { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualSigned(compare, param0) & NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualSigned(compare, param1); } else { pass = NetCheatX.Core.Bitlogic.Compare.BAGreaterThanOrEqualUnsigned(compare, param0) & NetCheatX.Core.Bitlogic.Compare.BALessThanOrEqualUnsigned(compare, param1); } break; } if (!pass) { // Clean up resultEdit.Value = null; result[off] = resultEdit; // Remove result.RemoveAt(off); // Lower off so the next result is not skipped off--; } else { // Update result resultEdit.Value = compare; result[off] = resultEdit; resultFound++; } resultIndex++; } return(true); }
public void NextScan(ref NetCheatX.Core.Containers.SearchResultContainer <ISearchResult> result, ISearchType searchType, object[] args, Types.SetProgressCallback setProgress) { if (_host == null || result == null || result.Count == 0) { return; } // Grab parameters byte[] param0 = (byte[])args[0]; byte[] param1 = (byte[])args[1]; // Perform scan Search.NextScan(_host, this, setProgress, result, Search.SearchType.ValueBetween, searchType.Signed, param0, param1); }
public void ScanFirst(ISearchType type, ISearchMethod method, Types.MemoryRange[] ranges, object[] args, Types.SetProgressCallback setProgress) { if (_list == null) { throw new Exception("Results list is null on start of initial scan."); } PopulateColumns(); method.FirstScan(ref _list, type, args, ranges, setProgress); this._stopWatch.Stop(); Invoke((MethodInvoker) delegate { this.VirtualListSize = _list.Count; }); }