Кто хозяин-создатель HANDLE ?

cpp2015
Дата: 08.04.2015 13:28:57
Приложение создаёт файл в памяти через CreateFileMapping. Другое приложение подключается к этому участку памяти с помощью OpenFileMapping. Получает его HANDLE и работет с ним.
Вопрос. Можно ли как-то по этому полученному HANDLE Memory Mapping File узнать PID или HANDLE процесса - создателя файла в памяти ? Просто при работе с файлом в памяти я хочу узнать о завершении процесса, создавшего файл. Не прибит ли он уже через диспетчер задач ? А для этого мне нужен HANDLE процесса создателя.
Dima T
Дата: 08.04.2015 13:46:28
Сделай мапинг на 4 байта больше и запиши в них PID процесса его создавшего.
cpp2015
Дата: 08.04.2015 13:48:14
Dima T,
собственно, так и собирался сделать. Но думал может есть какие-то стандартные API функции
Dima T
Дата: 08.04.2015 13:53:50
Нет таких функций, если не путаю.

В виндовсе устроено примерно так: каждый объект имеет счетчик ссылающихся на него хэндлов. Хэндлы хранятся в окружении процесса, при завершении процесса хэндл закрывается, счетчик уменьшается, как доходит до 0 - уничтожается объект. Т.е. виндовс понятия не имеет кто создал, он только отслеживает кто использует.
Dimitry Sibiryakov
Дата: 08.04.2015 13:54:06

Обломись.

Posted via ActualForum NNTP Server 1.5

Dimitry Sibiryakov
Дата: 08.04.2015 13:58:34

Dima T
запиши в них PID процесса его создавшего.

....а потом бейся головой об стенку, когда Windows отдаст освободившийся PID совершенно
другому процессу.

Posted via ActualForum NNTP Server 1.5

Dima T
Дата: 08.04.2015 14:11:21
Dimitry Sibiryakov
....а потом бейся головой об стенку, когда Windows отдаст освободившийся PID совершенно
другому процессу.

Чтоб голову поберечь: сразу получи по PID хэндл процесса и проверяй его завершения по хэндлу.
Dimitry Sibiryakov
Дата: 08.04.2015 14:24:59

Dima T
сразу получи по PID хэндл процесса и проверяй его завершения по хэндлу.

Пофиг:
1) Главный процесс создал файл
2) Дочерний подключился, получил хэндл, проверил, счастлив, работает
3) Главный процесс умер
4) Левый процесс получил тот же PID
5) Второй дочерний процесс подключился, получил хэндл нового "главного" процесса,
счастлив, работает.

Для проверки живости главного процесса надо использовать что-то автоматически уничтожаемое
при его смерти. Например, мутекс.

Posted via ActualForum NNTP Server 1.5

Dima T
Дата: 08.04.2015 14:35:41
Dimitry Sibiryakov
Пофиг:
1) Главный процесс создал файл
2) Дочерний подключился, получил хэндл, проверил, счастлив, работает
3) Главный процесс умер
4) Левый процесс получил тот же PID
5) Второй дочерний процесс подключился, получил хэндл нового "главного" процесса,
счастлив, работает.

Думаю так не будет пока есть незакрытые хэндлы на умерший процесс, т.е. для виндовса процесс окончательно не умер пока есть хэндлы на него ссылающиеся.
А если все дочерние закроют хэндл маппинга вместе с хэндлом родительского процесса, то новый не подключится.

Dimitry Sibiryakov
Для проверки живости главного процесса надо использовать что-то автоматически уничтожаемое
при его смерти. Например, мутекс.

Согласен, именованный мутекс проще и удобнее.
Владимир2012
Дата: 08.04.2015 17:11:06
cpp2015
Можно ли как-то по этому полученному HANDLE Memory Mapping File узнать PID или HANDLE процесса - создателя файла в памяти ?

GetFileInformationByHandleEx function
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364953(v=vs.85).aspx

FILE_INFO_BY_HANDLE_CLASS enumeration
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364228(v=vs.85).aspx

PS: Это конечно не то что ты хотел, но все же.
Как вариант:
- посмотри утилиты Руссиновича /одно время и исходники их были в inet/.

- исходники wine [url=]http://sourceforge.net/projects/wine/files/Source/[/url]
git clone git://wine.git.sourceforge.net/gitroot/wine/wine (read-only)

- исходники ReactOS /кстати многие не понимают, что она дает .../