Наследование дескрипторов в Windows

220
05 апреля 2018, 14:21

Нужно передать готовое соединение другом процессу. Прочитал про наследование дескрипторов на msdn, но примеров не нашел. Как именно мне получит доступ к наследуемуму дескриптору сокета? Где он лежит?

Answer 1

Чтобы «другой» (дочерний) процесс мог получить доступ к дескриптору, открытому в вашем процессе, необходимо выполнить две вещи:

  1. Сделать дескриптор наследуемым (изначально создав его таким, либо склонировав через DuplicateHandle() с параметром bInheritHandle == true). Это сделает дескриптор видимым из дочернего процесса.

  2. Передать собственно дескриптор (четырёхбайтное целое число). Как это сделать — решайте сами. Можете воспользоваться стандартным потоком ввода/вывода, или открыть именованный канал, или послать оконное сообщение главному окну дочерней программы, или даже указать его в качестве параметра командной строки дочернего процесса, если дескриптор был открыт до вызова CreateProcess().

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

Где он лежит?

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

К слову, с помощью такой штуки, как DACL (передаваемой через параметры типа LPSECURITY_ATTRIBUTES) можно задавать ещё более гибкие разрешения.

Answer 2

Для дублирования дескрипторов сокетов следует использовать специальную функцию WSADuplicateSocket. Ее работа отличается от обычной DuplicateHandle, вместо нового дескриптора она заполняет структуру WSAPROTOCOL_INFO, которую необходимо самостоятельно передать в другой процесс и использовать для вызова WSASocket в нем.

READ ALSO
Почему ссылка С++ не может быть переопределена?

Почему ссылка С++ не может быть переопределена?

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

207
Как построить пирамиду, применить к ней текстуру и осветить ее?

Как построить пирамиду, применить к ней текстуру и осветить ее?

Как построить пирамиду, применить к ней текстуру и осветить ее? Пишу на Qt

205
CLion jetbrains-toolbox: error trying to exec 'cc1plus'

CLion jetbrains-toolbox: error trying to exec 'cc1plus'

При попытке компиляции из терминала CLion получаю сообщение

191
Изображение в матрицу

Изображение в матрицу

Ребят помогите с задачей, нужно взять изображение и перевести его в чёрное белое в виде матрицы 0 или 1, или как яркость вродеКакие библиотеки...

183