mirror of
https://github.com/NohamR/Reclass.git
synced 2026-05-10 19:59:21 +00:00
feat: scanner unknown value + comparison rescan modes, find bar height fix
Add Cheat Engine-style scan conditions: Unknown Value captures all aligned addresses as baseline, then Changed/Unchanged/Increased/Decreased narrow results by comparing current vs previous values. Exact Value mode unchanged. Also fix find bar search box height to match buttons and improve MCP bridge instructions.
This commit is contained in:
@@ -10,26 +10,6 @@
|
||||
|
||||
namespace rcx {
|
||||
|
||||
// ── Scan request / result ──
|
||||
|
||||
struct ScanRequest {
|
||||
QByteArray pattern; // literal bytes to match
|
||||
QByteArray mask; // 0xFF = must match, 0x00 = wildcard
|
||||
|
||||
bool filterExecutable = false; // only scan +x regions
|
||||
bool filterWritable = false; // only scan +w regions
|
||||
|
||||
int alignment = 1; // 1 = every byte, 4 = dword, 8 = qword
|
||||
int maxResults = 50000;
|
||||
};
|
||||
|
||||
struct ScanResult {
|
||||
uint64_t address;
|
||||
QString regionModule;
|
||||
QByteArray scanValue; // cached bytes at scan/update time
|
||||
QByteArray previousValue; // value before last update
|
||||
};
|
||||
|
||||
// ── Value scan types ──
|
||||
|
||||
enum class ValueType {
|
||||
@@ -41,6 +21,40 @@ enum class ValueType {
|
||||
HexBytes
|
||||
};
|
||||
|
||||
// ── Scan condition (Cheat Engine-style) ──
|
||||
|
||||
enum class ScanCondition {
|
||||
ExactValue, // first scan + rescan: match specific bytes
|
||||
UnknownValue, // first scan only: capture all aligned addresses
|
||||
Changed, // rescan: current != previous
|
||||
Unchanged, // rescan: current == previous
|
||||
Increased, // rescan: current > previous (numeric)
|
||||
Decreased // rescan: current < previous (numeric)
|
||||
};
|
||||
|
||||
// ── Scan request / result ──
|
||||
|
||||
struct ScanRequest {
|
||||
QByteArray pattern; // literal bytes to match (empty for UnknownValue)
|
||||
QByteArray mask; // 0xFF = must match, 0x00 = wildcard
|
||||
|
||||
bool filterExecutable = false; // only scan +x regions
|
||||
bool filterWritable = false; // only scan +w regions
|
||||
|
||||
int alignment = 1; // 1 = every byte, 4 = dword, 8 = qword
|
||||
int maxResults = 50000;
|
||||
|
||||
ScanCondition condition = ScanCondition::ExactValue;
|
||||
int valueSize = 4; // bytes per value (for unknown scans)
|
||||
};
|
||||
|
||||
struct ScanResult {
|
||||
uint64_t address;
|
||||
QString regionModule;
|
||||
QByteArray scanValue; // cached bytes at scan/update time
|
||||
QByteArray previousValue; // value before last update
|
||||
};
|
||||
|
||||
// ── Pattern parsing ──
|
||||
|
||||
// Parse IDA-style signature string ("48 8B ?? 05") into pattern + mask.
|
||||
@@ -57,6 +71,9 @@ bool serializeValue(ValueType type, const QString& input,
|
||||
// Natural alignment for a value type (used as default alignment for value scans).
|
||||
int naturalAlignment(ValueType type);
|
||||
|
||||
// Byte-size for a value type (used for unknown scans and rescan read size).
|
||||
int valueSizeForType(ValueType type);
|
||||
|
||||
// ── Scan engine ──
|
||||
|
||||
class ScanEngine : public QObject {
|
||||
@@ -67,6 +84,8 @@ public:
|
||||
void start(std::shared_ptr<Provider> provider, const ScanRequest& req);
|
||||
void startRescan(std::shared_ptr<Provider> provider,
|
||||
QVector<ScanResult> results, int readSize,
|
||||
ScanCondition condition = ScanCondition::ExactValue,
|
||||
ValueType valueType = ValueType::Int32,
|
||||
const QByteArray& filterPattern = {},
|
||||
const QByteArray& filterMask = {});
|
||||
void abort();
|
||||
@@ -82,6 +101,7 @@ private:
|
||||
QVector<ScanResult> runScan(std::shared_ptr<Provider> prov, const ScanRequest& req);
|
||||
QVector<ScanResult> runRescan(std::shared_ptr<Provider> prov,
|
||||
QVector<ScanResult> results, int readSize,
|
||||
ScanCondition condition, ValueType valueType,
|
||||
const QByteArray& filterPattern,
|
||||
const QByteArray& filterMask);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user