Нужно передать готовое соединение другом процессу. Прочитал про наследование дескрипторов на msdn, но примеров не нашел. Как именно мне получит доступ к наследуемуму дескриптору сокета? Где он лежит?
Чтобы «другой» (дочерний) процесс мог получить доступ к дескриптору, открытому в вашем процессе, необходимо выполнить две вещи:
Сделать дескриптор наследуемым (изначально создав его таким, либо склонировав через DuplicateHandle() с параметром bInheritHandle == true). Это сделает дескриптор видимым из дочернего процесса.
Передать собственно дескриптор (четырёхбайтное целое число). Как это сделать — решайте сами. Можете воспользоваться стандартным потоком ввода/вывода, или открыть именованный канал, или послать оконное сообщение главному окну дочерней программы, или даже указать его в качестве параметра командной строки дочернего процесса, если дескриптор был открыт до вызова CreateProcess().
Если же вы попытаетесь передать дескриптор, для которого наследование разрешено не было, дочерний процесс не сможет получить к нему доступ, будто его не существует.
Где он лежит?
В ядре операционной системы, как обычно. Изменяется лишь проверка прав доступа при обращении к объекту за дескриптором. По умолчанию требуется точное соответствие обращающегося процесса и процесса-создателя. При включении же наследования критерий соответствия превращается из «только создатель» в «создатель и его потомки».
К слову, с помощью такой штуки, как DACL (передаваемой через параметры типа LPSECURITY_ATTRIBUTES) можно задавать ещё более гибкие разрешения.
Для дублирования дескрипторов сокетов следует использовать специальную функцию WSADuplicateSocket. Ее работа отличается от обычной DuplicateHandle, вместо нового дескриптора она заполняет структуру WSAPROTOCOL_INFO, которую необходимо самостоятельно передать в другой процесс и использовать для вызова WSASocket в нем.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей