// 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;
}
LSP安装代码
最新推荐文章于 2023-09-21 11:34:55 发布