当前位置:   article > 正文

安装LSP分层服务的理解_c++安装lsp服务

c++安装lsp服务

要安装在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;
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/620486
推荐阅读
相关标签
  

闽ICP备14008679号