SPI由兩部分組成——傳輸服務提供者和命名空間服務提供者;
傳輸服務提供者(通常是指協議堆棧)是提供建立連接、傳輸數據、行使流控制、出錯控制的服務,他有兩種類型:分層的(LSP)和基礎的(BSP)。
BSP負責實現傳輸協議的真正細節,它導出Winsock接口,此接口直接實現協議;LSP將自己安裝到Winsock目錄中的基礎提供者上面,很可能在其他分增提供者之間,他截取來自應用程序的WinsockAPI調用。
LSP本身就是dll,可以將它安裝到Winsock目錄,以便創建套接字的應用程序不必知道此LSP的任何信息就能調用它。
安裝LSP
實現LSP之前,首先是要將分層提供者安裝到Winsock目錄,安裝LSP包括安裝一個WSAPROTOCAL_INFLOW結構,它定義了分層提供者的特性和LSP是如何填寫“鏈”的。安裝LSP就是向Winsock目錄中安裝一個WSAPROTOCAL_INFLOW結構,讓創建套接字的應用程序可以枚舉他。
協議鏈
LSP和基礎提供者連在一起形成了協議鏈,協議鏈描述了分層提供者加入Winsock目錄的順序。實現LSP的dll或者被另外一個LSP加載,或者直接擺Ws2_32.dll加載,取決於他在協議鏈中的位置。如果LSP沒有在協議鏈的頂層,他就會被鏈中位於它上層的LSP加載,否則的話,被Ws2_32.dll加載。不管是誰,加載LSP之後,必須首先調用哪個LSP導出的函數WSPStartup,並將包含在協議鏈的WSAPEOTOCOL_INFOW結構傳遞給這個函數。被加載的LSP再從協議鏈中找到爲自己下方的提供者,進而加載它。
安裝LSP,必須在Winsock目錄中安裝兩種協議:一個分層協議和一個協議鏈。安裝分層協議(ChainLen爲0)是爲了獲取Winsock庫分配的目錄ID號,以便在協議鏈中標識自己的位置。協議鏈纔是Winsock目錄中LSP的真正入口,鏈中包含了自己分層協議的目錄ID號和下層提供者的目錄ID號。安裝函數是
Int WSCInstallProvider
重新排序目錄,以便新安裝的LSP入口首先出現:
Int WSCWriteProviderOrder(LPDWORD lpwdCatalogEntryID,DWORDdwNumberOfEntries)
總結:安裝新的分層服務提供者,需要首先安裝分層協議入口,以便獲取系統分配的目錄ID號。分層協議安裝之後,在安裝一個或者多個協議鏈,安裝的數量取決於要分層的下層協議的數量。例如,要將LSP安裝在TCP、UDP和Raw之上,就要安裝3個協議鏈。然後在大多數情況下,需喲重新排序Winsock,以便應用程序調用LSP,而不是調用基礎提供者。
移除LSP
移除LSP時,先根據分層洗衣的GUID號找到其目錄ID號,然後逐個移除各個協議鏈,最後再移除分層協議的提供者。