Как разрешить процессу, созданному другим процессом, использовать часть памяти процесса-создателя? - PullRequest
1 голос
/ 26 августа 2010

У меня есть два консольных процесса, второй создается первым, используя API, указанный ниже:

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);

Теперь мне интересно, если я передам указатель на часть памяти первого процесса через IpCommandLine для второго процесса, который вызывается первым процессом, будет считывать память, на которую указывает этот указатель, вторым процессом определенно вызовет ошибку нарушения доступа или он подчиняется значению какого-либо параметра этого API?Если я не могу использовать этот API для своих целей, какой метод вы предлагаете для доступа?

Ответы [ 5 ]

2 голосов
/ 26 августа 2010

Вы можете получить доступ к этой памяти с помощью API ReadProcessMemory / WriteProcessMemory. Другой процесс должен знать адрес памяти и дескриптор процесса для доступа к своей памяти.

0 голосов
/ 27 августа 2010

Я делал это раньше с # прагмой.На данный момент у меня нет реального кода, но я думаю, что нечто подобное может работать с Visual Studio 2008 C ++:

//put this code in a dll that both processes link to 
#pragma section("shared",read,write,shared)

__declspec(allocate("shared"))
int i = 0;  // in theory, both processes should be able to access and modify i
0 голосов
/ 26 августа 2010

Алекс Фарбер ответ правильный; Вы можете использовать вызовы Win32 API для чтения памяти другого процесса. Тем не менее, это, вероятно, плохая идея. Если у вас есть данные для перемещения, вы можете либо передать их в качестве параметра в командной строке, либо передать дескриптор другому процессу и соединить два процесса с помощью канала.

0 голосов
/ 26 августа 2010

Вот мое неосведомленное мнение (я ничего не сделал с Windows):

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

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

0 голосов
/ 26 августа 2010

Я считаю, что использование volatile позволит другим процессам получить доступ к памяти.Конечно, для этого потребуется указатель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...