LSP(分层服务提供者)

LSP是DLL形式的服务提供者,用于在Winsock中创建自定义套接字功能。它通过导出与Winsock API对应的SPI函数,实现对Winsock调用的拦截。安装LSP涉及创建协议链,其中包含分层协议和下层提供者的目录ID。安装过程包括安装分层协议获取目录ID,创建协议链结构,以及重新排序winsock目录以确保新LSP被调用。安装需要提供LSP的GUID和WSAPROTOCOL_INFOW结构,并可能使用UUIDGEN或UuidCreate生成GUID。
摘要由CSDN通过智能技术生成

LSP本身是DLL,可以将它安装到winsock目录,以便创建套接字的应用程序不必知道此LSP的任何信息就能调用它。

运行原理:

  套接字创建函数会在winsock目录中寻找合适的协议

  调用此协议,的提供者导出的函数 完成各种功能。

编写目的:

  让用户调用自定义的服务提供者,有自定义的服务提供者调用下层提供者。这样便截获所有的winsock调用了。

 

服务提供者本身是DLL,导出一些与winsock API相对应的SPI函数。winsock库加载服务提供者时,便依靠这些函数来实现winsockAPI。

LSP也是如此,它向上导出所有的SPI函数供 Ws2_32.dll调用,在内部通过调用基础提供者实现这些SPI


安装LSP:

实现LSP之前,要先将分层提供者安装到winsock目录,安装包括一个WSAPPROTOCOL_INFOW结构,定义了分层提供者的特性和LSP填写链的方式。(也叫做协议入口)


 

协议链:

  协议链描述了 分层提供者 加入winsock的目录的顺序。

typedef struct _WSAPROTOCOLCHAIN{
  int ChainLen;
  DWORD ChainEntries[Max_PROTOCOL_CHAN];
}WSAPROTOCOLCHAIN,*LPWSAPROTOCOLCHAIN;

ChainLen为0:分层协议  为1 基础协议   大于1 协议链

当ChainLen为0或者1时,ChainEntries数组无意义

大于1时,各个服务提供者的目录ID就包含在数组中。

 

实现LSP的DLL要么被另一个LSP加载,要么直接被WS2_32.DLL加载。取决于它的位置。

如果LSP没有在协议链的顶端,就会被链中位于它上层的LSP加载,否则的话,将被WS2_32.DLL加载。

 

安装LSP时,必须在winsock目录中安装两种协议:一个分层协议,一个协议链

安装分层协议视为了获取winsock库分配的目录ID号,一边在协议链中标识自己的位置。

协议链才是winsock目录中LSP的真正入口,连中包含了自己分层协议的目录ID号和下层提供者的目录ID号。

 

在安装时,要先安装一个分层协议,用系统分配给此分层协议的目录ID下层提供者的目录ID构建一个 ChainEntries数组,进而构建一个WSAPROTOCOL_INFOW结构,然后再安装这个协议链


安装函数:

提供LSP GUID DLL WSAPROTOCOL_INFOW结构便可。

int WSCInstallProvider(
const LPGUID lpProviderId,
const LPWSTR lpszProviderDllPath,
const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
DWORD dwNumberOfEntries,
LPINT lpErrno
);

每一个安装提供者需要一个GUID来标识它的入口,GUID可以通过命令行工具UUIDGEN或者在编程使用UuidCreate函数来生成。

LSP的WSAPROTOCOL_INFOW结构通常从它要分层的下层提供者拷贝

1 szProtocol域要修改,以包含新提供者的名称

2 如果包含XP1_IFS_HANDLES标识,要从dwServiceFlags1域移除。


 

重新目录排序  WSCWriteProviderOrder

新安装的LSP会默认安装到winsock目录的结尾,这样系统调用的时候,还是会调用原先调用的LSP,因此只有进行重新的排序才能让系统调用到新安装的LSP。


总结:

  1 安装分层协议入口,以便获取系统分配的目录ID号。

  2 安装一个或者多个协议链,安装的数量取决于要分层的下层协议的数量。

  3 在结尾进行目录排序


示例代码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cad经典LSP文件,各种应用实例 如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高 您的工作效率。下面的程序均以源程序方式给出,您可以使用、参考、修改它。 bg.lsp --- 表格自动生成 asc.lsp --- 将文本文件内容写入图中,字符是单个的 wf.lsp --- 将图中字符写入磁盘 exstr.lsp --- 将字符串分解成单字 pgtxt.lsp --- 将字符合成字符串 pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --- 直接修改文字内容或块属性 ct.lsp --- 对数字串进行加减 chh.lsp --- 直接修改文字高度 chhw.lsp --- 直接修改文字高宽比(针对PKPM软件将字符定位点改为左下角) chst.lsp --- 直接修改文字字体 txt.shx --- 修改后的标准txt.shx文件。(kuozhan.sld为增强的内容幻灯片) tiao.lsp --- 配合修改过的标准字体文件,将中文字符调大 tiao1.lsp --- 配合修改过的标准字体文件,将英文字符调小 untiao.lsp --- 上两个程序的复原 sht.lsp --- 在图中查找字符串 zhuang.lsp --- 桩点及钎探号绘制(勘测图) dim.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:1) dimm.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:100) di1.lsp~di8.lsp --- 直接连续标注尺寸(用于1:1的图) di100.lsp~di800.lsp --- 直接连续标注尺寸(用于1:100的图)   brk.lsp --- 将一线条在与其它线条相交处断开 peditx.lsp --- 成批修改线条的线宽 ex.lsp --- 分别或一起或通过层来炸开块、尺寸标注及PLINE线 chcr.lsp --- 修改园和园弧的半径 lay.lsp --- 通过点取层上一实体来实现层操作:删除/解冻/冻结 bg0.lsp --- 直接将正负零标注在图纸中(建筑结构图用) bg1.lsp~bg4.lsp --- 标注各种标高 hu.lsp --- 直接给出园弧长度 jdx.lsp --- 截断线 jdx2.lsp --- 双截断线 bdgj.lsp --- 板底钢筋(土建结构图用) bdgj1.lsp,bdgj2.lsp --- 板顶钢筋(土建结构图用) dk1.lsp~dk8.lsp --- 配合PKPM软件生成的图绘洞口(基础留洞) gl1.lsp~gl8.lsp --- 配合PKPM软件生成的图绘过梁(结构平面图) gzz.lsp --- 构造柱绘制 ACAD.LIN --- 增强的线型文件, 扩充线型(线型比例为1)如下: XX -- 虚线(用于1:1的图) DHX -- 点划线(用于1:1的图) XX100 -- 虚线(用于1:100的图) DHX100 -- 点划线(用于1:100的图) ACAD.LSP --- 增强的ACAD启动文件, 命令扩展如下: CHXX -- 将线型改为虚线(用于1:1的图) CHDHX -- 将线型改为点划线(用于1:1的图) CHXX100 -- 将线型改为虚线(用于1:100的图) CHDHX100 -- 将线型改为点划线(用于1:100的图) CHCON -- 将线型改为连续线 CHC -- 直接修改实体的颜色 其余详见ACAD.LSP的内容。ACAD的命令缩写根据其使用的频率作了调整。 V -- 先执行ZOOM E, 再将当前视图存储,并调用ZOOM W 此命令主要为"超级视图"做准备,"超级视图"妙处一用便知 ! 建议使用显 示卡自带的AutoCAD显示驱动 增强后的ACAD.LSP能在状态行上显示当前文件名 ACAD.MNU的改进: 调整了光标菜单(共两页),并将最常用的捕捉方式定义 在组合光标键上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值