Локальная межпроцессная коммуникация - Local Inter-Process Communication
В Локальная межпроцессная коммуникация[1] (LPC, часто также называемый Вызов местной процедуры или Вызов облегченных процедур) является внутренним, недокументированным межпроцессного взаимодействия возможность, предоставленная Microsoft Windows NT ядро для легкого МПК между процессы на том же компьютере. По состоянию на Виндоус виста, LPC был переписан как Асинхронное локальное межпроцессное взаимодействие[2] (ALPC, часто также Расширенный вызов местных процедур) для обеспечения высокоскоростного масштабируемого механизма связи, необходимого для эффективной реализации Платформа драйвера пользовательского режима (UMDF), части пользовательского режима которого требуют наличия эффективного канала связи с компонентами UMDF в исполнительный.[3]
Интерфейс (A) LPC является частью недокументированного Windows NT. Собственный API, и поэтому недоступен для приложений для прямого использования. Однако косвенно его можно использовать в следующих случаях:
- при использовании Microsoft RPC API для локального взаимодействия, то есть между процессами на одной машине
- вызывая Windows API, реализованные с (A) LPC (см. ниже)
Реализация
(A) LPC реализован с использованием объектов "порта" ядра, которые можно защитить (с помощью ACL, позволяя, например, только конкретный SID использовать их) и позволить идентифицировать процесс на другой стороне соединения. Отдельные сообщения также могут быть защищены: приложения могут устанавливать идентификаторы безопасности для каждого сообщения, а также проверять изменения контекста безопасности в токене, связанном с (A) сообщением LPC.
Типичный сценарий связи между сервером и клиентом выглядит следующим образом:
- Серверный процесс сначала создает именованный порт подключения к серверу объект и ожидает подключения клиентов.
- Клиент запрашивает соединение с этим названным портом, отправляя сообщение о соединении.
- Если сервер принимает соединение, два безымянный порты созданы:
- порт связи с клиентом - используется клиентскими потоками для связи с определенным сервером
- порт связи с сервером - используется сервером для связи с конкретным клиентом; создается один такой порт для каждого клиента
- Клиент получает дескриптор порта связи клиента, а сервер получает дескриптор порта связи сервера, и устанавливается канал связи между процессами.
(A) LPC поддерживает следующие три режима обмена сообщениями между сервером и клиентом:[4]
- Для коротких сообщений (менее 256 байт) ядро копирует буферы сообщений между процессами из адресное пространство процесса отправки в адресное пространство системы, а оттуда в адресное пространство процесса получения.
- Для сообщений длиной более 256 байт для передачи данных должен использоваться раздел общей памяти, который служба (A) LPC отображает между процессами отправки и получения. Сначала отправитель помещает данные в общую память, а затем отправляет уведомление (например, небольшое сообщение, используя первый метод (A) LPC) принимающему процессу, указывая на отправленные данные в разделе общей памяти.
- Сервер может напрямую читать и записывать данные из адресного пространства клиента, когда объем данных слишком велик для размещения в общем разделе.
ALPC имеет преимущество в производительности по сравнению с прежним интерфейсом LPC, поскольку его можно настроить для использования Порты завершения ввода / вывода вместо синхронного механизма запроса / ответа, который исключительно использует LPC.[5] Это обеспечивает высокоскоростную связь портов ALPC, которая автоматически уравновешивает количество сообщений и потоков. Кроме того, сообщения ALPC можно группировать вместе, чтобы минимизировать переключение пользовательского режима / режима ядра.
Известное использование
(A) LPC широко используется для связи между внутренними подсистемами в Windows NT. Подсистема Win32 активно использует (A) LPC для связи между клиентом и сервером подсистемы (CSRSS ). Quick LPC был представлен в версии 3.51 Windows NT, чтобы выполнять эти вызовы быстрее. В версии 4.0 от этого метода по большей части отказались в пользу перевода критических для производительности частей сервера в режим ядра (win32k.sys).
В Служба подсистемы локального органа безопасности (LSASS), Менеджер сеанса (SMSS) и Менеджер по управлению услугами все используют (A) порты LPC напрямую для связи с клиентскими процессами. Winlogon и Контрольный монитор безопасности используйте его для связи с процессом LSASS.
Как уже упоминалось, Microsoft RPC может использовать (A) LPC в качестве транспорта, когда клиент и сервер находятся на одном компьютере. Многие службы, которые предназначены для связи только на локальном компьютере, используют (A) LPC в качестве единственного транспорта через RPC. Реализация удаленного OLE и DCOM во многих случаях также используется (A) LPC для локальной связи.
Смотрите также
Заметки
- ^ https://blogs.msdn.microsoft.com/ntdebugging/2007/07/26/lpc-local-procedure-calls-part-1-architecture/
- ^ https://blogs.msdn.microsoft.com/ntdebugging/2007/07/26/lpc-local-procedure-calls-part-1-architecture/
- ^ Руссинович, Соломон и Ионеску (2009 г.:201)
- ^ Руссинович, Соломон и Ионеску (2009 г.:203)
- ^ Руссинович, Соломон и Ионеску (2009 г.:204)
использованная литература
- Дабак, прасад; Борат, Милинд; Phadke, Сандип (1999), Недокументированная Windows NT, Голодные умы, ISBN 0-7645-4569-8
- Руссинович Марк; Соломон, Давид; Ионеску, Алекс (2009), Внутреннее устройство Windows® (5-е изд.), Microsoft Press, ISBN 0-7356-2530-1
внешние ссылки
- Вызов местной процедуры на Wayback Machine (архивировано 12 июня 2008 г.) - Включает объяснение недокументированных функций
- Связь LPC