private void SearchThread() { Searching = true; ReadPercentage = 0.0f; BytesRead = 0; TargetSize = 0; MemorySearchResult result = new MemorySearchResult(); List <MemorySegmentInfo> segments = TargetProcess.EnumerateSegments((UInt64)TargetProcess.GetProcess().MainModule.BaseAddress, TargetProcess.GetProcess().MainModule.ModuleMemorySize); foreach (MemorySegmentInfo ms in segments) { TargetSize += (UInt64)ms.SegmentSize; } foreach (MemorySegmentInfo ms in segments) { SearchRegion(ms.SegmentStart, ms.SegmentStart + ms.SegmentSize, ref result); } LastResult = result; Searching = false; ThreadSemaphore.Release(); }
private void SearchAgainThread() { Searching = true; ReadPercentage = 0.0f; BytesRead = 0; TargetSize = 0; MemorySearchResult result = new MemorySearchResult(); for (int i = 0; i < LastResult.Addresses.Count; i++) { UInt64 addy = LastResult.Addresses[i]; byte[] readBytes = TargetProcess.ReadBuffer(addy, SearchArray.Length); if (readBytes.SequenceEqual(SearchArray)) { result.Addresses.Add(addy); } ReadPercentage = (float)(i + 1) / (float)LastResult.Addresses.Count; } LastResult = result; Searching = false; ThreadSemaphore.Release(); }
public MemorySearchResult GetLastResult() { ThreadSemaphore.WaitOne(); MemorySearchResult ret = LastResult; ThreadSemaphore.Release(); return(ret); }
private void WindowProcessTimer_Tick(object sender, EventArgs e) { if (!ProcessSelected()) { EnableControls(false); return; } if (Searcher.IsSearching()) { SearchProgressBar.Value = (double)Searcher.GetSearchPercentage() * 100.0; EnableControls(false); WasSearching = true; return; } if (WasSearching) { EnableControls(true); SearchProgressBar.Value = 100; SearchResultDataGrid.Items.Clear(); WasSearching = false; TimerTick = 4; MemorySearchResult res = Searcher.GetLastResult(); foreach (UInt64 addy in res.Addresses) { SearchEntry entry = new SearchEntry() { OriginalAddress = addy, Address = addy.ToString("X8"), Value = "", ValueType = CurrentSearchType, Frozen = false, ValueTypeString = SearchTypeConverter.SearchTypeStrings[(int)CurrentSearchType] }; SearchResultDataGrid.Items.Add(entry); } } TimerTick++; if (TimerTick % 5 == 0) { UpdateInfoDataGrid(SearchResultDataGrid); TimerTick = 1; } UpdateInfoDataGrid(AddressListDataGrid); }
private void SearchRegion(UInt64 start, UInt64 end, ref MemorySearchResult result) { UInt64 baseAddr = start; for (; baseAddr < end; baseAddr++) { try { byte[] readBytes = TargetProcess.ReadBuffer(baseAddr, SearchArray.Length); if (readBytes.SequenceEqual(SearchArray)) { result.Addresses.Add(baseAddr); } } catch (Exception e) { } BytesRead++; ReadPercentage = (float)((double)BytesRead / (double)TargetSize); } }