Local Inter-Process Communication [1] ( LPC , часто называют также местный вызов процедуры или Lightweight Procedure Call ) является внутренним, не имеющий документами межпроцессного взаимодействия объекта обеспечивается Microsoft Windows NT ядро для легкого IPC между процессами на том же компьютер. Начиная с Windows Vista , LPC был переписан как асинхронное локальное межпроцессное взаимодействие [2] ( ALPC , часто также Advanced Local Procedure Call), чтобы обеспечить высокоскоростной масштабируемый механизм связи, необходимый для эффективной реализации инфраструктуры драйверов пользовательского режима (UMDF), части пользовательского режима которой требуют эффективного канала связи с компонентами UMDF в исполнительной системе . [3]
Интерфейс (A) LPC является частью недокументированного Native API Windows NT и поэтому не доступен приложениям для прямого использования. Однако косвенно его можно использовать в следующих случаях:
- при использовании 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).
Local Security Authority Subsystem Service (LSASS), Session Manager (SMSS) и Service Control Manager все порты LPC (A) непосредственно взаимодействовать с клиентскими процессами. 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/
- ^ Russinovich, Соломон и Ионеску (2009 : 201)
- ^ Russinovich, Соломон и Ионеску (2009 : 203)
- ^ Russinovich, Соломон и Ионеску (2009 : 204)
Рекомендации
- Дабак, прасад; Борат, Милинд; Phadke, Sandeep (1999), Недокументированная Windows NT , Hungry Minds , ISBN 0-7645-4569-8
- Руссинович, Марк ; Соломон, Давид; Ионеску, Алекс (2009), Windows® Internals (5-е изд.), Microsoft Press , ISBN 0-7356-2530-1
Внешние ссылки
- Вызов локальных процедур на Wayback Machine (заархивировано 12 июня 2008 г.) - включает объяснение недокументированных функций
- Связь LPC