ローカルプロセス間通信[1] ( LPC 、ローカルプロシージャコールまたは軽量プロシージャコールとも呼ばれる) は、同じコンピュータ上のプロセス間の軽量IPC用にMicrosoft Windows NTカーネルによって提供される、内部の文書化されていないプロセス間通信機能です。Windows Vistaでは、 LPC は非同期ローカルプロセス間通信[1] ( ALPC 、高度ローカルプロシージャコールとも呼ばれる)に書き直され、ユーザーモード部分で実行システム内の UMDF コンポーネントとの効率的な通信チャネルを必要とするユーザーモードドライバーフレームワーク(UMDF)を効率的に実装するために必要な高速でスケーラブルな通信メカニズムを提供しました。[2]
(A)LPC インターフェイスは、Windows NT の文書化されていないネイティブ APIの一部であり、アプリケーションで直接使用することはできません。ただし、次の場合には間接的に使用できます。
- Microsoft RPC APIを使用してローカル通信する場合、つまり同じマシン上のプロセス間で通信する場合
- (A)LPCで実装されたWindows APIを呼び出すことによって(下記参照)
実装
(A)LPC は、カーネルの「ポート」オブジェクトを使用して実装されます。このオブジェクトはセキュリティ保護可能 ( ACLにより、たとえば特定のSIDのみが使用できるように許可する) であり、接続の反対側のプロセスを識別できます。個々のメッセージもセキュリティ保護可能です。アプリケーションはメッセージごとに SID を設定でき、(A)LPC メッセージに関連付けられたトークンのセキュリティ コンテキストの変更をテストすることもできます。
サーバーとクライアント間の一般的な通信シナリオは次のとおりです。
- サーバー プロセスは、最初に名前付きサーバー接続ポートオブジェクトを作成し、クライアントが接続するのを待機します。
- クライアントは、接続メッセージを送信して、その名前付きポートへの接続を要求します。
- サーバーが接続を受け入れると、名前のないポートが 2 つ作成されます。
- クライアント通信ポート- クライアントスレッドが特定のサーバーと通信するために使用します
- サーバー通信ポート- サーバーが特定のクライアントと通信するために使用します。クライアントごとに 1 つのポートが作成されます。
- クライアントはクライアント通信ポートへのハンドルを受信し、サーバーはサーバー通信ポートへのハンドルを受信し、プロセス間通信チャネルが確立されます。
(A)LPCは、サーバーとクライアント間のメッセージ交換の次の3つのモードをサポートしています。[3]
- 短いメッセージ (256 バイト未満) の場合、カーネルはプロセス間でメッセージ バッファーをコピーします。コピーは、送信プロセスのアドレス空間からシステム アドレス空間へ、そしてそこから受信プロセスのアドレス空間へ行われます。
- 256 バイトを超えるメッセージの場合、データの転送には共有メモリ セクションを使用する必要があります。この共有メモリ セクションは、(A)LPC サービスによって送信プロセスと受信プロセスの間でマッピングされます。まず、送信側がデータを共有メモリに配置し、次に、共有メモリ セクション内の送信データを指す通知 ((A)LPC の最初の方法を使用した小さなメッセージなど) を受信プロセスに送信します。
- データ量が共有セクションに収まらないほど大きい場合、サーバーはクライアントのアドレス空間からデータを直接読み書きできます。
ALPCは、LPCが排他的に使用する同期要求/応答メカニズムの代わりにI/O完了ポートを使用するように構成できるため、以前のLPCインターフェースよりもパフォーマンス上の利点があります。 [4]これにより、ALPCポートはメッセージとスレッドの数を自動的にバランスさせる高速通信が可能になります。さらに、ALPCメッセージをまとめてバッチ処理できるため、ユーザーモード/カーネルモードの切り替えを最小限に抑えることができます。
既知の使用法
(A)LPC は、Windows NT の内部サブシステム間の通信で頻繁に使用されます。Win32 サブシステムは、クライアントとサブシステム サーバー ( CSRSS ) 間の通信に (A)LPC を頻繁に使用します。これらの呼び出しを高速化するために、Windows NT バージョン 3.51 でクイック LPC が導入されました。この方法は、パフォーマンスが重要なサーバー部分をカーネル モード (win32k.sys) に移動したため、バージョン 4.0 ではほとんど使用されなくなりました。
ローカルセキュリティ機関サブシステム サービス(LSASS)、セッション マネージャー(SMSS)、およびサービス コントロール マネージャーはすべて、(A)LPC ポートを直接使用してクライアント プロセスと通信します。Winlogonとセキュリティ リファレンス モニターは、これを使用して LSASS プロセスと通信します。
前述のように、Microsoft RPC は、クライアントとサーバーの両方が同じマシン上にある場合に、(A)LPC をトランスポートとして使用できます。ローカル コンピューターでのみ通信するように設計された多くのサービスは、RPC 経由の唯一のトランスポートとして (A)LPC を使用します。リモートOLEおよびDCOMの実装では、多くの場合、ローカル通信にも (A)LPC が使用されます。
参照
注記
- ^ ab 「LPC (ローカル プロシージャ コール) パート 1 アーキテクチャ」。Microsoft Docs。
- ^ ルシノビッチ、ソロモン、イオネスク (2009:201)
- ^ ルシノビッチ、ソロモン、イオネスク (2009:203)
- ^ ルシノビッチ、ソロモン、イオネスク (2009:204)
参考文献
- ダバック、プラサド、ボレート、ミリンド、ファドケ、サンディープ (1999)、『Undocumented Windows NT』、Hungry Minds、ISBN 0-7645-4569-8
- マーク・ルシノビッチ;ソロモン、デイビッド。 Alex Ionescu (2009)、Windows® Internals (第 5 版)、Microsoft Press、ISBN 978-0-7356-2530-3
外部リンク
- ウェイバックマシンのローカルプロシージャコール(2008年6月12日アーカイブ)—文書化されていない関数の説明が含まれています
- LPC通信
