赞
踩
、、、首先我不是原创、、、、、
转载别人的然后自己学习,网上有很多资料。大家可以先看《windows防火墙与网络封包截获》然后再看“基于SPI 的网络封包截获”。应该就差不多了
我会在地址下方给出这些资料链接、、、、
还有源码。
首先先安装LSP:
- #include <Ws2spi.h>
- #include <Sporder.h> // 定义了WSCWriteProviderOrder()函数
- #include <windows.h>
- #include <stdio.h>
- #pragma comment(lib, "Ws2_32.lib")
- #pragma comment(lib, "Rpcrt4.lib") // 实现了UuidCreate()函数
- #pragma comment(lib, sporder.lib )
-
- //定义要安装的LSP的硬编码,在卸载LSP时还要会使用;
- GUID ProviderGuid={0xd3c21122, 0x85e1, 0x48f3, {0x9a,0xb6,0x23,0xd9,0x0c,0x73,0x07,0xef}};
-
- //枚举当前各协议服务提供者的函数;
- LPWSAPROTOCOL_INFOW GetProvider(LPINT lpnTotalProtocols)
- {
- DWORD dwSize = 0;
- int nError;
- LPWSAPROTOCOL_INFOW pProtoInfo = NULL; //用于申请存放服务提供者结构的内存空间;
-
- // 取得需要的长度,即通过将WSCEnumProtocols函数的dwSize参数置0进行第一次调用,后
- //以获得枚举服务提供者所需的缓冲区大小,置于dwSize变量中;
- if(::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError) == SOCKET_ERROR)
- {
- if(nError != WSAENOBUFS)
- return NULL;
- }
-
- //根据dwSize中的值来申请内存空间;
- pProtoInfo = (LPWSAPROTOCOL_INFOW)::GlobalAlloc(GPTR, dwSize);
- //第二次通过WSCEnumProtocols()正式枚举到各服务提供者并存放于pProtoInfo(数组)中,
- //并将服务提供者的个数存到lpnTotalProtocols中;
- *lpnTotalProtocols = ::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError);
- //将pProtoInfo返回给函数调用者;
- return pProtoInfo;
- }
-
-
- void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo)
- {
- //释放用于存放服务提供者数组的内存空间,pProtoInfo;
- ::GlobalFree(pProtoInfo);
- }
-
-
- //枚举现有的各服务提供者;
- void query()
- {
- LPWSAPROTOCOL_INFOW pProtoInfo;
- int nProtocols;
- pProtoInfo = GetProvider(&nProtocols);
- for(int i=0; i<nProtocols; i++)
- {
-
- printf(" Protocol: %ws \n", pProtoInfo[i].szProtocol);
- printf(" CatalogEntry
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。