【发布时间】:2012-04-04 16:41:42
【问题描述】:
我正在使用内存扫描仪,但扫描速度太慢了.. 谁能帮我改进一下?
procedure FirstScan(scantype, scanvalue: string);
var
value :integer;
dwEndAddr : dword;
i:dword;
mbi : TMemoryBasicInformation;
begin
while (VirtualQuery(Pointer(DWORD(mbi.BaseAddress) + MBI.RegionSize), MBI, SizeOf(MEMORY_BASIC_INFORMATION))=SizeOf(TMemoryBasicInformation)) do begin
if (MBI.State = MEM_COMMIT) and (MBI.Protect = PAGE_READWRITE) then begin
dwEndAddr := DWORD(mbi.BaseAddress) + MBI.RegionSize;
for i := DWORD(MBI.BaseAddress) to (dwEndAddr - 1 - sizeof(DWORD)) do begin
Application.ProcessMessages;
try
if scantype = '1 Byte' then begin
value := PBYTE(i)^;
if scanvalue = IntToStr(value) then ListBox1.Items.Add(IntToHex(i,8));
end;
//others scantypes here...
except
Break;
end;
end;
end;
end;
end;
我了解到我需要一次读取 4096 字节的页面,然后将它们存储在内存中并对其进行操作,直到我需要一个新页面然后再获取另一个 4096 字节的页面...
但我不知道我该怎么做...
有人可以帮我吗?代码可以是 C 或 C++...
【问题讨论】:
-
如果您的问题真的只是“为什么这个特定的代码很慢?”那么您应该将其带到codereview.stackexchange.com,因为您的问题过于本地化,无法在 Stack Overflow 上引起普遍关注。但是,如果您的问题通常只是“如何使任意慢代码更快?”那么你应该直接问这个。
-
mbi.BaseAddress 和 MBI.RegionSize 在进入 VirtualQuery() 时未定义 - 未初始化的堆栈数据。