Добрый день. Появилась нужда поиска разной информации в памяти некой запущенной программе. Зарание место поиска не извесно. Как правильно произвести поиск и быстро? Вот код, до которого я пока дошел и вот что мне помогло когда я искал в интернете как это сделать (
http://subscribe.ru/archive/comp.inroad/199912/12031837.html).
/////////////////////////////////////////
HWND hwndUO;
DWORD d;
int nBUFFER=255;
DWORD dwRead = 0;
DWORD *offset = 0;
char* lpBuffer = new char [nBUFFER];
ZeroMemory (lpBuffer, nBUFFER);
CString sBuffer, sFind = "то что я ищу";
hwndUO=FindWindowEx(NULL,NULL,"некая программа",NULL);
GetWindowThreadProcessId(hwndUO,&d);
HANDLE h=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ,0,d);
for(;;)
{
if(ReadProcessMemory(h, offset, lpBuffer,nBUFFER,&dwRead))
{
sBuffer = lpBuffer;
if(sBuffer.Find(sFind)!=-1)
{
//если нашел, то что-то делаю
}
}
else break;
offset++;
}
CloseHandle(h);
delete [] lpBuffer;
/////////////////////////////////////////
Вопросы:
1) Как ускорить поиск? Пробывал методы: увеличения буфера или вместо offset++; заменял на offset=offset+nBUFFER; (это мне кажется самым лучшем, но сомнения... сомнения

).
2) Какие недостатки в коде который я написал? (если они есть)
3) Переменная offset увеличивается всегда на 4. Это нормально?
4) Может вообще это я ерундой занился и есть лучше принцип поиска в памяти?
Зарание благодарю всех, кто откликнится на мои вопросы.
23.07.04 19:45: Перенесено модератором из 'C/C++' — Павел Кузнецов
Что сильно медленно работает?
Я делал так
MEMORY_BASIC_INFORMATION MBI;
DWORD dwNumByte;
SYSTEM_INFO sInfo;
GetSystemInfo(&sInfo);
PVOID pvAddress =sInfo.lpMinimumApplicationAddress;
while( pvAddress < sInfo.lpMaximumApplicationAddress)
{
dwNumByte = VirtualQueryEx(hProcess,pvAddress,&MBI,sizeof(MBI) );
if(dwNumByte != sizeof(MBI) )
{
//Error
}
pvAddress = (PVOID) ( (DWORD)MBI.BaseAddress + MBI.RegionSize);
if( MEM_COMMIT != MBI.State ) continue;
DWORD dwNumberOfBytesRead;
void* pdwBuf = 0;
pdwBuf= new BYTE[MBI.RegionSize];
if(!pdwBuf)
{
// error at alloc memory
}
BOOL b=FALSE;
b= ReadProcessMemory(
hProcess, // handle to the process whose memory is read
MBI.BaseAddress, // address to start reading
pdwBuf,// address of buffer to place read data
MBI.RegionSize,//iCount, // number of bytes to read
&dwNumberOfBytesRead // address of number of bytes read
);
Здравствуйте, BK, Вы писали:
BK>Что сильно медленно работает?
BK>BK>Я делал так
BK>MEMORY_BASIC_INFORMATION MBI;
BK> DWORD dwNumByte;
BK> SYSTEM_INFO sInfo;
BK> GetSystemInfo(&sInfo);
BK> PVOID pvAddress =sInfo.lpMinimumApplicationAddress;
BK> while( pvAddress < sInfo.lpMaximumApplicationAddress)
BK> {
BK> dwNumByte = VirtualQueryEx(hProcess,pvAddress,&MBI,sizeof(MBI) );
BK> if(dwNumByte != sizeof(MBI) )
BK> {
BK> //Error
BK> }
BK> pvAddress = (PVOID) ( (DWORD)MBI.BaseAddress + MBI.RegionSize);
BK> if( MEM_COMMIT != MBI.State ) continue;
BK> DWORD dwNumberOfBytesRead;
BK> void* pdwBuf = 0;
BK> pdwBuf= new BYTE[MBI.RegionSize];
BK> if(!pdwBuf)
BK> {
BK> // error at alloc memory
BK> }
BK> BOOL b=FALSE;
BK> b= ReadProcessMemory(
BK> hProcess, // handle to the process whose memory is read
BK> MBI.BaseAddress, // address to start reading
BK> pdwBuf,// address of buffer to place read data
BK> MBI.RegionSize,//iCount, // number of bytes to read
BK> &dwNumberOfBytesRead // address of number of bytes read
BK> );
BK>
Если нашёл необходимую строку, то как взять адрес? MBI.BaseAddress+i(где i смещение начала искомой строки) даёт не тот адрес который в действительности.