社区
驱动开发/核心开发
帖子详情
请教NDIS中转发收到的包的问题
China_Wys
2010-10-13 12:13:09
现在在学习DDK的passthru例子,想实现一个功能就是:PtReceive中的收到的包调用NdisSend发送出去,并且不通知上层。
请问这个过程要做哪些处理?
我自己的理解:
1. 从PtReceive收到的NDIS_Packet中把数据取出来
2. 修改取出数据的IP头信息
3. 用修改后的数据再组一个包
4. 把新包用NdisSend发出去。
有代码或例子参考最好,谢谢!
...全文
161
2
打赏
收藏
请教NDIS中转发收到的包的问题
现在在学习DDK的passthru例子,想实现一个功能就是:PtReceive中的收到的包调用NdisSend发送出去,并且不通知上层。 请问这个过程要做哪些处理? 我自己的理解: 1. 从PtReceive收到的NDIS_Packet中把数据取出来 2. 修改取出数据的IP头信息 3. 用修改后的数据再组一个包 4. 把新包用NdisSend发出去。 有代码或例子参考最好,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jw212
2010-10-21
打赏
举报
回复
转发的过程应该不修改数据吧,只对包头做处理
China_Wys
2010-10-14
打赏
举报
回复
从PtReceive中取出的数据,判断是否为IP报文后发出,调用NdisSend时机器重启,期待高手指点,谢谢!
NDIS_STATUS
PtBmwSendRawData(
PADAPT adapt,
PVOID buffer,
ULONG length
)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PNDIS_PACKET ndisPacket = NULL;
PNDIS_BUFFER ndisBuffer = NULL;
PUCHAR sendBuffer = NULL;
PSEND_RSVD sendRsvd = NULL;
NDIS_PHYSICAL_ADDRESS highestAcceptableAddress;
highestAcceptableAddress.QuadPart = -1;
ASSERT(buffer != NULL);
//ASSERT(length >= ETH_MIN_PACKET_SIZE && length <= ETH_MAX_PACKET_SIZE);
status = PtBmwMakeRawData(buffer, length);
if (status != NDIS_STATUS_SUCCESS)
{
return status;
}
DBGPRINT(("==> Protocol PtBmwSendRawData IP\n"));
status = NdisAllocateMemory(&sendBuffer, length, 0, highestAcceptableAddress);
//status = NdisAllocateMemoryWithTag (&sendBuffer, length, TAG);
if (status != NDIS_STATUS_SUCCESS)
{
return status;
}
RtlZeroMemory(sendBuffer, length);
RtlMoveMemory(sendBuffer, buffer, length);
NdisAllocatePacket(&status, &ndisPacket, adapt->SendPacketPoolHandle);
if (status != NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(sendBuffer, length, 0);
return status;
}
NdisAllocateBuffer(&status, &ndisBuffer, adapt->SendPacketPoolHandle, sendBuffer, length);
if (status != NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(sendBuffer, length, 0);
NdisFreePacket(ndisPacket);
return status;
}
NdisChainBufferAtFront(ndisPacket, ndisBuffer);
sendRsvd = (PSEND_RSVD)(ndisPacket->ProtocolReserved);
sendRsvd->OriginalPkt = (PNDIS_PACKET)1; //标记自己
ndisPacket->Private.Head->Next = NULL;
ndisPacket->Private.Tail = NULL;
NdisSetPacketFlags(ndisPacket, NDIS_FLAGS_DONT_LOOPBACK);
DBGPRINT(("SendRawData -> Now send!\n"));
//-
NdisSend(&status, adapt->BindingHandle, ndisPacket);
DBGPRINT(("SendRawData -> Now send Complete!\n"));
if (status != STATUS_PENDING)
{
NdisUnchainBufferAtFront(ndisPacket, &ndisBuffer);
NdisQueryBufferSafe(ndisBuffer, &sendBuffer, &length, NormalPagePriority);
NdisFreeBuffer(ndisBuffer);
NdisFreeMemory(sendBuffer, length, 0);
NdisFreePacket(ndisPacket);
}
return status;
}
N
DIS
中
间层驱动
中
IP、MAC地址的获取
在IT领域,网络驱动程序接口规范(N
DIS
)是Windows操作系统
中
的一个重要组成部分,它为网络适配器驱动程序提供了一种标准的接口。N
DIS
中
间层驱动,也称为过滤驱动,位于N
DIS
协议驱动和微型端口驱动之间,用于扩展或...
N
DIS
拨号原理(华为).pdf
在N
DIS
中
,数据封装的过程是按照网络通信的层次进行的。例如,当使用DHCP协议时,DHCP数据会被封装在UDP报文
中
,然后通过IP协议进行传输。在传输的过程
中
,数据
包
会经过数据链路层和物理层的封装,最终通过物理介质...
N
DIS
驱动,捕获过滤数据
包
,防火墙
N
DIS
驱动,捕获过滤数据
包
,防火墙 好东西,分享
N
DIS
小端口驱动 miniport driver 以太网卡
实现一个千兆以太网卡的N
DIS
的miniport驱动实例源代码 对于那些希望写一个N
DIS
6.0的miniport设备驱动的开发人员来说,实例实在是太少了,只有一个DDK
中
的E100BEX。这里,我将选择一个当前比较流行的以太网控制器...
SocksRedirector_redirectortcp_socks_socksredirector_C++_n
dis
_
在标题“SocksRedirector_redirectortcp_socks_socksredirector_C++_n
dis
_”
中
,我们关注的是如何利用N
DIS
驱动来实现TCP/IP和UDP数据
包
的过滤与重定向,将它们转化为SOCKS协议的TCP
包
。这是一个高级的网络编程技术,...
驱动开发/核心开发
21,618
社区成员
21,708
社区内容
发帖
与我相关
我的任务
驱动开发/核心开发
硬件/嵌入开发 驱动开发/核心开发
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章