LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为“分层服务提供商”的机制进行扩展。Winsock LSP 可用于非常广泛的实用用途,包括 Internet 家长控制 (parental control) 和 Web 内容筛选。在以前版本的 Windows XP 中,删除不正确的(也称为“buggy”)LSP 可能会导致注册表中的 Winsock 目录损坏,潜在地导致所有网络连接的丢失。
请见代码
#define UNICODE#define _UNICODE#include <Winsock2.h>#include <Ws2spi.h>#include <Sporder.h>#include <Windows.h>#include <stdio.h>#include <tchar.h>#include "PhoenixLSP.h"#include "../common/Debug.h"#include "../common/PMacRes.h"#include "Acl.h"#pragma comment(lib, "Ws2_32.lib")CAcl g_Acl; // 访问列表,用来检查会话的访问权限WSPUPCALLTABLE g_pUpCallTable; // 上层函数列表。如果LSP创建了自己的伪句柄,才使用这个函数列表WSPPROC_TABLE g_NextProcTable; // 下层函数列表TCHAR g_szCurrentApp[MAX_PATH]; // 当前调用本DLL的程序的名称BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { // 取得主模块的名称 ::GetModuleFileName(NULL, g_szCurrentApp, MAX_PATH); } break; } return TRUE;}int WSPAPI WSPStartup( WORD wVersionRequested, LPWSPDATA lpWSPData, LPWSAPROTOCOL_INFO lpProtocolInfo, WSPUPCALLTABLE UpcallTable, LPWSPPROC_TABLE lpProcTable){ ODS1(L" WSPStartup... %s \n", g_szCurrentApp); if(lpProtocolInfo->ProtocolChain.ChainLen <= 1) { return WSAEPROVIDERFAILEDINIT; } // 保存向上调用的函数表指针(这里我们不使用它) g_pUpCallTable = UpcallTable; // 枚举协议,找到下层协议的WSAPROTOCOL_INFOW结构 WSAPROTOCOL_INFOW NextProtocolInfo; int nTotalProtos; LPWSAPROTOCOL_INFOW pProtoInfo = GetProvider(&nTotalProtos); // 下层入口ID DWORD dwBaseEntryId = lpProtocolInfo->ProtocolChain.