当前位置:首页 > 芯闻号 > 充电吧
[导读]【1】Winsock2 服务提供者接口(SPI):一、简述:1、一般用于提供给操作系统开发商、传输堆栈商在基础协议的基础上,开发更高级的服务.2、因为Winsock服务体系符合Windows开放服务体


【1】Winsock2 服务提供者接口(SPI):



一、简述:


1、一般用于提供给操作系统开发商、传输堆栈商在基础协议的基础上,开发更高级的服务.

2、因为Winsock服务体系符合Windows开放服务体系.所以,它支持第三方服务提供者插入到其中.

3、只要上层和下层的边缘支持Winsock2 SPI,即可向他们中间安装第三方提供者程序.

4、普通开发者一般都是开发SPI的LSP(分层服务提供者),即第三方提供者,可用于监控Winsock API执行,HOOK Winsock API,甚至利用LSP技术注入DLL.

5、基础协议(TCP、UDP、原始)的提供者其实就是DLL,编写分层协议提供者就是在编写DLL,然后安装在Winsock目录上,让系统上的所有使用基础协议的网络程序调用.


【重点】网络程序是如何调用Winsock2 服务提供者进行网络通讯:


1、当网络程序使用WSAStartup加载库时,系统并不做什么.

2、而是当程序真正创建套接字时,会先调用WSCEnumProtocols函数,遍历系统内安装的所有提供者(分层、基础、协议链),当先找到一个与要求使用的协议符合的,那么导出此提供者的DLL,才开始调用提供者的WSPStartup初始化函数,才能使用send,recv(TCP协议提供者的DLL)或sendto,recvfrom(UDP协议提供者的DLL)等函数的功能.


二、SPI(服务提供者接口)由两个部分组成:


  一、传输服务提供者:


1、提供建立连接、传输数据、流控制、出错控制。

2、共两种类型:

基础服务提供者:

实现传输协议的细节,导出Winsock接口(此接口直接实现协议). //TCP、UDP、原始

一般都有与之关联的内核模式协议驱动,TCP、UDP由系统内的Tcpip.sys驱动。


分层服务提供者(LSP):

将自己安装到Winsock目录(Winsock目录的概念在下面)中基础提供者(TCP/UDP)的上一层,也可能安装在其他提供者之间,可截获程序的Winsock API。

依靠基础服务提供者作为通信基础,实现更高层的通信函数。


二、命名空间服务提供者:


1、与传输服务提供者相似,可截获名称解析API(gethostbyname、WSALookupServiceBegin)的调用.

2、此类提供者需在命名空间目录安装自己.


【2】SPI(服务提供者)函数集合类型: 

    

 头文件:ws2spi.h

SPI函数类型总数:4种类型,每一种类型都有自己所属的开头,例如WSC、WSP


WSC 安装、移除、修改分层服务提供者和命名空间提供者程序 WSP 分层服务提供者的API WPU 分层服务提供者使用的支持函数 NSP 命名空间服务提供者的API

【3】Winsock协议目录的概念:



一、SPI提供三种协议:


1、分层协议:处在基础协议的上一层,依靠基础协议作为通信基础。

2、基础协议:能够独立、安全、远程端点实现数据通信的协议。

3、协议链:将一系列基础协议和分层协议按特定顺序连接在一起。


注意:只有管理员用户组能够安装、移除Winsock目录入口!



二、WSAPROTOCOL_INFO结构体:


说明:描述某个协议(分层协议、基础协议)的完整信息,一个WSAPROTOCOL_INFO结构体称为一个Winsock目录入口。

typedef struct _WSAPROTOCOL_INFOW {
    DWORD dwServiceFlags1;       //描述[协议]提供的服务的位掩码
    DWORD dwServiceFlags2;       //保留
    DWORD dwServiceFlags3;       //保留
    DWORD dwServiceFlags4;       //保留
    DWORD dwProviderFlags;       //此[协议]在[Winsock目录]中的[表示方式]
    GUID ProviderId;                      //由[服务提供商]安排的GUID唯一标示符
    DWORD dwCatalogEntryId;      //WS2_32.DLL为每一个WSAPROTOCOL_INFOW结构安排的唯一标示符(目录入口ID)


    WSAPROTOCOLCHAIN ProtocolChain; /*1)与[此协议]相关联的WSAPROTOCOLCHAIN结构.
                                                                     2)说明了[此协议]在[分层协议]中所处的位置.*/

    int iVersion;                       //[协议]版本标示符
    int iAddressFamily;            //传递给socket/WSASocket函数的[地址加载参数]   
    int iMaxSockAddr;              //地址的最大长度(以字节为单位)
    int iMinSockAddr;               //地址的最小长度(以字节为单位)
    int iSocketType;                 //传递给socket函数的[套接字类型参数]
    int iProtocol;                       //传递给socket函数的[协议参数]
    int iProtocolMaxOffset;       //添加到iProtocol的最大值
    int iNetworkByteOrder;       //顺序类型:大尾顺序(BIGENDIAN),小尾顺序(LITTLEENDIAN)
    int iSecurityScheme;          //安全方案

    DWORD dwMessageSize;         /*[此协议]支持的最大消息长度(以字节为单位)
                                   1)0为基于流协议(如TCP),没有最大长度的概念.
                                   2)1为发送消息的最大长度依赖于下层网络的MTU(最大传输单元),在套接字绑定后,应使用SO_MAX_MSG_SIZE套接字选项.
                                     获取发送消息的最大长度.
                                   3)-1为此协议是基于消息的,但是对发送的消息没有最大长度的限制.
                                 */  

    DWORD dwProviderReserved;                            //保留给服务提供者使用.
    WCHAR  szProtocol[WSAPROTOCOL_LEN+1];  //随意编辑的,此协议的可读字符串.一般用于说明是什么协议
} WSAPROTOCOL_INFOW, FAR * LPWSAPROTOCOL_INFOW;


【4】遍历系统所有已安装的协议:


一、使用的API函数:int WSAEnumProtocols(
  LPINT                                 lpiProtocols,     
  LPWSAPROTOCOL_INFO lpProtocolBuffer,  
  LPDWORD                          lpdwBufferLength
);

返回值:系统中安装的协议数量,失败为SOCKET_ERROR.

参数1:一个数组
1、NULL为函数将返回所有协议.
2、否则只检索数组中列出的那些协议.

参数2:取信息的缓冲区

参数3:参数2缓冲区的长度

1、如果参数2为NULL,参数3为0,执行后,WSAENOBUFS错误,参数3包含了所需的缓冲区长度.


注意:此函数仅能够遍历基础协议、协议链,但是不能遍历分层协议.


二、支持遍历分层协议的函数,功能与上面相同:


函数:intWSCEnumProtocols(
  LPINT lpiProtocols,
  LPWSAPROTOCOL_INFOW lpProtocolBuffer,
  LPDWORD lpdwBufferLength,
  LPINT lpErrno 
);

返回值、参数1~参数3:与WSAEnumProtocols函数相同。

参数4:相当于WSAGetLastError()执行的结果


注意:因为SPI是用于开发系统组件的函数,所以他只使用Unicode字符串,与Windows系统相对应。


【5】遍历系统内安装的所有协议例子:

头文件:


#pragma once
#include#include#include#include#include#includeusing namespace std;
#pragma warning(disable:4996)
#pragma comment(lib, "Ws2_32.lib")
//系统安装协议遍历实验
class ProtocolTraversestheExperiment
{
public:
ProtocolTraversestheExperiment()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
}
~ProtocolTraversestheExperiment()
{
WSACleanup();
}
LPWSAPROTOCOL_INFO GetProvider(LPINT lpnTotalProtocols)
{
DWORD dwSize = 0;
LPWSAPROTOCOL_INFO pProtoInfo = NULL;
if (WSAEnumProtocols(NULL, pProtoInfo, &dwSize) == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAENOBUFS)
return NULL;
}
pProtoInfo = (LPWSAPROTOCOL_INFO)new WSAPROTOCOL_INFO[dwSize / sizeof(WSAPROTOCOL_INFO)];
if (!pProtoInfo)
return NULL;
ZeroMemory(pProtoInfo, dwSize);
*lpnTotalProtocols = WSAEnumProtocols(NULL, pProtoInfo, &dwSize);
return pProtoInfo;
}
void FreeProvider(LPWSAPROTOCOL_INFO pProtoInfo,int i)
{
if(i == 1)
delete pProtoInfo;
else
   delete[] pProtoInfo;
}
};



源文件:


#include "Hello.h"
int main(int argc,char** argv)
{
system("color 4e");
ProtocolTraversestheExperiment s;
int ProtocolsCount = 0;
LPWSAPROTOCOL_INFO info = s.GetProvider(&ProtocolsCount);
if (ProtocolsCount != 0)
{
for (int i = 0; i < ProtocolsCount; i++)
{
wprintf(_T("Protocol:%s rn"), info[i].szProtocol);
wprintf(_T("CatalogEntryId:%d         ChainLen:%d nn"), info[i].dwCatalogEntryId, info[i].ProtocolChain.ChainLen);
}
s.FreeProvider(info, ProtocolsCount);
}
getchar();
return 0;
}

执行:




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭