Локальное межпроцессное взаимодействие
Локальное межпроцессное взаимодействие [1] ( LPC , часто также называемый вызовом локальной процедуры или облегченным вызовом процедуры ) — это внутреннее недокументированное средство межпроцессного взаимодействия , предоставляемое ядром Windows NT Microsoft для упрощенного IPC между процессами на одном компьютере. Начиная с Windows Vista , LPC был переписан как асинхронная локальная межпроцессная связь. [1] ( ALPC , часто также расширенный вызов локальных процедур ), чтобы обеспечить высокоскоростной масштабируемый механизм связи, необходимый для эффективной реализации инфраструктуры драйверов пользовательского режима (UMDF), части пользовательского режима которой требуют эффективного канала связи с компонентами UMDF в исполнительной системе. . [2]
Интерфейс (A)LPC является частью недокументированного Native API Windows NT и поэтому недоступен приложениям для прямого использования. Однако его можно использовать косвенно в следующих случаях:
- при использовании Microsoft RPC API для локального взаимодействия, т. е. между процессами на одном компьютере.
- путем вызова API-интерфейсов Windows, реализованных с помощью (A)LPC (см. ниже).
Выполнение
[ редактировать ](A)LPC реализуется с использованием объектов «порт» ядра, которые защищаются (с помощью списков ACL , позволяя, например, использовать их только определенным SID ) и позволяют идентифицировать процесс на другой стороне соединения. Отдельные сообщения также можно защитить: приложения могут устанавливать SID для каждого сообщения, а также проверять изменения контекста безопасности в токене, связанном с сообщением (A)LPC.
Типичный сценарий связи между сервером и клиентом выглядит следующим образом:
- Серверный процесс сначала создает объект именованного порта подключения к серверу и ожидает подключения клиентов.
- Клиент запрашивает соединение с этим именованным портом, отправляя сообщение о подключении.
- Если сервер принимает соединение, два безымянных создаются порта:
- клиентский порт связи — используется клиентскими потоками для связи с конкретным сервером.
- порт связи сервера — используется сервером для связи с конкретным клиентом; создается один такой порт для каждого клиента
- Клиент получает дескриптор порта связи клиента, а сервер получает дескриптор порта связи сервера, и устанавливается канал связи между процессами.
(A)LPC поддерживает следующие три режима обмена сообщениями между сервером и клиентом: [3]
- Для коротких сообщений (менее 256 байт) ядро копирует буферы сообщений между процессами из адресного пространства отправляющего процесса в системное адресное пространство, а оттуда в адресное пространство принимающего процесса.
- Для сообщений длиной более 256 байт необходимо использовать раздел общей памяти для передачи данных, которые служба (A)LPC сопоставляет между процессами отправки и получения. Сначала отправитель помещает данные в общую память, а затем отправляет уведомление (например, небольшое сообщение, используя первый метод (A)LPC) принимающему процессу, указывающее на отправленные данные в разделе общей памяти.
- Сервер может напрямую читать и записывать данные из адресного пространства клиента, когда объем данных слишком велик, чтобы поместиться в общий раздел.
ALPC имеет преимущество в производительности по сравнению с предыдущим интерфейсом LPC, поскольку его можно настроить на использование портов завершения ввода-вывода вместо синхронного механизма запроса/ответа, который используется исключительно LPC. [4] Это обеспечивает высокоскоростную связь портов 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 и Security Reference Monitor используют его для связи с процессом LSASS.
Как уже упоминалось, Microsoft RPC может использовать (A)LPC в качестве транспорта, когда клиент и сервер находятся на одном компьютере. Многие службы, предназначенные для взаимодействия только на локальном компьютере, используют (A)LPC в качестве единственного транспорта через RPC. Реализация удаленных OLE и DCOM во многих случаях также использует (A)LPC для локальной связи.
См. также
[ редактировать ]Примечания
[ редактировать ]Ссылки
[ редактировать ]- Дабак, Прасад; Борат, Милинд; Фадке, Сандип (1999), Недокументированная Windows NT , Hungry Minds , ISBN 0-7645-4569-8
- Руссинович, Марк ; Соломон, Дэвид; Ионеску, Алекс (2009), Внутренние устройства Windows® (5-е изд.), Microsoft Press , ISBN 978-0-7356-2530-3
Внешние ссылки
[ редактировать ]- Вызов локальной процедуры в Wayback Machine (архивировано 12 июня 2008 г.) - включает объяснение недокументированных функций.
- ЛПК Связь