Win32 имя события видимость только для собственного процесса - PullRequest
0 голосов
/ 20 марта 2020

Мне бы хотелось, чтобы мои именованные события были видимыми / открываемыми только внутри моего процесса.

В настоящее время я создаю события с CreateEvent(NULL, FALSE, FALSE, "my event name");, и они видимы и устанавливаются другими процессами, что мне кажется опасным. Я боюсь, что если другое приложение случайно использует одно и то же имя события, эти два приложения будут мешать друг другу.

Как я могу позволить моему событию быть доступным только процессу, в котором они созданы? Или как правильно использовать имена событий, когда нам не требуется межпроцессное взаимодействие?

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

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

Обратите внимание, что если вы беспокоитесь только о случайных коллизиях, а не злонамеренных, вы можете использовать пространство имен частного объекта (поиск CreatePrivateNamespace()). Вы должны создать граничный дескриптор, добавить SID своей учетной записи к этому дескриптору, затем использовать дескриптор для создания частного пространства имен, а затем, наконец, создать любые объекты ядра, которые вы будете sh защищать от столкновения в этом пространстве имен.

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

Я должен добавить, что если вы хотите, чтобы имена были видимыми, но маловероятными чтобы столкнуться, вы можете выбрать строковые GUID в качестве своих имен (например, общий шаблон, используемый для обеспечения работы только одного экземпляра исполняемого файла, - это создание именованного объекта ядра и проверка GetLastError() для ERROR_ALREADY_EXISTS). Для этого очень хорошо работают GUID, так как они вряд ли случайно столкнутся и намного проще в использовании, чем личное пространство имен.

2 голосов
/ 20 марта 2020

Я бы хотел, чтобы мои именованные события были видимыми / открываемыми только внутри моего процесса.

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

Как сделать так, чтобы мое событие было доступно только процессу, в котором они созданы?

Если вы хотите, чтобы объекты ядра были доступны только для вашего процесса, который их создает, то НЕ УСТАНАВЛИВАЙТЕ Имена им на уровне ядра. Это так просто. Если вам нужно ссылаться на объекты по имени в вашем коде, создайте собственное сопоставление для поиска, например, с классом std::map в C ++, или Dictionary, классом C# или любым другим выбранным вами языком программирования. обеспечивает. Например:

std::map<std::string, HANDLE> my_events;
...
my_events["my event name"] = CreateEvent(NULL, FALSE, FALSE, NULL);
// use my_events["my event name"] as needed...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...