社区
驱动开发/核心开发
帖子详情
请教NDIS中转发收到的包的问题
China_Wys
2010-10-13 12:13:09
现在在学习DDK的passthru例子,想实现一个功能就是:PtReceive中的收到的包调用NdisSend发送出去,并且不通知上层。
请问这个过程要做哪些处理?
我自己的理解:
1. 从PtReceive收到的NDIS_Packet中把数据取出来
2. 修改取出数据的IP头信息
3. 用修改后的数据再组一个包
4. 把新包用NdisSend发出去。
有代码或例子参考最好,谢谢!
...全文
148
2
打赏
收藏
请教NDIS中转发收到的包的问题
现在在学习DDK的passthru例子,想实现一个功能就是:PtReceive中的收到的包调用NdisSend发送出去,并且不通知上层。 请问这个过程要做哪些处理? 我自己的理解: 1. 从PtReceive收到的NDIS_Packet中把数据取出来 2. 修改取出数据的IP头信息 3. 用修改后的数据再组一个包 4. 把新包用NdisSend发出去。 有代码或例子参考最好,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
-filter.rar_N
DIS
Filter_Windows N
DIS
Filter_filter_n
dis
_n
dis
N
DIS
(Network Driver Interface Specification)是Windows操作系统
中
的一个网络驱动接口标准,它为网络驱动程序提供了一种标准化的方式来与网络适配器通信。N
DIS
Filter是N
DIS
的一部分,它允许开发人员创建
中
间驱动...
N
DIS
驱动,捕获过滤数据
包
,防火墙
N
DIS
驱动,捕获过滤数据
包
,防火墙 好东西,分享
微软的一个n
dis
驱动程序例子
其实不只是在远程启动这一层,只要是网卡的驱动盘,大家都会在里面发现有类似 N
DIS
、N
DIS
2、N
DIS
3、N
DIS
4一样的目录,只是大家在 Windows 9x 或 NT
中
安装、设置网卡时没有注意到它罢了。但即使大搞特搞 RPL 的朋友...
驱动开发/核心开发
21,616
社区成员
21,711
社区内容
发帖
与我相关
我的任务
驱动开发/核心开发
硬件/嵌入开发 驱动开发/核心开发
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章