、、、首先我不是原创、、、、、
转载别人的然后自己学习,网上有很多资料。大家可以先看《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