




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 Winsock服务提供者接口 SPI 04 09 05 1 内容提要 SPI概述Winsock协议目录分层服务提供者 LSP 基于SPI的数据包过滤实例 04 09 05 2 Winsock2是围绕着Windows开放系统架构 WindowsOpenSystemArchitecture WOSA 来设计的 WOSA在Winsock和Winsock应用程序之间有一个标准API 在Winsock和Winsock服务提供者 比如TCP IP 之间有一个标准的SPI 概述 04 09 05 3 图7 1Winsock2的WOSA架构 04 09 05 4 传输服务提供者传输服务提供者 TransportServiceproviders 一般称作协议栈 比如TCP IP 即能够提供建立通信 传输数据 日常数据流控制和错误控制等功能的服务 类型 分层的 Layered 基础的 Base 基础服务提供者负责实现传输协议的真正细节 导出Winsock接口 此接口直接实现协议 分层服务提供者将自己安装到Winsock目录中的基础提供者上面 截取来自应用程序的WinsockAPI调用 04 09 05 5 分层服务提供者仅实现更高层的定制通信函数 它依靠现存的底层基础提供者来与远程终端作实际的数据交换 分层服务提供者位于基础服务提供者之上 依靠它来实现各种功能 图8 2协议层次 04 09 05 6 名字空间提供者把一个网络协议的地址属性和一个或多个用户友好名关联到一起 以便启用与协议无关的名字解析方案 命名空间提供者在命名空间目录安装自己 当应用程序执行名字解析时将会被调用 04 09 05 7 SPI命名规则 前缀标示WSP Winsock提供者 用于传输服务提供者函数 NSP 名字空间提供者 用于名字空间提供者函数 WPU Winsock提供者上调 供服务提供者调用的Ws2 32 dll支持函数 分层服务提供者使用的支持函数 WSC Winsock配置 供在Winsock2中安装服务提供者的函数使用 04 09 05 8 Winsock协议目录 SPI提供3种协议 分层协议 基础协议 协议链基础协议是能够独立 安全地和远程端点实现数据通信的协议 分层协议在基础协议的上层 依靠底层基础协议实现更高层的通信服务 协议链是将一系列的基础协议和分层协议按特定的顺序连接在一起的链状结构 04 09 05 9 协议信息系统安装了哪些协议以及这些协议的特性 通常为协议信息 如果一个协议支持多种行为 每类行为在系统中都有各自的目录条目 例如 如果系统中安装了TCP IP 系统中就会有两个IP条目 TCP和UDP Winsock采用WSAPROTOCOL INFO结构描述特定协议的完整信息 具体定义如下 04 09 05 10 WSAPROTOCOL INFO结构定义如下 typedefstructWSAPROTOCOL INFO DWORDdwServiceFlags1 DWORDdwServiceFlags2 DWORDdwServiceFlags3 DWORDdwServiceFlags4 DWORDdwProviderFlags GUIDProviderId 服务提供者厂商安排的GUIDDWORDdwCatalogEntryId 为该结构体安排的唯一标示符 目录入口 WSAPROTOCOLCHAINProtocolChain 协议链结构体intiVersion intiAddressFamily 地址家族intiMaxSockAddr intiMinSockAddr intiSocketType 套接字类型intiProtocol 协议intiNetworkByteOrder intiSecurityScheme DWORDdwMessageSize DWORDdwProviderReserved CHARszProtocol WSAPROTOCOL LEN 1 WSAPROTOCOL INFO LPWSAPROTOCOL INFO 04 09 05 11 获取协议信息使用WinsockAPI函数WSAEnumProtocols 使用WinsockSPI函数WSCEnumProtocols 04 09 05 12 intWSAEnumProtocols LPINTlpiProtocols 整型数组 指定要枚举的协议 可选 指定为NULL则返回所有的协议 LPWSAPROTOCOL INFOlpProtocolBuffer 存放协议信息的缓冲区LPDWORDlpdwBufferLength 缓冲区长度 枚举指定的网络协议信息 将具体的协议信息填充到WSAPROTOCOL INFO结构体中 WSAEnumProtocols函数仅能枚举基础协议和协议链 不能枚举分层协议 返回值 成功为协议个数 失败为SOCKET ERROR 注 创建套接字时使用WSAEnumProtocols函数枚举系统中安装的协议 根据传递的参数找到一个与之匹配的协议 然后调用此协议的提供者导出的函数来完成各种Winsock调用 04 09 05 13 WSAEnumProtocols函数的使用方法 首先以lpProtocolBuffer为NULL lpdwBufferLength为0调用WSAEnumProtocols 该调用会以WSAENBUFS失败 此时lpdwBufferLength参数包含了所需的缓冲区长度 以lpdwBufferLength包含的缓冲区长度分配内存空间再次以分配的内存空间调用WSAEnumProtocols实例 04 09 05 14 WSCEnumPtotocols LPINTlpiProtocols LPWSAPROTOCOL INFOWlpProtocolBuffer LPDWORDlpdwBufferLength LPINTlpErrno 取得调用出错后的出错代码 该函数能够枚举各种协议 包括分层协议 基础协议和协议链 协议信息存放在WSAPROTOCOL INFOW结构体中 支持UNICODE 使用方法同WSAEnumProtocols实例 04 09 05 15 typedefstruct WSAPROTOCOL INFOW DWORDdwServiceFlags1 DWORDdwServiceFlags2 DWORDdwServiceFlags3 DWORDdwServiceFlags4 DWORDdwProviderFlags GUIDProviderId DWORDdwCatalogEntryId WSAPROTOCOLCHAINProtocolChain intiVersion intiAddressFamily intiMaxSockAddr intiMinSockAddr intiSocketType intiProtocol intiProtocolMaxOffset intiNetworkByteOrder intiSecurityScheme DWORDdwMessageSize DWORDdwProviderReserved WCHARszProtocol WSAPROTOCOL LEN 1 UNICODE字符串 WSAPROTOCOL INFOW LPWSAPROTOCOL INFOW 04 09 05 16 分层服务提供者 LSP 分层提供者的体系结构 图7 2分层提供者的体系结构 04 09 05 17 WS2 32 dll加载下层服务提供者 利用下层服务提供者导出的函数实现其内部API函数 被WS2 32加载的下层服务提供者 由调用基础服务提供者 或者其下层服务提供者 提供的服务实现其内部SPI函数 用户创建套接字时 套接字创建函数 如socket 在Winsock目录寻找合适的协议 此协议的提供者导出的函数完成各种功能编写分层服务提供者并安装可以截获Winsock调用 04 09 05 18 运行原理 安装LSP安装LSP实质就是安装一个WSAPROTOCOL INFOW结构 该结构定义了分层提供者的特性和LSP是如何填写链的 安装LSP后在Winsock目录中就有了一个WSAPROTOCOL INFOW结构 让创建套接字的应用程序可以枚举到它 04 09 05 19 协议链协议链描述了分层提供者加入Winsock目录的顺序 也就是在协议链中的位置 协议链由嵌入在WSAPROTOCOL INFOW结构中的WSAPROTOCOLCHAIN结构中的数据指定 结构定义如下 typedefstruct WSAPROTOCOLCHAIN intChainLen 0表示分层协议 1表示基础协议 1表示协议链DWORDChainEntries MAX PROTOCOL CHAIN 目录ID数组 WSAPROTOCOLCHAIN FAR LPWSAPROTOCOLCHAIN 04 09 05 20 当ChianLen是0或1时 包含在ChianEntries数组中的数据是无意义的 当ChianLen大于1时 形成协议链的各个服务提供者的目录ID都包含在ChianEntries数组中 LSP在协议链中位置的影响 顶层 被Ws2 32 dll加载非顶层 被链中位于它上层的LSP加载LSP被加载后的动作 1 首先调用LSP导出的函数WSPStartup 2 将包含协议链的WSAPROTOCOL INFOW结构传递给这个函数3 LSP再找到协议链中位于自己下方的提供者 进而加载它 04 09 05 21 安装LSP时 必须在Winsock目录中安装两种协议 分层协议 协议链安装分层协议是为了获取Winsock目录分配的目录ID 以便在协议链中标识自己 协议链是Winsock目录中LSP的真正入口 链中包含了自己分层协议的目录ID号和下层提供者的目录ID号 这些目录ID构成ChainEntries 进而构建一个WSAPROTOCOL INFOW结构安装函数需要为该函数提供LSP的GUID DLL位置 描述LSP支持协议的一个或多个WSAPROTOCOL INFOW结构 04 09 05 22 函数定义intWSCInstallProvider constLPGUIDlpProviderId 要安装的提供者的GUIDconstLPWSTRlpszProviderDllPath 指定提供者DLL路径constLPWSAPROTOCOL INFOlpProtocolInfoList 指向一个WSAPROTOCOL INFOW结构数组DWORDdwNumberOfEntries lpProtocolInfoList数组中条目数量 即数组大小LPINTlpErrno 返回可能的失败代码 只有UNICODE版本 失败则返回SOCKET ERROR 04 09 05 23 lpProviderId GUID可以通过命令行工具UUIDGEN或者编程中使用UuidCreate函数生成 lpszProviderDllPath UNICODE字符串 包含环境变量 如 SYSTEMROOT lpProtocolInfoList WSAPROTOCOL INFOW结构的数组 每个数组成员是一个要安装的单独目录 即可一次安装多个服务提供者通常从它要分层的下层提供者拷贝 两种情况例外 第一 szProtocol域要修改 以包含新提供者的名称第二 如有XP1 IFS HANDLES标志 从dwServiceFlags1域中移除XP1 IFS HANDLES标志 该标志表示此提供者返回的句柄是真正地操作系统句柄 在该句柄上会引起user kernel模式的转换 04 09 05 24 LSPSocketCreationandIFSHandlessocket句柄有三类 由baseproviders返回给LSP的socket句柄 由LSP返回给ws2 32 dll的socket句柄 用户程序中由ws2 32 dll返回的句柄 ws2 32 dll维护了一个关联列表 表中相关联的是从LSP取得的socket句柄和返回给用户程序的socket句柄 LSP也应该用类似的做法并维护一个从baseprovider取得的socket句柄和返回给ws2 32 dll的socket句柄的关联列表 这样就使得给定某一层的socket句柄 LSP能找到相应低层的socket 而且当LSP被卸载时还能保证所有的basesocket句柄能被正确地关闭 04 09 05 25 当socket有IFS句柄时 此句柄可用在文件I O函数中来完成Winsock的recv和send调用 在WindowsNT下 IFS句柄可以加到IOCP实现可伸缩性 这是由带有IFS句柄的providers通过WSAPROTOCOL INFOW结构体中的XP1 IFS HANDLES属性位来指示的 所有Microsoft的baseproviders都将sockets实现为IFS句柄 LSP不能创建本身是真正的IFS句柄的socket句柄 因为在LSP中不能实现IFS 但通过调用WPUCreateSocketHandle或WPUModifyIFSHandle返回给ws2 32 dll的socket句柄都可以在文件I O调用中使用 04 09 05 26 安装LSP的步骤1 用WSCInstallProvider来安装分层提供者以获取目录ID2 利用WSCEnumProtocols列举出所有的目录条目 获得安装之后为这个分层服务提供者分配的目录ID 3 用该目录ID来设置一个协议链目录条目 将要安装分层提供者和另外提供者连接起来组成协议链 4 调用WSCInstallProvider来安装该协议链 04 09 05 27 重新为目录排序新的提供者安装到Winsock目录之后 在枚举时默认出现在Winsock目录的结尾 如果LSP模仿TCP IP提供者 则永远不会被默认调用 因原来的MSAFDTCP IP提供者总是出现在新安装的提供者LSP入口之前 系统不会默认加载它 重新为目录排序可使新安装的LSP首先出现 由函数WSCWriteProviderOrder函数完成排序 04 09 05 28 函数定义intWSCWriteProviderOrder LPDWORDlpdwCatalogEntryId CatalogEntryId数组DWORDdwNumberOfEntries 数组大小 04 09 05 29 移除LSP移除LSP时 只需为移除LSP的函数传递要移除的提供者的GUID即可函数定义intWSCDeInstallProvider LPGUIDlpProviderId LPINTlpErrno 移除LSP时 要根据分层协议的GUID号找到其目录ID号 然后逐个移除各协议链 最后再移除分层协议的提供者 实例 04 09 05 30 编写LSP每个LSP必须实现和导出WSPStartup 函数WSPStartup函数Winsock2传输服务提供者随标准的Windows动态链接库模块一起执行 必须把DllMain函数导入这个动态链接库模块中 还必须导入一个名为WSPStartup函数条目 在调用者调用WSPStartup时 通过一个被当作参数传送的函数派遣表打开另外的30个SPI函数 传输服务提供者便由这30个函数组成 04 09 05 31 04 09 05 32 调用WSAStartup期间 Winsock根据WSASocket调用的地址家族 套接字类型和协议参数 决定需要加载哪个服务提供者 只有在一个应用程序通过socket或WSASocketAPI调用建立一个套接字时 Winsock才会调用一个服务提供者 函数定义intWSPStartup WORDwVersionRequested 调用者可使用的版本号LPWSPDATAlpWSPData 获取提供者的详细信息LPWSAPROTOCOL INFOlpProtoclInfo 指定想得到的协议特征WSPUPCALLTABLEUpcallTable 向上调用的函数表LPWSPPROC TABLElpProcTable 指向SPI的函数表 04 09 05 33 描述分派表的WSPPROC TABLE结构定义了必须在LSP实现的函数 定义如下 typedefstruct WSPPROC TABLE LPWSPACCEPTlpWSPAccept LPWSPADDRESSTOSTRINGlpWSPAddressToString LPWSPASYNCSELECTlpWSPAsyncSelect LPWSPBINDlpWSPBind LPWSPCANCELBLOCKINGCALLlpWSPCancelBlockingCall LPWSPCLEANUPlpWSPCleanup LPWSPCLOSESOCKETlpWSPCloseSocket LPWSPCONNECTlpWSPConnect LPWSPDUPLICATESOCKETlpWSPDuplicateSocket LPWSPENUMNETWORKEVENTSlpWSPEnumNetworkEvents LPWSPEVENTSELECTlpWSPEventSelect 04 09 05 34 LPWSPGETOVERLAPPEDRESULTlpWSPGetOverlappedResult LPWSPGETPEERNAMElpWSPGetPeerName LPWSPGETSOCKNAMElpWSPGetSockName LPWSPGETSOCKOPTlpWSPGetSockOpt LPWSPGETQOSBYNAMElpWSPGetQOSByName LPWSPIOCTLlpWSPIoctl LPWSPJOINLEAFlpWSPJoinLeaf LPWSPLISTENlpWSPListen LPWSPRECVlpWSPRecv LPWSPRECVDISCONNECTlpWSPRecvDisconnect 04 09 05 35 LPWSPRECVFROMlpWSPRecvFrom LPWSPSELECTlpWSPSelect LPWSPSENDlpWSPSend LPWSPSENDDISCONNECTlpWSPSendDisconnect LPWSPSENDTOlpWSPSendTo LPWSPSETSOCKOPTlpWSPSetSockOpt LPWSPSHUTDOWNlpWSPShutdown LPWSPSOCKETlpWSPSocket LPWSPSTRINGTOADDRESSlpWSPStringToAddress WSPPROC TABLE FAR LPWSPPROC TABLE 04 09 05 36 WSPStartup 函数的作用1 根据协议链找到下层提供者 调用其WSPStartup函数初始化下层提供者 这是一个不断向下递归的过程2 取得SPI服务函数的指针 在向上返回这些指针之前 可以用自定义的函数指针覆盖它 以截获Winso
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 9258.3-2025涂附磨具用磨料粒度组成的检测和标记第3部分:微粉P240~P5000
- 山东省济宁市2024-2025学年高一下学期质量监测物理试卷
- 2025-2026学年江苏省南通市海门区包场高级中学高二(下)开学政治试卷(含解析)
- 房屋施工合同(合集15篇)
- 旅游行业发展现状及市场份额分析
- 汉字公开课课件
- DB64-T 1750-2020 宁夏砂石土矿绿色矿山建设规范
- 永州简介课件
- 水质检测基础知识培训课件
- 水粉画基础知识培训课件反思
- 塔吊拆除安全操作方案模板
- 巡检员质量培训
- 无线电技术设施运行维护定期巡检项目总表
- 社会组织规范化建设评价指标体系解读
- GB/T 702-2017热轧钢棒尺寸、外形、重量及允许偏差
- GB/T 20238-2018木质地板铺装、验收和使用规范
- GB/T 1303.1-1998环氧玻璃布层压板
- GB/T 11684-2003核仪器电磁环境条件与试验方法
- 家具厂精益改善推行报告课件
- 第2章 动车组检修工艺基础动车组维护与检修
- 筋针疗法牛君银培训课件
评论
0/150
提交评论