赞
踩
要安装在udp之上.(代码来源网络)
1。枚举所有的,找到UDP的入口WSAPROTOCOL_INFOW
2。拷备一个WSAPROTOCOL_INFOW到2个变量中,下面安装的的LSP需要分层和协议链
WSAPROTOCOL_INFOW inf1,inf2
3。修改几个必要的字段和标志位
4。然后把这个分层服务inf1安装上去
5。再一次枚举所有的,找到刚刚安装的LSP,获得系统分配的dwCatalogEntryId
6。修改inf2中的ProtocolChain结构,如下修改:
如果inf2是基础协议1的话,ProtocolChain.ChainLen++,给它添加一个分层服务(这时
候这个inf2也变成一个协议链了),然后把它原来的dwCatalogEntryId往后移一位
如果inf2是协议链>2的话,ProtocolChain.ChainLen++,在原来的协议链增加多一个分
层,然后循环把ProtocolChain.ChainEntries数组的元素各个往后移。
以上两个完成之后,把ProtocolChain.ChainEntries[0]设置为第5步获得的
dwCatalogEntryId
然后把这个inf2安装上去
7。循环扫描一次所有的,找到我们在6中安装的协议链,(协议链,所以>1)
// 添加我们的协议链,(在数组前面)
for(i=0; i<nProtocols; i++)
{
if((pProtoInfo[i].ProtocolChain.ChainLen > 1) && (pProtoInfo
[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId))
{
dwIds[nIndex++] = pProtoInfo[i].dwCatalogEntryId;
}
}
// 添加其它协议
for(i=0; i<nProtocols; i++)
{
if((pProtoInfo[i].ProtocolChain.ChainLen <= 1) || (pProtoInfo
[i].ProtocolChain.ChainEntries[0] != dwLayeredCatalogId))
{
dwIds[nIndex++] = pProtoInfo[i].dwCatalogEntryId;
}
}
最后再调用。。。。。。。
WSCWriteProviderOrder(dwIds, nIndex)
这时候我们的协议链就是最顶了,而且ProtocolChain.ChainEntries[0]是我们安装的
lsp
=============================================================================
====================
// 卸载LSP
//
BOOL RemoveProvider()
{
LPWSAPROTOCOL_INFOW pProtoInfo;
int nProtocols;
DWORD dwLayeredCatalogId;
// 根据Guid取得分层协议的目录ID号
pProtoInfo = GetProvider(&nProtocols);
int nError;
for(int i=0; i<nProtocols; i++)
{
if(memcmp(&ProviderGuid, &pProtoInfo[i].ProviderId, sizeof
(ProviderGuid)) == 0)
{
dwLayeredCatalogId = pProtoInfo[i].dwCatalogEntryId;
break;
}
}
if(i < nProtocols)
{
// 移除协议链
for(i=0; i<nProtocols; i++)
{
if((pProtoInfo[i].ProtocolChain.ChainLen > 1) && (pProtoInfo
[i].ProtocolChain.ChainEntries[0] == dwLayeredCatalogId))
{
::WSCDeinstallProvider(&pProtoInfo[i].ProviderId, &nError);
}
}
// 移除分层协议
::WSCDeinstallProvider(&ProviderGuid, &nError);
}
return TRUE;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。