分類分層服務提供者和應用程式

注意

分層服務提供者已被取代。 從 Windows 8 和 Windows Server 2012 開始,請使用 Windows 篩選平臺

 

Winsock 2 可容納分層通訊協定。 分層通訊協定是只實作較高層級通訊函式的通訊協定,而依賴基礎傳輸堆疊來實際與遠端端點交換數據。 分層通訊協定或分層服務提供者的範例是一個安全性層,可將通訊協定新增至連線建立程式,以便執行驗證,並建立加密配置上共同同意的協定。 這類安全性通訊協定通常需要基礎可靠傳輸通訊協議的服務,例如 TCP 或 SPX。 基底提供者所實作的基底通訊協定一詞是指實作 TCP 或 SPX 等通訊協定的 Winsock 提供者,該通訊協定能夠與遠端端點執行數據通訊。 分層通訊協定一詞是用來描述無法獨立通訊協定的通訊協定。 這些分層通訊協定會安裝為 Winsock 分層服務提供者(LSP)。

LSP 的範例是安裝在用戶端上的因特網隔離和驗證伺服器 (ISA) 中的 Microsoft 防火牆用戶端服務提供者。 Microsoft 防火牆用戶端服務提供者會透過 TCP 和 UDP 的 Winsock 基底提供者進行安裝。 ISA 防火牆用戶端軟體中的動態連結庫 (DLL) 會成為所有 Winsock 應用程式透明使用的 Winsock 分層服務提供者。 如此一來,ISA 防火牆用戶端 LSP 就可以攔截來自用戶端應用程式的 Winsock 函式呼叫,然後在目的地為本機或 ISA Server 電腦上的防火牆服務時,將要求路由傳送至原始基礎服務提供者。 類似的 LSP 會安裝為 Microsoft Forefront Firewall Service 和用戶端上的威脅管理閘道 (TMG) 用戶端的一部分。

在 LSP 初始化期間,LSP 必須提供一些 Winsock 服務提供者介面 (SPI) 函式的指標。 這些函式會在正常處理期間由 LSP 正上方的層呼叫(另一個 LSP 或 Ws2_32.DLL)。

根據 LSP 實作的 SPI 函式子集,以及針對每個函式執行的額外處理本質,可以定義 LSP 類別。 藉由分類 LSP,以及分類使用 Winsock 套接字的應用程式,可以選擇性地判斷 LSP 是否應該參與運行時間的指定進程。

在 Windows Vista 和更新版本上,會提供新的方法來分類 Winsock 分層服務提供者和應用程式,以便只載入特定的 LSP。 新增這些功能有幾個原因。

其中一個主要原因是某些系統關鍵進程,例如 winlogon 和 lsass 會建立套接字,但這些進程不會使用這些套接字來傳送網路上的任何流量。 因此,大部分的 LSP 不應該載入這些進程。 也記錄了許多案例,其中 Buggy LSP 可能會導致 lsass.exe 當機。 如果 lsass 當機,系統會強制關機。 這些系統進程載入 LSP 的副作用是,這些進程永遠不會結束,因此,安裝或移除 LSP 時,需要重新啟動。

次要原因是在某些情況下,應用程式可能不想載入特定 LSP。 例如,某些應用程式可能不想載入密碼編譯 LSP,這可能會導致應用程式無法與其他未安裝 cyptographic LSP 的系統通訊。

最後,其他 LSP 可以使用 LSP 類別來判斷 Winsock 通訊協定鏈結中應該安裝的位置。 多年來,各種 LSP 開發人員都想要瞭解 LSP 的行為方式。 例如,檢查數據流的 LSP 想要高於加密數據的 LSP。 當然,LSP 分類的這個方法並不是傻瓜證明,因為它依賴第三方 LSP 來適當地分類自己。

Windows Vista 和更新版本中的 LSP 分類和其他安全性增強功能旨在協助防止使用者意外安裝惡意 LSP。

LSP 類別

在 Windows Vista 和更新版本上,LSP 可以根據它與 Windows Sockets 呼叫和數據互動的方式進行分類。 LSP 類別是 Winsock SPI 函式子集上可識別的行為群組。 例如,HTTP 內容篩選條件會分類為數據偵測器(LSP_INSPECTOR類別)。 LSP_INSPECTOR類別會檢查數據傳輸 SPI 函式的參數(但不會改變)。 應用程式可以查詢 LSP 的類別,並選擇不要根據 LSP 類別和應用程式允許的 LSP 類別集載入 LSP。

下表列出 LSP 可分類的類別。

LSP 類別 描述
LSP_CRYPTO_COMPRESS LSP 是密碼編譯或數據壓縮提供者。
LSP_FIREWALL LSP 是防火牆提供者。
LSP_LOCAL_CACHE LSP 是本機快取提供者。
LSP_INBOUND_MODIFY LSP 會修改輸入數據。
LSP_INSPECTOR LSP 會檢查或篩選數據。
LSP_OUTBOUND_MODIFY LSP 會修改輸出數據。
LSP_PROXY LSP 會作為 Proxy 並重新導向封包。
LSP_REDIRECTOR LSP 是網路重新導向器。
LSP_SYSTEM LSP 可用於服務和系統進程。

 

LSP 可能屬於一個以上的類別。 例如,防火牆/安全性 LSP 可以同時屬於偵測器 (LSP_INSPECTOR) 和防火牆 (LSP_FIREWALL) 類別。

如果 LSP 沒有類別集,則會將其視為 [所有其他] 類別。 此 LSP 類別不會載入服務或系統進程(例如 lsass、winlogon 和許多 svchost 進程)。

分類 LSP

Windows Vista 和更新版本有數個新函式可供分類 LSP:

為了分類 LSP, 會使用 GUID 呼叫 WSCSetProviderInfoWSCSetProviderInfo32 函式,以識別 LSP 隱藏專案、要為此 LSP 通訊協定專案設定的資訊類別,以及一組用來修改函式行為的旗標。

WSCGetProviderInfoWSCGetProviderInfo32 函式同樣用來擷取與 LSP 資訊類別相關聯的數據。

分類應用程式

Windows Vista 和更新版本有數個新函式可供分類應用程式:

為了分類應用程式, 會呼叫 WSCSetApplicationCategory 函式,其中包含可執行映像的載入路徑來識別應用程式、啟動應用程式時所使用的命令行自變數,以及此應用程式所有實例允許的 LSP 類別。

WSCGetApplicationCategory 函式同樣用來擷取與應用程式相關聯的分層服務提供者 (LSP) 類別。

判斷要載入哪些 LSP

LSP 分類的最後一部分是判斷哪些 LSP 將載入至哪些進程。 當行程載入 Winsock 時,會針對所有已安裝的 LSP,對應用程式類別和 LSP 類別進行下列比較:

  • 如果應用程式未分類,允許將所有 LSP 載入進程。
  • 如果應用程式和 LSP 都有指派的類別,則下列所有項目都必須成立:
    應用程式指定的類別中至少有一個 LSP 類別存在。
    LSP 類別中只會指定應用程式指定類別中指定的類別。 例如,如果應用程式指定類別,它必須位於 LSP 的類別中。
    如果LSP_SYSTEM類別存在於應用程式的類別中,它必須存在於 LSP 的類別中。

注意

如果未分類 LSP,則其類別實際上為零。 若要讓相符項目發生,所有 LSP 的指定類別都必須出現在應用程式的類別中(應用程式的類別必須是 LSP 類別的超集),並注意,如果LSP_SYSTEM存在於應用程式的類別中,它也必須出現在 LSP 類別中。

 

請考慮下列範例:

Foo.exe 應用程式分類為 LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS。 應用程式 Bar.exe 分類為 LSP_FIREWALL + LSP_CRYPTO_COMPRESS。 系統上已安裝四個 LSP:

  • LSP1 已設定LSP_SYSTEM類別。
  • LSP2 未設定類別,因此其類別為零。
  • LSP3 已設定LSP_FIREWALL類別。
  • LSP4 已設定類別LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS + LSP_INSPECTOR

在此範例中 ,Foo.exe 應用程式只會載入 LSP1,而 Bar.exe 應用程式會載入 LSP3。

判斷已安裝 Winsock 提供者

Microsoft Windows 軟體開發工具包 (SDK) 包含範例 Winsock 程式,可用來判斷安裝在本機電腦上的 Winsock 傳輸提供者。 根據預設,此 Winsock 範例的原始程式碼會安裝在下列 Windows SDK for Windows 7 目錄中:

C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\NetDs\winsock\LSP

此範例是安裝和測試分層服務提供者的公用程式。 但它也可以用來以程式設計方式從本機電腦上的 Winsock 目錄收集詳細資訊。 若要列出所有目前的 Winsock 提供者,包括基底提供者和圖層服務提供者,請建置此 Winsock 範例並執行下列控制台命令:

instlsp -p

輸出將會是本機計算機上安裝的 Winsock 提供者清單,包括分層服務提供者。 輸出會列出 Winsock 提供者的目錄識別碼和字串名稱

若要收集所有 Winsock 提供者的詳細資訊,請執行下列主控台命令:

instlsp -p -v

輸出將會是本機計算機上支援的WSAPROTOCOL_INFO結構清單

如需本機電腦上唯一安裝的分層服務提供者清單,請執行下列控制台命令:

instlsp -l

若要對應 LSP 結構,請執行下列主控台命令:

instlsp -m

注意

TDI 功能已被取代,並將在未來的 Microsoft Windows 版本中移除。 視您使用 TDI 的方式而定,請使用 Winsock 核心 (WSK) 或 Windows 篩選平臺 (WFP)。 如需 WFP 和 WSK 的詳細資訊,請參閱 Windows 篩選平臺Winsock 核心。 如需有關 WSK 和 TDI 的 Windows 核心網路部落格文章,請參閱 Winsock 核心簡介 (WSK)。