版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 Winsock服务提供者接口(SPI)*1内容提要 SPI概述 Winsock协议目录 分层服务提供者(LSP) 基于SPI的数据包过滤实例*2 Winsock 2 是围绕着Windows开放系统架构(Windows Open System Architecture,WOSA)来设计的,WOSA在Winsock和Winsock应用程序之间有一个标准API;在Winsock和Winsock服务提供者(比如TCP/IP)之间有一个标准的SPI。概述*3图7-1 Winsock 2的WOSA架构*4 传输服务提供者传输服务提供者(Transport Service providers,一般称
2、作协议栈,比如TCP/IP)即能够提供建立通信、传输数据、日常数据流控制和错误控制等功能的服务。类型:分层的(Layered),基础的(Base)基础服务提供者负责实现传输协议的真正细节,导出Winsock接口,此接口直接实现协议。分层服务提供者将自己安装到Winsock目录中的基础提供者上面,截取来自应用程序的Winsock API调用。*5 分层服务提供者仅实现更高层的定制通信函数,它依靠现存的底层基础提供者来与远程终端作实际的数据交换, 分层服务提供者位于基础服务提供者之上,依靠它来实现各种功能。Winsock 2 APIWS2_32.DLLSPILayeredProtocolSPILa
3、yeredProtocolSPIBase ProtocolTransportNamespace图8-2 协议层次*6 名字空间提供者把一个网络协议的地址属性和一个或多个用户友好名关联到一起,以便启用与协议无关的名字解析方案。命名空间提供者在命名空间目录安装自己,当应用程序执行名字解析时将会被调用。*7SPI命名规则:前缀标示nWSP(Winsock提供者):用于传输服务提供者函数。nNSP(名字空间提供者):用于名字空间提供者函数。nWPU(Winsock提供者上调):供服务提供者调用的支持函数(分层服务提供者使用的支持函数。)nWSC(Winsock配置):供在Winsock 2中安装服务提
4、供者的函数使用。*8Winsock协议目录 SPI提供3种协议:分层协议、基础协议、协议链基础协议是能够独立、安全地和远程端点实现数据通信的协议。分层协议在基础协议的上层,依靠底层基础协议实现更高层的通信服务。协议链是将一系列的基础协议和分层协议按特定的顺序连接在一起的链状结构。*9 协议信息系统安装了哪些协议以及这些协议的特性,通常为协议信息。如果一个协议支持多种行为,每类行为在系统中都有各自的目录条目。例如,如果系统中安装了TCP/IP,系统中就会有两个IP条目:TCP和UDP。Winsock采用WSAPROTOCOL_INFO结构描述特定协议的完整信息。具体定义如下:*10WSAPROT
5、OCOL_INFO结构定义如下:结构定义如下:typedef struct WSAPROTOCOL_INFODWORD dwServiceFlags1;DWORD dwServiceFlags2;DWORD dwServiceFlags3;DWORD dwServiceFlags4;DWORD dwProviderFlags;GUID ProviderId;/服务提供者厂商安排的服务提供者厂商安排的GUIDDWORD dwCatalogEntryId;/为该结构体安排的唯一标示符(目录入口)为该结构体安排的唯一标示符(目录入口)WSAPROTOCOLCHAIN ProtocolChain;/协
6、议链结构体协议链结构体int iVersion;int iAddressFamily;/地址家族地址家族int iMaxSockAddr;int iMinSockAddr;int iSocketType;/套接字类型套接字类型int iProtocol;/协议协议int iNetworkByteOrder;int iSecurityScheme;DWORD dwMessageSize;DWORD dwProviderReserved;CHAR szProtocolWSAPROTOCOL_LEN+1;WSAPROTOCOL_INFO,*LPWSAPROTOCOL_INFO;*11 获取协议信息使
7、用Winsock API函数WSAEnumProtocols();使用Winsock SPI函数WSCEnumProtocols();*12int WSAEnumProtocols(LPINT lpiProtocols,/整型数组,指定要枚举的协议,可选。指定为NULL则返回所有的协议。LPWSAPROTOCOL_INFO lpProtocolBuffer,/存放协议信息的缓冲区LPDWORD lpdwBufferLength/缓冲区长度);n枚举指定的网络协议信息,将具体的协议信息填充到WSAPROTOCOL_INFO结构体中。nWSAEnumProtocols函数仅能枚举基础协议和协议链,
8、不能枚举分层协议。n返回值:成功为协议个数,失败为SOCKET_ERROR 。n注:创建套接字时使用WSAEnumProtocols函数枚举系统中安装的协议,根据传递的参数找到一个与之匹配的协议,然后调用此协议的提供者导出的函数来完成各种Winsock调用。*13WSAEnumProtocols函数的使用方法:首先以lpProtocolBuffer为NULL,lpdwBufferLength为0调用WSAEnumProtocols ,该调用会以WSAENBUFS失败,此时lpdwBufferLength参数包含了所需的缓冲区长度。以lpdwBufferLength包含的缓冲区长度分配内存空间再
9、次以分配的内存空间调用WSAEnumProtocols实例*14WSCEnumPtotocols(LPINT lpiProtocols,LPWSAPROTOCOL_INFOW lpProtocolBuffer,LPDWORD lpdwBufferLength,LPINT lpErrno/取得调用出错后的出错代码); 该函数能够枚举各种协议,包括分层协议、基础协议和协议链。 协议信息存放在WSAPROTOCOL_INFOW结构体中,支持UNICODE。 使用方法同WSAEnumProtocols 实例*15typedef struct _WSAPROTOCOL_INFOW DWORD dwSer
10、viceFlags1; DWORD dwServiceFlags2; DWORD dwServiceFlags3; DWORD dwServiceFlags4; DWORD dwProviderFlags; GUID ProviderId; DWORD dwCatalogEntryId; WSAPROTOCOLCHAIN ProtocolChain; int iVersion;int iAddressFamily; int iMaxSockAddr; int iMinSockAddr; int iSocketType; int iProtocol; int iProtocolMaxOffset
11、; int iNetworkByteOrder; int iSecurityScheme; DWORD dwMessageSize; DWORD dwProviderReserved; WCHAR szProtocolWSAPROTOCOL_LEN+1;/UNICODE字符串字符串 WSAPROTOCOL_INFOW, *LPWSAPROTOCOL_INFOW;*16分层服务提供者(LSP) 分层提供者的体系结构图7-2分层提供者的体系结构*17 加载下层服务提供者,利用下层服务提供者导出的函数实现其内部API函数。 被WS2_32加载的下层服务提供者,由调用基础服务提供者(或者其下层服务提供
12、者)提供的服务实现其内部SPI函数。 用户创建套接字时, 套接字创建函数(如socket)在Winsock目录寻找合适的协议; 此协议的提供者导出的函数完成各种功能 编写分层服务提供者并安装可以截获Winsock调用*18运行原理 安装LSP安装LSP实质就是安装一个WSAPROTOCOL_INFOW结构,该结构定义了分层提供者的特性和LSP是如何填写链的。安装LSP后在Winsock目录中就有了一个WSAPROTOCOL_INFOW结构,让创建套接字的应用程序可以枚举到它。*19协议链协议链描述了分层提供者加入Winsock目录的顺序,也就是在协议链中的位置。协议链由嵌入在WSAPROTOC
13、OL_INFOW结构中的WSAPROTOCOLCHAIN结构中的数据指定,结构定义如下: typedef struct _WSAPROTOCOLCHAIN int ChainLen; /0表示分层协议,1表示基础协议, /1表示协议链 DWORD ChainEntriesMAX_PROTOCOL_CHAIN; /目录ID数组 WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;*20当ChianLen是0或1时,包含在ChianEntries数组中的数据是无意义的。当ChianLen大于1时,形成协议链的各个服务提供者的目录ID都包含在ChianEntries
14、数组中。LSP在协议链中位置的影响: 顶层:被加载 非顶层:被链中位于它上层的LSP加载LSP被加载后的动作:1) 首先调用LSP导出的函数WSPStartup()2) 将包含协议链的WSAPROTOCOL_INFOW结构传递给这个函数3) LSP再找到协议链中位于自己下方的提供者,进而加载它*21安装LSP时,必须在Winsock目录中安装两种协议:分层协议、协议链安装分层协议是为了获取Winsock目录分配的目录ID,以便在协议链中标识自己。协议链是Winsock目录中LSP的真正入口,链中包含了自己分层协议的目录ID号和下层提供者的目录ID号,这些目录ID构成ChainEntries,进
15、而构建一个WSAPROTOCOL_INFOW结构安装函数n需要为该函数提供LSP的GUID、DLL位置、描述LSP支持协议的一个或多个WSAPROTOCOL_INFOW结构。*22 函数定义 int WSCInstallProvider( const LPGUID lpProviderId, / 要安装的提供者的GUID const LPWSTR lpszProviderDllPath, / 指定提供者DLL路径 const LPWSAPROTOCOL_INFO lpProtocolInfoList, / 指向一个WSAPROTOCOL_INFOW结构数组 DWORD dwNumberOfEn
16、tries, / lpProtocolInfoList数组中条目数量,即数组大小 LPINT lpErrno / 返回可能的失败代码);/ 只有UNICODE版本,失败则返回SOCKET_ERROR*23 lpProviderId: GUID可以通过命令行工具UUIDGEN或者编程中使用UuidCreate函数生成。 lpszProviderDllPath: UNICODE字符串,包含环境变量。如 %SYSTEMROOT% lpProtocolInfoList: WSAPROTOCOL_INFOW结构的数组,每个数组成员是一个要安装的单独目录,即可一次安装多个服务提供者 通常从它要分层的下层提
17、供者拷贝,两种情况例外: 第一,szProtocol域要修改,以包含新提供者的名称 第二,如有XP1_IFS_HANDLES标志,从dwServiceFlags1域中移除XP1_IFS_HANDLES标志,该标志表示此提供者返回的句柄是真正地操作系统句柄,在该句柄上会引起user/kernel 模式的转换。*24LSP Socket Creation and IFS Handles socket 句柄有三类:由 base providers 返回给 LSP 的 socket 句柄;由 LSP 返 回给 ws2_32.dll 的 socket 句柄;用户程序中由 ws2_32.dll 返回的句柄
18、。 ws2_32.dll 维护了一个关联列表,表中相关联的是从 LSP 取得的 socket 句柄和返 回给用户程序的 socket 句柄。 LSP 也应该用类似的做法并维护一个从 base provider 取得的 socket 句柄和返回给 ws2_32.dll 的 socket 句柄的关联列表。 这样就使得给定某一层的 socket 句柄,LSP 能找到相应低层的 socket,而且当 LSP 被卸载时还能保证所有的 base socket 句柄能被正确地关闭*25 当 socket 有 IFS 句柄时,此句柄 可用在文件 I/O 函数中来完成 Winsock 的 recv 和 send
19、 调用。 在 Windows NT下,IFS 句柄可以加到 IOCP实现可伸缩性。这是由带 有 IFS 句柄的 providers 通过 WSAPROTOCOL_INFOW 结构体中的 XP1_IFS_HANDLES 属性位来指示的。 所有 Microsoft 的 base providers 都将 sockets 实现为 IFS 句柄。LSP 不能创建本身是真正的 IFS 句柄的 socket 句柄, 因为在 LSP 中不能实现 IFS。但通过调用 WPUCreateSocketHandle 或 WPUModifyIFSHandle 返回给 ws2_32.dll 的 socket 句柄都可以
20、在文件 I/O 调 用中使用。 *26 安装LSP的步骤1、用WSCInstallProvider来安装分层提供者以获取目录ID2、利用WSCEnumProtocols列举出所有的目录条目,获得安装之后为这个分层服务提供者分配的目录ID;3、用该目录ID来设置一个协议链目录条目,将要安装分层提供者和另外提供者连接起来组成协议链;4、调用WSCInstallProvider来安装该协议链*27重新为目录排序新的提供者安装到Winsock目录之后,在枚举时默认出现在Winsock目录的结尾。如果LSP模仿TCP/IP提供者,则永远不会被默认调用,因原来的MSAFD TCP/IP提供者总是出现在新安
21、装的提供者LSP入口之前,系统不会默认加载它。重新为目录排序可使新安装的LSP首先出现。由函数WSCWriteProviderOrder函数完成排序。*28函数定义int WSCWriteProviderOrder(LPDWORD lpdwCatalogEntryId,/CatalogEntryId数组DWORD dwNumberOfEntries/数组大小);*29 移除LSP移除LSP时,只需为移除LSP的函数传递要移除的提供者的GUID即可函数定义int WSCDeInstallProvider(LPGUID lpProviderId,LPINT lpErrno);移除LSP时,要根据分
22、层协议的GUID号找到其目录ID号,然后逐个移除各协议链,最后再移除分层协议的提供者。实例*30编写LSP 每个LSP必须实现和导出WSPStartup()函数 WSPStartup函数Winsock 2传输服务提供者随标准的Windows动态链接库模块一起执行,必须把DllMain函数导入这个动态链接库模块中,还必须导入一个名为WSPStartup函数条目。在调用者调用WSPStartup时,通过一个被当作参数传送的函数派遣表打开另外的30个SPI函数,传输服务提供者便由这30个函数组成。*31*32调用WSAStartup期间,Winsock根据WSASocket调用的地址家族、套接字类型
23、和协议参数,决定需要加载哪个服务提供者。只有在一个应用程序通过socket或WSASocket API调用建立一个套接字时, Winsock才会调用一个服务提供者。函数定义int WSPStartup(WORD wVersionRequested,/调用者可使用的版本号LPWSPDATA lpWSPData,/获取提供者的详细信息LPWSAPROTOCOL_INFO lpProtoclInfo,/指定想得到的协议特征WSPUPCALLTABLE UpcallTable,/向上调用的函数表 LPWSPPROC_TABLE lpProcTable/指向SPI的函数表);*33 描述分派表的WSPP
24、ROC_TABLE结构定义了必须在LSP实现的函数,定义如下:typedef struct _WSPPROC_TABLE LPWSPACCEPT lpWSPAccept; LPWSPADDRESSTOSTRING lpWSPAddressToString; LPWSPASYNCSELECT lpWSPAsyncSelect; LPWSPBIND lpWSPBind; LPWSPCANCELBLOCKINGCALL lpWSPCancelBlockingCall; LPWSPCLEANUP lpWSPCleanup; LPWSPCLOSESOCKET lpWSPCloseSocket; LPWS
25、PCONNECT lpWSPConnect; LPWSPDUPLICATESOCKET lpWSPDuplicateSocket; LPWSPENUMNETWORKEVENTS lpWSPEnumNetworkEvents; LPWSPEVENTSELECT lpWSPEventSelect; *34LPWSPGETOVERLAPPEDRESULT lpWSPGetOverlappedResult; LPWSPGETPEERNAME lpWSPGetPeerName; LPWSPGETSOCKNAME lpWSPGetSockName; LPWSPGETSOCKOPT lpWSPGetSock
26、Opt; LPWSPGETQOSBYNAME lpWSPGetQOSByName; LPWSPIOCTL lpWSPIoctl; LPWSPJOINLEAF lpWSPJoinLeaf; LPWSPLISTEN lpWSPListen; LPWSPRECV lpWSPRecv; LPWSPRECVDISCONNECT lpWSPRecvDisconnect;*35 LPWSPRECVFROM lpWSPRecvFrom; LPWSPSELECT lpWSPSelect; LPWSPSEND lpWSPSend; LPWSPSENDDISCONNECT lpWSPSendDisconnect; LPWSPSENDTO lpWSPSendTo; LPWSPSETSOCKOPT lpWSPSetSockOpt; LPWSPSHUTDOWN lpWSPShutdown; LPWSPSOCKET lpWSPSocket; LPWSPSTRINGTOADDRESS lpWSPStringToAddress; WSPPROC_TABLE, FAR * LPWSPPROC_TABLE;*36WSPStartup()函数的作用1)根据协议链找到下层提供者,调用其WSPStartup函数初始化下层提供者,这是一个不断向下递归的过程2)取得SPI服务函数的指针,在向上返回这些指针之前,可以用自定义的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京旅游景点介绍文旅宣传介绍课件
- 迎检中央安全生产巡查组企业核心资料准备清单
- 2026年威海市环翠区中小学编制教师招聘考试模拟试题及答案详解
- 2026年广州市白云区中小学编制教师招聘考试备考试题及答案详解
- 2026年汕头市潮南区中小学编制教师招聘考试备考试题及答案详解
- 2026年山东省淄博市中小学编制教师招聘笔试参考试题及答案详解
- 2025年中东欧科技投资报告 Central and Eastern European startups
- 2026年吕梁地区中小学编制教师招聘考试模拟试题及答案详解
- 2026年本溪市溪湖区中小学编制教师招聘笔试模拟试题及答案详解
- 2026年芜湖市新芜区事业编单位人员招聘笔试备考题库及答案详解
- 2026辽控集团所属辽宁九夷锂能股份有限公司招聘20人考试参考试题及答案详解
- 江苏省苏州市2025-2026学年六年级下学期数学期末试题一(试卷+答案)
- 2026 暑假红领巾奖章德育实践作业-荷风知夏意争章向阳行 教学课件
- 2026年大学概率论与数理统计考试试卷(含答案)
- 国企招聘题库
- 部编版六年级下册道德与法治全册教案
- 2026西藏交通发展集团有限公司校园招聘考试参考试题及答案解析
- 工程项目质量首件样板标准图集(安装分册)
- (正式版)T∕GDSTD 028-2026 广东省土地储备入库出库指引
- Unit 5 Nature's Temper Section A 1a-2d 课件 2025-2026学年人教版英语八年级下册
- 财务税务-电子税务局-长期资产进项税额抵扣台账导入模版
评论
0/150
提交评论