CodeWalker/BinarySearchForm.cs
2017-09-21 20:33:05 +10:00

178 lines
5.3 KiB
C#

using CodeWalker.Properties;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodeWalker
{
public partial class BinarySearchForm : Form
{
private volatile bool InProgress = false;
private volatile bool AbortOperation = false;
public BinarySearchForm()
{
InitializeComponent();
}
private void SearchForm_Load(object sender, EventArgs e)
{
BinSearchFolderTextBox.Text = Settings.Default.CompiledScriptFolder;
}
private void BinSearchFolderBrowseButton_Click(object sender, EventArgs e)
{
FolderBrowserDialog.SelectedPath = BinSearchFolderTextBox.Text;
DialogResult res = FolderBrowserDialog.ShowDialog();
if (res == DialogResult.OK)
{
BinSearchFolderTextBox.Text = FolderBrowserDialog.SelectedPath;
}
}
private void BinSearchButton_Click(object sender, EventArgs e)
{
string searchtxt = BinSearchTextBox.Text;
string searchfolder = BinSearchFolderTextBox.Text;
AbortOperation = false;
if (InProgress) return;
if (searchfolder.Length == 0)
{
MessageBox.Show("Please select a folder...");
return;
}
if (!Directory.Exists(searchfolder))
{
MessageBox.Show("Please select a valid folder!");
return;
}
SearchResultsTextBox.Clear();
byte[] searchbytes1;
byte[] searchbytes2;
int bytelen;
if (HexRadio.Checked)
{
try
{
bytelen = searchtxt.Length / 2;
searchbytes1 = new byte[bytelen];
searchbytes2 = new byte[bytelen];
for (int i = 0; i < bytelen; i++)
{
searchbytes1[i] = Convert.ToByte(searchtxt.Substring(i * 2, 2), 16);
searchbytes2[bytelen - i - 1] = searchbytes1[i];
}
}
catch
{
MessageBox.Show("Please enter a valid hex string.");
return;
}
}
else
{
bytelen = searchtxt.Length;
searchbytes1 = new byte[bytelen];
searchbytes2 = new byte[bytelen];
for (int i = 0; i < bytelen; i++)
{
searchbytes1[i] = (byte)searchtxt[i];
searchbytes2[bytelen - i - 1] = searchbytes1[i];
}
}
InProgress = true;
Task.Run(() =>
{
AddSearchResult("Searching " + searchfolder + "...");
string[] filenames = Directory.GetFiles(searchfolder);
int matchcount = 0;
foreach (string filename in filenames)
{
FileInfo finf = new FileInfo(filename);
byte[] filebytes = File.ReadAllBytes(filename);
int hitlen1 = 0;
int hitlen2 = 0;
for (int i = 0; i < filebytes.Length; i++)
{
byte b = filebytes[i];
byte b1 = searchbytes1[hitlen1]; //current test byte 1
byte b2 = searchbytes2[hitlen2];
if (b == b1) hitlen1++; else hitlen1 = 0;
if (b == b2) hitlen2++; else hitlen2 = 0;
if (hitlen1 == bytelen)
{
AddSearchResult(finf.Name + ":" + (i - bytelen));
matchcount++;
hitlen1 = 0;
}
if (hitlen2 == bytelen)
{
AddSearchResult(finf.Name + ":" + (i - bytelen));
matchcount++;
hitlen2 = 0;
}
if (AbortOperation)
{
InProgress = false;
AddSearchResult("Search aborted.");
return;
}
}
}
AddSearchResult(string.Format("Search complete. {0} results found.", matchcount));
InProgress = false;
});
}
private void AddSearchResult(string result)
{
try
{
if (InvokeRequired)
{
Invoke(new Action(() => { AddSearchResult(result); }));
}
else
{
SearchResultsTextBox.AppendText(result + "\r\n");
}
}
catch { }
}
private void SearchAbortButton_Click(object sender, EventArgs e)
{
AbortOperation = true;
}
}
}