mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-08-21 17:39:20 +08:00
178 lines
5.3 KiB
C#
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;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|