Общее адресное пространство процессов
От: Balagur  
Дата: 09.01.05 23:12
Оценка:
Есть такая ситуация: Некий программный продукт предлагает рисовать графику, обладает многооконным интерфейсом и позволяет копировать графические объекты только между окнами своей программы(загруженного в данный момент проекта).
Стоит следующая задача : запустить 2 копии программы 1-ая копия загужает проект с графикой, 2-ая копия — чистый проект, скопировать графмчексуие объекты в чистые проект.
Варианты решения:
В статье Jeffrey Richter (Microsoft System Jornal\september\Win32 Q & A) (MSDN 6.0) предлагается вариант чтения данных из адресного пространства "чужого" процесса в свой
шагая по "чужой" памяти структурой LV_ITEM (задача в статье так поставлена). В моём вопросе Всё сложнее — Надо неизвестно что, неизвестно как прочитать и так-же положить в другой процесс. Исследования показали, что продукт етот не использует ClipBoard. Собственно вопрос — Можно ли как нибудь указать для одного из процессов в качестве рабочей области памяти — область другого процесса (другой копии его самого).Если можно, то как это правильно сделать. (Буду благодарен за любые идеи).
Re: Общее адресное пространство процессов
От: Pavel Dvorkin Россия  
Дата: 10.01.05 04:16
Оценка:
Здравствуйте, Balagur, Вы писали:

> В моём вопросе Всё сложнее — Надо неизвестно что, неизвестно как прочитать и так-же положить в другой процесс.


Как — более или менее ясно. Открываешь процесс с помощью OpenProcess и читаешь из него память с помощью ReadProcessMemory.

Но если неизвестно что читать — то ответ может быть только "пойди туда не знаю куда, найди то, не знаю что".

Можно просканировать память чужого процесса и поискать там commited области. Можно их тип определить, чтобы отсечь те, что относятся к image. (см. того же Рихтера) Но остаются стеки, кучи, статическая память... Где искать-то ?

With best regards
Pavel Dvorkin
With best regards
Pavel Dvorkin
Re: Общее адресное пространство процессов
От: assad Россия  
Дата: 10.01.05 06:25
Оценка:
1.WRITEONCOPY или пробежаться VirtualQuery и далее ReadProcessMemory.
2. стек тоже можно копировать его можно взять из TIB или подменить стек
и копировать уже зная откуда.

остаётся проблема открытых хендлов. Но и их можно скопировать
DuplicateHandle, только нужно знать заранее какой максимальный, а можно просто с запасом взять.
если объектов нет то они и не скопируются!
И проблема Heap. тут или самому свой Heap писать, или давать гарантию,
что на момент запуска другой копии программы его не будет, или ещё что.

Перед всеми операциями клонируемый процесс перевести в режим Suspend.
Posted via RSDN NNTP Server 1.8
Re[2]: Общее адресное пространство процессов
От: AndrewJD США  
Дата: 10.01.05 08:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

>> В моём вопросе Всё сложнее — Надо неизвестно что, неизвестно как прочитать и так-же положить в другой процесс.


PD>Как — более или менее ясно. Открываешь процесс с помощью OpenProcess и читаешь из него память с помощью ReadProcessMemory.


А почему не Memory mapped files? Это надежней и проще.

PD>Но если неизвестно что читать — то ответ может быть только "пойди туда не знаю куда, найди то, не знаю что".


Как вариант: зарегистрировать свой формат и передавать через клипбоард
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: Общее адресное пространство процессов
От: Balagur  
Дата: 11.01.05 17:27
Оценка:
Всем спаибо!!!
Вопрос остался открытым!!!!!!!!!!
Что я уже сделал:
1 OpenProcess
2 DuplicateHandle,
3 VirtualQuery
4 ReadProcessMemory.
5 WriteProcessMemory.
Копировать стек считаю не целесообразным — всё равно что разбираться "Soft Ice" -ом какие там собственные классы, структуры, Union — ы, и #tydef использовали разработчики софта.
Поясняю задачу ещё раз:
1 Загружаю программку A — копия1 (писал её не я , исходников — нет) пишу в ней текст, рисую графику, вставляю спец объекты, вставляю ActiveX.
2 Загружаю программку A — копия2 . Создаю в ней новый пустой проект и ничего не создаю.
3 Загружаю программку B (- в том что она делает и есть вопрос (объединяет адресное пространство A — копия1 и A — копия2)).
4 Так как A — копия2 опирается на ту-же память, что и A — копия1 имею право сохранить проект в программе A — копия2 на диск. И таким макаром скопировать всю графику из A — копия1 в A — копия2
Re[2]: Общее адресное пространство процессов
От: Vadim B  
Дата: 12.01.05 00:26
Оценка:
Здравствуйте, Balagur, Вы писали:

B>Копировать стек считаю не целесообразным — всё равно что разбираться "Soft Ice" -ом какие там собственные классы, структуры, Union — ы, и #tydef использовали разработчики софта.


Тем не менее, если ты действительно хочешь сделать то, что хочешь, то другого выхода, кроме как дизассемблировать программу, разобраться в ее логике и структурах данных и где хранятся указатели на эти структуры — у тебя нет. Как говорится, Бог в помощь, но часто может быть проще написать программу самому с нуля.

B>Поясняю задачу ещё раз:

B>1 Загружаю программку A — копия1 (писал её не я , исходников — нет) пишу в ней текст, рисую графику, вставляю спец объекты, вставляю ActiveX.
B>2 Загружаю программку A — копия2 . Создаю в ней новый пустой проект и ничего не создаю.
B>3 Загружаю программку B (- в том что она делает и есть вопрос (объединяет адресное пространство A — копия1 и A — копия2)).
B>4 Так как A — копия2 опирается на ту-же память, что и A — копия1 имею право сохранить проект в программе A — копия2 на диск. И таким макаром скопировать всю графику из A — копия1 в A — копия2

Причем тут "опирается на ту же память"? Ну хорошо, сможешь ты физически установить указатель в одной программе на область памяти второй, ну и что дальше? Объект реально находится во многих ссылающихся друг на друга (часто неявно) динамических структурах с указателями на них в статических и стековых переменных.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.