LSP安装代码

// 003.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <windows.h>
#include "winsock2.h"
#include <stdio.h>
#include <ws2spi.h>
#include <tchar.h>
#include <string.h>
#include <sporder.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"Sporder.lib")

LPWSAPROTOCOL_INFOW protoinfo;
unsigned long protoinfosize;
int totalprotos;
GUID  TCPguid={0x4d1e91fd,0x116a,0x44aa,{0x8f,0xd4,0x1d,0x2c,0xf2,0x7b,0xd9,0xa9}};
GUID  TCPchainguid={0x4d1e91fd,0x116a,0x44aa,{0x8f,0xd4,0x1d,0x2c,0xf2,0x7b,0xd9,0xa9}};

/********    获得服务提供者信息    **********/
BOOL GetProviders()
{
	int errorcode;
	//这几个都是全局变量
	protoinfo = NULL;
	protoinfosize = 0;
	totalprotos = 0;

	//列举服务提供者,其实是为了获取LSP的数量
	if(WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode) == SOCKET_ERROR)
	{
		if(errorcode != WSAENOBUFS)
			return FALSE;
	}

	//按LSP数量分配内存空间
	if((protoinfo = (LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize)) == NULL)
	{
		return FALSE;
	}

	//获得所有LSP信息,保存在protoinfo
	if((totalprotos = WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode)) == SOCKET_ERROR)
	{
		return FALSE;
	}

	return TRUE;
}

void FreeProviders()
{
	GlobalFree(protoinfo);
}

/************TCP类型的LSP安装*************/

void InstallTCPProviders()
{
	int i;
	int provcnt;
	int CataIndex;
	int ErrorCode;
	DWORD LayercataId = 0,TCPorigcataid = 0;
	WCHAR DllPath[MAX_PATH];
	LPDWORD CataEntries;
	WSAPROTOCOL_INFOW LayerInfo,TCPchaininfo;
	WCHAR *p;
	
	//获取所有的服务提供者信息
	GetProviders();
	/***********下面是安装一个LSP的过程*************/
	//找到一个TCP的服务链,并存在LayerInfo和TCPchaininfo中,方便安装
	//LSP和服务链前进行改造
	for(i=0;i<totalprotos;i++)
	{
		if(protoinfo[i].iAddressFamily == AF_INET
			&& protoinfo[i].iProtocol == IPPROTO_TCP
			&& protoinfo[i].ProtocolChain.ChainLen>0)
		{
			memcpy(&LayerInfo,&protoinfo[i],sizeof(WSAPROTOCOL_INFOW));

			LayerInfo.dwServiceFlags1 = protoinfo[i].dwServiceFlags1 & (~XP1_IFS_HANDLES);
			
			TCPorigcataid = protoinfo[i].dwCatalogEntryId;

			memcpy(&TCPchaininfo,&protoinfo[i],sizeof(WSAPROTOCOL_INFOW));

			TCPchaininfo.dwServiceFlags1 = protoinfo[i].dwServiceFlags1 & (~XP1_IFS_HANDLES);

			break;

		}
	}
	
	//修改标识可读字符串
	wcscpy(LayerInfo.szProtocol,L"TCPProvider");
	
	//修改为分层协议
	LayerInfo.ProtocolChain.ChainLen = LAYERED_PROTOCOL;

	//获取当前程序所在路径
	GetFullPathName(L"FireWallDll.dll",MAX_PATH,DllPath,&p);

	//卸装LSP
	if(WSCDeinstallProvider(&TCPguid,&ErrorCode) == SOCKET_ERROR)
	{
		MessageBoxA(NULL,"WSCDeinstallProvider Error!",NULL,NULL);
		return;
	}
	MessageBox(NULL,L"卸装LSP成功",NULL,NULL);
	//安装这个LSP
	if(WSCInstallProvider(&TCPguid,DllPath,&LayerInfo,1,&ErrorCode) == SOCKET_ERROR)
	{
		MessageBoxA(NULL,"WSCInstallProvider Error: ",NULL,NULL);
		return;
	}
	MessageBox(NULL,L"安装LSP成功",NULL,NULL);

	//重新获得LSP信息
	FreeProviders();
	GetProviders();
	/***************下面是安装服务链的过程*******************/
	//通过自己定义的GUID找到刚刚安装的LSP的入口ID
	for(i=0;i<totalprotos;i++)
	{
		if(memcmp(&protoinfo[i].ProviderId,&TCPguid,sizeof(GUID))==0)
		{
			LayercataId = protoinfo[i].dwCatalogEntryId;
			break;
		}
	}
	provcnt = 0;
	//修改服务链的标志字符串
	wcscpy(TCPchaininfo.szProtocol,L"TCPFW");
	//修改为服务链
	if(TCPchaininfo.ProtocolChain.ChainLen == BASE_PROTOCOL)
	{
		TCPchaininfo.ProtocolChain.ChainEntries[1] = TCPorigcataid;
	}
	else
	{
		//将服务链上的入口ID重新排序
		for(i=TCPchaininfo.ProtocolChain.ChainLen;i>0;i--)
		{
			TCPchaininfo.ProtocolChain.ChainEntries[i+1] = TCPchaininfo.ProtocolChain.ChainEntries[i];
		}
	}
	//服务链长度加1
	TCPchaininfo.ProtocolChain.ChainLen++;
	//将服务链的第一个元素改为自己的LSP入口ID
	TCPchaininfo.ProtocolChain.ChainEntries[0] = LayercataId;
	//安装这个服务链
	if(WSCInstallProvider(&TCPchainguid,DllPath,&TCPchaininfo,provcnt,&ErrorCode) == SOCKET_ERROR)
	{
		return;
	}
	//重新获取LSP信息
	FreeProviders();
	GetProviders();
	/*******************下面是对所有LSP进行重新排序***********************/
	//为所有入口ID分配空间
	if((CataEntries = (LPDWORD)GlobalAlloc(GPTR,totalprotos*sizeof(WSAPROTOCOL_INFOW)))==NULL)
	{
		return;
	}
	//重新排序
	CataIndex = 0;
	//根据GUID找到自己的服务链和LSP,将其放在最前面
	for(i=0;i<totalprotos;i++)
	{
		if(memcmp(&protoinfo[i].ProviderId,&TCPguid,sizeof(GUID))==0
			||memcmp(&protoinfo[i].ProviderId,&TCPchainguid,sizeof(GUID))==0)
		{
			CataEntries[CataIndex++] = protoinfo[i].dwCatalogEntryId;
		}
	}
	//将其他LSP放在后面
	for(i=0;i<totalprotos;i++)
	{
		if(memcmp(&protoinfo[i].ProviderId,&TCPguid,sizeof(GUID))!=0
			&&memcmp(&protoinfo[i].ProviderId,&TCPchainguid,sizeof(GUID))!=0)
		{
			CataEntries[CataIndex++] = protoinfo[i].dwCatalogEntryId;
		}
	}
	//调用WSCWriteProviderOrder()进行重新排序
	if((ErrorCode == WSCWriteProviderOrder(CataEntries,totalprotos))!=ERROR_SUCCESS)
	{
		return;
	}
	FreeProviders();
	return;

}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	
	InstallTCPProviders();
	
	return 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、付费专栏及课程。

余额充值