michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:6669回复:21

请问NDIS层收上来的包是哪一层的协议?IP层还是链路层?NDIS层待发送的包呢?

楼主#
更多 发布于:2005-07-26 11:42
  我想在NDIS层收包和发包,但是不太清楚NDIS层中收上来的包的格式是IP层的还是链路层的,还有将要往外发的包的格式是IP层的还是链路层的。
  小弟急用,请各位大侠不吝赐教,多谢啦
我思故我在
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-26 12:29
链路层的。
看一下不就知道了吗。
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-26 16:06
发送和接收都是链路层的吗?我想在NDIS层自己组织符合协议形式的数据,如果是链路层的话那岂不是麻烦了?
我思故我在
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-26 16:12
修改修改应该比较容易,自己组织就麻烦多了。
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-29 08:30
下面是引用michael4338于2005-07-26 16:06发表的:
发送和接收都是链路层的吗?我想在NDIS层自己组织符合协议形式的数据,如果是链路层的话那岂不是麻烦了?


确实都是MAC打头的包。
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-29 08:55
如果是链路层的,发送时我想自己组织包的内容,各个头的各个字段中哪个最不好对付?在我看来应该是发送的目标地址,请问各位如何得到并填入这个地址???
我思故我在
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-29 09:18
果然是隔行如隔山啊。

在通信协议部分,我觉得很简单,因为我平时就搞这个。
但是在驱动代码部分,唉,难啊,本人尚在学习阶段,不如我的这个问题我就很困惑:
http://bbs.zndev.com/htm_data/16/0507/95655.html

你的“目的”包括3个,MAC、IP和端口,都在包里有相应的位置。自己看TCP/IP协议的包结构?这个二进制的东西对成天看文本的人来说也有点难度。
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-29 14:25
首先很感谢yunyanrong的回复,不过你只解决了往哪里放这些地址的问题,而没有解决怎样得到正确的地址的问题。因为我是自己直接在中间层组织包,不经过上面的协议,所以我不知道其MAC地址甚至IP地址到底是什么,这些信息从哪里得到呢?
我思故我在
whomi
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望32点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-08-01 11:02
另外,请教各位,校验和的问题如何解决
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-08-01 11:46
下面是引用whomi于2005-08-01 11:02发表的:
另外,请教各位,校验和的问题如何解决

按公式计算就行了,具体的看TCP/IP协议。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-08-01 15:06
下面是引用michael4338于2005-07-29 14:25发表的:
首先很感谢yunyanrong的回复,不过你只解决了往哪里放这些地址的问题,而没有解决怎样得到正确的地址的问题。因为我是自己直接在中间层组织包,不经过上面的协议,所以我不知道其MAC地址甚至IP地址到底是什么,这些信息从哪里得到呢?


这些信息你都不知道从哪得到,别人更不可能知道,
如果对方是固定的,那你就可以在代码里面写死了,
如果对方不是,那你就得想办法查询,这个和你的需求有关,别人怎么可能知道怎么得到这些信息
比如你可以从收到的包里解析出这些信息,但是如果这些不是你想要的,那别人就帮不了你了
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-08-01 17:47
具体来说吧,在发送的时候,首先得经过局域网内,或广域网内的第一个节点。这第一个节点的信息好像注册表里有吧?因为系统每次接包发包都得经过它
我思故我在
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-08-02 09:40
下面是引用michael4338于2005-07-29 14:25发表的:
首先很感谢yunyanrong的回复,不过你只解决了往哪里放这些地址的问题,而没有解决怎样得到正确的地址的问题。因为我是自己直接在中间层组织包,不经过上面的协议,所以我不知道其MAC地址甚至IP地址到底是什么,这些信息从哪里得到呢?


1、从你接收到的包中获得。
2、从注册表中获得。
3、发OID查询获得。
通过这三个手段,基本能得到你需要的大部分信息。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-08-02 09:41
下面是引用whomi于2005-08-01 11:02发表的:
另外,请教各位,校验和的问题如何解决

我贴过源码,搜搜看。
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-08-02 17:02

1、从你接收到的包中获得。
2、从注册表中获得。
3、发OID查询获得。
通过这三个手段,基本能得到你需要的大部分信息。



谢谢asmsys老大帮助,不过不知老大提供的这三种方法具体怎么实现呢?不敢要源码,只求简单描述一下或是告知一下哪里有资料,不胜感激
我思故我在
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-08-03 12:56
下面是引用michael4338于2005-08-02 17:02发表的:



谢谢asmsys老大帮助,不过不知老大提供的这三种方法具体怎么实现呢?不敢要源码,只求简单描述一下或是告知一下哪里有资料,不胜感激


比如从IMD拦截到一个包中取得MAC地址。包的格式如下:
typedef struct _MAC                                   //14byte
{
       unsigned char       DstMac[6];              //目标MAC地址
       unsigned char       SrcMac[6];              //源MAC地址
       unsigned short        FrameType;              //帧类型
} MAC,*PMAC;
FrameType可区分紧跟着的IP或ARP等包。详细的结构讲网络的书上都有。

再比如OID:
while(Oid == OID_GEN_NETWORK_LAYER_ADDRESSES)
{
//       DbgPrint("=>OID_GEN_NETWORK_LAYER_ADDRESSES\n");
    pAddrList = (PNETWORK_ADDRESS_LIST)NdisRequest->DATA.SET_INFORMATION.InformationBuffer;

    if (pAddrList->AddressCount <= 0)
              break;

    pAddr = (PNETWORK_ADDRESS)&pAddrList->Address[0];

    if (pAddr->AddressType != NDIS_PROTOCOL_ID_TCP_IP)
              break;

    pIpAddr = (NETWORK_ADDRESS_IP UNALIGNED *)&pAddr->Address[0];
    ipsec_local_ipaddr = pIpAddr->in_addr;
       break;
};
通过在PtRequestComplete中拦截OID_GEN_NETWORK_LAYER_ADDRESSES。
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-08-05 11:30
在版主zhaock的帮助建议下,我完成了在中间层自己构造数据包发送的中间层驱动程序,其实是完全仿照2000/XP的DDK的协议驱动例子passthru/ndisuio,得出以下结论,希望对你有建议性帮助:在中间层之间传输数据(用以太网)数据结构是包含MAC头的帧;帧内容只需要1个六位目的MAC地址,其他信息位可任意,就可把数据传输到目的计算机中间层;计算机MAC地址获得方法为,开始--附件-dos系统下输入ipconfig/all
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-08-05 11:48
谢谢guocaijian,您的说明无疑是有建设性的。这样的话我在局域网中就可以发送了。
我想再问你两个问题:
  1、你参考的Passthru 和 NdisUio 那么你创建设备用的是NdisUio中的IoCreateDevice还是Passthru中的RegistDevice?
  2、你的应用程序与驱动程序交互时使用的是NdisUio 中的IRP_MJ_READ和IRP_MJ_WRITE 还是
Passthru中的IRP_MJ_IOCTROL?

谢谢啦
我思故我在
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-08-06 15:59
1。中间层驱动只能用RegistDevice,不能IoCreateDevice。
2.收发数据用IRP_MJ_READ。IRP_MJ_WRITE ,其他用IRP_MJ_IOCTROL,我都用了
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-08-06 17:28
不会吧?我用IRP_MJ_READ和IRP_MJ_WRITE进去就重启,什么都没干就返回Irp,真是奇怪。另外好像中间层可以用IoCreateDevice吧?以前HuYuguang老大有个帖子专门说的
我思故我在
上一页
游客

返回顶部