ローカルプロセス間通信[ 1 ] ( LPC 、ローカルプロシージャコールまたは軽量プロシージャコールとも呼ばれる) は、同じコンピュータ上のプロセス間の軽量IPCのためにMicrosoft Windows NTカーネルによって提供される、内部の非公開のプロセス間通信機能です。Windows Vista以降、LPC は非同期ローカルプロセス間通信[ 1 ] ( ALPC 、高度ローカルプロシージャコールとも呼ばれる)として書き直され、ユーザーモードドライバフレームワーク(UMDF)を効率的に実装するために必要な高速でスケーラブルな通信メカニズムを提供しています。UMDFのユーザーモード部分は、実行環境内の UMDF コンポーネントとの効率的な通信チャネルを必要とします。[ 2 ]
(A)LPCインターフェースは、Windows NTの非公開ネイティブAPIの一部であり、アプリケーションから直接使用することはできません。ただし、以下の場合には間接的に使用できます。
(A)LPCは、カーネルの「ポート」オブジェクトを使用して実装されています。このオブジェクトは、セキュリティ保護が可能であり(ACLを使用して、例えば特定のSIDのみが使用できるように設定できます)、接続先のプロセスを識別できます。個々のメッセージもセキュリティ保護が可能で、アプリケーションはメッセージごとにSIDを設定したり、(A)LPCメッセージに関連付けられたトークンのセキュリティコンテキストの変更をテストしたりできます。
サーバーとクライアント間の典型的な通信シナリオは以下のとおりです。
(A)LPCは、サーバーとクライアント間のメッセージ交換の次の3つのモードをサポートしています。[ 3 ]
ALPCは、従来のLPCインターフェースに比べてパフォーマンス上の利点があります。これは、LPCが独占的に使用する同期要求/応答メカニズムの代わりに、I/O完了ポートを使用するように構成できるためです。 [ 4 ]これにより、ALPCポートは高速通信が可能になり、メッセージ数とスレッド数を自動的にバランスさせることができます。さらに、ALPCメッセージはバッチ処理されるため、ユーザーモード/カーネルモードの切り替えを最小限に抑えることができます。
Windows NT の内部サブシステム間の通信では、(A)LPC が多用されています。Win32 サブシステムは、クライアントとサブシステムサーバ ( CSRSS ) 間の通信に (A)LPC を多用しています。これらの呼び出しを高速化するために、Windows NT バージョン 3.51 で Quick LPC が導入されました。しかし、パフォーマンスが重要なサーバ部分をカーネルモード (win32k.sys) に移行するため、この方法はバージョン 4.0 でほぼ廃止されました。
ローカルセキュリティ機関サブシステムサービス(LSASS)、セッションマネージャ(SMSS)、およびサービス制御マネージャはすべて、(A)LPCポートを直接使用してクライアントプロセスと通信します。Winlogonとセキュリティリファレンスモニタは、LSASSプロセスとの通信にこれを使用します。
前述のとおり、Microsoft RPC は、クライアントとサーバーが同じマシン上にある場合、トランスポートとして (A)LPC を使用できます。ローカル コンピューター内でのみ通信するように設計された多くのサービスは、RPC を介した唯一のトランスポートとして (A)LPC を使用します。リモートOLEおよびDCOMの実装でも、多くの場合、ローカル通信に (A)LPC が使用されます。