Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение из памяти другой программы [D7]


_white_ ©   (2006-03-14 09:16:00) 

Вопросо у меня следующий: Имеется
программа,
которая вносит данные в память, требуется другой программой
эти данные
прочитать (адрес известен), видимо нужно вначале найти
процесс (его
адресное пространство) и затем работать уже с адресным
пространством
найденого процесса. Пожалуйста помогите советом и если
можно небольшим
примером


kaZaNoVa   (2006-03-14 19:43:00) [1]

Игорь Шевченко ©   (14.03.06 18:10) [13]
Нет, к содержимому постов


ок ничего не буду писать ..


Игорь Шевченко   (2006-03-14 18:10:00) [2]

kaZaNoVa ©   (14.03.06 15:52) [11]


> у Вас предвзятое мнение  к моему нику????


Нет, к содержимому постов


kaZaNoVa   (2006-03-14 15:54:00) [3]

function GetNameByPid(Pid: dword): string;
var
hProcess, Bytes: dword;
Info: PROCESS_BASIC_INFORMATION;
ProcessParametres: pointer;
ImagePath: TUnicodeString;
ImgPath: array[0..MAX_PATH] of WideChar;
begin
Result := '';
ZeroMemory(@ImgPath, MAX_PATH * SizeOf(WideChar));
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, Pid);
if ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @Info,
                             SizeOf(PROCESS_BASIC_INFORMATION), nil) = STATUS_SUCCESS then
 begin
  if ReadProcessMemory(hProcess, pointer(dword(Info.PebBaseAddress) + $10),
                       @ProcessParametres, SizeOf(pointer), Bytes) and
     ReadProcessMemory(hProcess, pointer(dword(ProcessParametres) + $38),
                       @ImagePath, SizeOf(TUnicodeString), Bytes)  and
     ReadProcessMemory(hProcess, ImagePath.Buffer, @ImgPath,
                       ImagePath.Length, Bytes) then
       begin
         Result := ExtractFileName(WideCharToString(ImgPath));
       end;
  end;
CloseHandle(hProcess);
end;


kaZaNoVa   (2006-03-14 15:52:00) [4]

Игорь Шевченко ©   (14.03.06 12:36) [9]
я что-то не то написал?
что-то плохое?

у Вас предвзятое мнение  к моему нику????


viman   (2006-03-14 12:53:00) [5]

_white_, уточнение. Вы желаете читать данные из чужой программы, которую не можете изменить или же вам просто нужно огранизовать обмен данными между своими программами(или копиями одной и той же)?
В 1-ом случае вам поможет ReadProcessMemory, как и было описано.
Во 2-ом - разделяемая память, например через Mapping file.


Игорь Шевченко   (2006-03-14 12:36:00) [6]

kaZaNoVa ©   (14.03.06 12:16) [7]

Если у тебя есть фонтан - заткни его, дай отдохнуть и фонтану.


Сергей М.   (2006-03-14 12:24:00) [7]


> _white_   (14.03.06 10:21) [5]


http://www.torry.net/vcl/misc/games/memcheater.zip


kaZaNoVa   (2006-03-14 12:16:00) [8]

а для чего тебе читать его память? может есть более простое и рациональное решение задачи?

а если просто хочется узнать что-нить из памяти процесса - идеальна прога Artmoney


balepa   (2006-03-14 10:31:00) [9]

Ты все таки зайди на MSDN там тоже примеры есть (на С конечно, но разобраться можно)


_white_   (2006-03-14 10:21:00) [10]

Я вижу что Вы проффессионал в своём деле, и наверняка что-то подобное делали, я был бы вам благодарен если бы вы мне оказали одолжение приведя пример, который как вы сами знаете является куда более удобной вещью нежели перерывание кучи литературы в поисках ответа, ведь слово знающего человека важнее.


_white_   (2006-03-14 10:21:00) [11]

Я вижу что Вы проффессионал в своём деле, и наверняка что-то подобное делали, я был бы вам благодарен если бы вы мне оказали одолжение приведя пример, который как вы сами знаете является куда более удобной вещью нежели перерывание кучи литературы в поисках ответа, ведь слово знающего человека важнее.


Сергей М.   (2006-03-14 10:08:00) [12]


> где лучше посмотреть описание данных функций


В стандартной справке либо на msdn.microsoft.com.


> как узнать PID


NT - см. EnumProcesses() в модуле psapi.pas


_white_   (2006-03-14 09:48:00) [13]

А где лучше посмотреть описание данных функций, и как узнать PID


Сергей М.   (2006-03-14 09:32:00) [14]


> нужно вначале найти
> процесс


Точнее - открыть процесс по известному PID.

См. OpenProcess()


> работать уже с адресным
> пространством
> найденого процесса


См. ReadProcessMemory()


Наверх

Титульная страница Поиск, карта сайта Написать письмо