簡介
本地過程調用(LPC,Local Procedure Call,通常也被稱為輕量過程調用或者本地進程間通信) 是一種由Windows NT核心提供的內部進程間通信方式。通過這一方式,同一計算機上的進程可以進行輕量的通信。在Windows Vista中,ALPC(Advanced Local Procedure Call,高級本地進程通信)替代了LPC。ALPC提供了一個高速可度量的通信機制,這樣便於實現需要在用戶模式下高速通信的用戶模式驅動程式框架(UMDF,User-Mode Driver Framework)。
實現
LPC由核心的“連線埠”對象實現,這樣可以確保全全(由訪問控制表規定持有特定的安全標識符才可以訪問)並可以驗證連結另一端進程的身份。程式也可以對每一個信息設定安全標識符,並測試對應信息的變化,以實現每一條訊息的安全性。
服務端和客戶端之間典型的連線由下列過程表示:
服務端進程建立命名伺服器連線連線埠對象,並等待客戶端連線;
客戶端通過向這一連線埠傳送訊息來建立連線;
如果服務端同意建立連線,便會建立兩個無名連線埠:
1.服務端進程建立命名伺服器連線連線埠對象,並等待客戶端連線;
2.客戶端通過向這一連線埠傳送訊息來建立連線;
3.如果服務端同意建立連線,便會建立兩個無名連線埠:
本地過程調用支持以下三種交換信息的方式:
•針對較簡訊息(小於256位元組):系統核心在進程間直接複製訊息,從傳送方的地址空間拷貝訊息至系統地址空間,之後再將訊息拷貝至接收方的地址空間。
•針對較長訊息(大於256位元組):這需要在傳送方和接收方之間建立一個共享記憶體區域。傳送方首先將訊息存放在共享記憶體中,再向接收方傳送一個通知(可以通過如上傳送短訊息的方式實現),之後再由接收方從共享記憶體中讀取這一訊息。
•當訊息的數據量過大,難以放入共享記憶體時,服務端可以直接讀取和寫入客戶端的地址空間。
高級本地過程調用(ALPC)擁有比以往的本地過程調用(LPC)更優的性能。因為LPC只能通過同步請求/應答機制通信,而ALPC還可以使用IOCP實現通信。這樣,ALPC就可以在訊息數量和進程數量間保持一定平衡,保證了連線埠的高速通信。此外,ALPC還允許信息的批量傳輸,減少了進程在用戶模式和核心模式之間的切換次數。
典型套用
本地過程調用在Windows NT及其衍生系統中得到了廣泛套用。在Win32子系統中,LPC套用於客戶端和子系統伺服器之間的通信(CSRSS)。在Windows NT 3.51版本中引入了快速LPC以提高調用速度。然而由於NT4.0中將部分關鍵服務端移入核心模式(win32k.sys)以提高系統效能,這一方法已基本被摒棄。
本地安全認證子系統服務(LSASS),會話管理器(SMSS)以及服務控制管理器均使用LPC連線埠和客戶進程直接通信。Winlogon和安全引用監視器與LSASS進程之間的通信同樣使用了LPC。
正如前文提到的,當訊息在同一計算機內傳輸時,Microsoft RPC將調用LPC進行通信。許多僅在同一計算機內進行通信的服務採用LPC作為唯一的通信方式。遠程對象連線與嵌入和分散式組件對象模型的實現也在很多地方使用了LPC作為本地通信的方式。