Kdyžtak přikládám aktuální alg. pro vyhledání pole bytů v paměti.. je to na 2 věci, vůbec mi výsledky neodpovídaj jako v CE :(
begin - počáteční pamět (0x400000)
end - konečná (0x7FFFFFFF)
data - pole bytů, který se mají hledat (např. 0x10, 0x20, 0x00, 0x00) (int)
Objekt MemoryBlock jen obsahuje adresu jako IntPtr a byte[] na té adrese
public List<MemoryBlock> Scan(int begin, int end, params byte[] data)
{
List<MemoryBlock> addresses = new List<MemoryBlock>();
if (data != null && data.Length > 0 && end > begin + data.Length)
{
// velikost paměti, která se má procházet
int memorySize = end - begin;
// zjistí velikost segmentu podle velikosti vstupních dat
int segment = MEM_SEGMENT_SIZE; // 20480 (po jakých částech se má číst pamět)
DateTime start = DateTime.Now; // pouze pro měření času
if (memorySize >= segment)
{
// počet hlavních cyklů, pro získání bloku paměti
int loops = memorySize / segment;
// velikost paměti, která se projde ke konci (zbytek segmentu)
int restMemorySize = memorySize % segment;
// rozdíl počáteční velikosti ve všech cyklech krom prvního
int dataLength = data.Length - 1;
// počáteční adresa
int address = begin;
// buffer pro přečtené byty
byte[] buffer;
// kolik bytů se přečetlo
int read;
// hlavní cyklus pro čtení segmentů paměti
for (int i = 0; i < loops; i++)
{
if (Read(address, segment, out buffer, out read) && read > 0)
{
Parallel.For(0, buffer.Length - dataLength, j =>
{
// porovná byte po bytu
if (CompareBytes(data, buffer, j))
{
addresses.Add(new MemoryBlock(address + j, data));
Console.WriteLine("SCAN: " + addresses[addresses.Count - 1]);
}
});
}
address += ((buffer == null) ? segment : buffer.Length) - dataLength;
segment = MEM_SEGMENT_SIZE + dataLength;
}
// projde zbývající paměť
if (restMemorySize > 0)
{
if (Read(address, end - address, out buffer, out read) && read > 0)
{
Parallel.For(0, buffer.Length - dataLength, j =>
{
// porovná byte po bytu
if (CompareBytes(data, buffer, j))
{
addresses.Add(new MemoryBlock(address + j, data));
Console.WriteLine(addresses[addresses.Count - 1]);
}
});
}
}
Filter(hProcess, addresses, PageProtect.PAGE_READWRITE);
}
TimeSpan endl = new TimeSpan(DateTime.Now.Ticks - start.Ticks);
addresses.ForEach(m => { Console.WriteLine("OUT: " + m); });
Console.WriteLine("COUNT: " + addresses.Count + " -> " + endl);
}
return addresses;
}
Budu rád za každou pomoc.. klidně raďte i jak by to bylo v c++ (nemám problém to upravit do c#)
hlavní problém je, že výsledky neodpovídaj jako jsou v CE a rychlost hledání je strasně velká.. v CE to je tak 1s a tady několik (kolem 8s asi při stejným hledání)