WinDivert学习文档之五-————编程API(八)
5.8 WinDivertSendEx
BOOL WinDivertSendEx(__in HANDLE handle,__in const VOID *pPacket,__in UINT packetLen,__out_opt UINT *pSendLen,__in UINT64 flags,__in const WINDIVERT_ADDRESS *pAddr,__in UINT addrLen,__inout_opt LPOVERLAPPED lpOverlapped ); |
参数
一个由WinDivertOpen()创建的有效的WinDivert句柄。
- handle:包含要注入的包的缓冲区。
- packetLen:缓冲包的总长度。
- pSendLen:注入的总字节数。如果不需要此信息,则可以为NULL。
- flags:保留,设置为0。
- pAddr:注入报文的地址。
- addrLen: pAddr缓冲区的总长度(单位为字节)。
lpOverlapped
: 指向OVERLAPPED结构的可选指针。
返回值
如果数据包被成功注入,则为TRUE,否则为FALSE。使用GetLastError()来获取原因。错误码ERROR_IO_PENDING表示重叠操作已成功启动,稍后将指示完成。所有其他代码表示错误。
说明:
这个函数等价于WinDivertSend(),除了:
- 通过lpoverlap参数支持重叠I/O。
- 支持批处理I/O(即一次发送多个数据包)。
批处理I/O使得使用单个操作一次发送最多WINDIVERT_BATCH_MAX数据包成为可能,从而减少了内核/用户模式上下文切换的数量并提高了性能。使用批处理I/O:
- 将N个数据包装入pPacket缓冲区(数据包之间没有间隙);
- 设置packetLen为N个数据包长度的总和;
- 将对应的N个WINDIVERT_ADDRESS地址结构打包到pAddr缓冲区中;和
- 设置addrLen为pAddr缓冲区的总大小(以字节为单位)。