阅读:6669回复:21
请问NDIS层收上来的包是哪一层的协议?IP层还是链路层?NDIS层待发送的包呢?
我想在NDIS层收包和发包,但是不太清楚NDIS层中收上来的包的格式是IP层的还是链路层的,还有将要往外发的包的格式是IP层的还是链路层的。
小弟急用,请各位大侠不吝赐教,多谢啦 |
|
|
沙发#
发布于:2005-07-26 12:29
链路层的。
看一下不就知道了吗。 |
|
板凳#
发布于:2005-07-26 16:06
发送和接收都是链路层的吗?我想在NDIS层自己组织符合协议形式的数据,如果是链路层的话那岂不是麻烦了?
|
|
|
地板#
发布于:2005-07-26 16:12
修改修改应该比较容易,自己组织就麻烦多了。
|
|
地下室#
发布于:2005-07-29 08:30
下面是引用michael4338于2005-07-26 16:06发表的: 确实都是MAC打头的包。 |
|
5楼#
发布于:2005-07-29 08:55
如果是链路层的,发送时我想自己组织包的内容,各个头的各个字段中哪个最不好对付?在我看来应该是发送的目标地址,请问各位如何得到并填入这个地址???
|
|
|
6楼#
发布于:2005-07-29 09:18
果然是隔行如隔山啊。
在通信协议部分,我觉得很简单,因为我平时就搞这个。 但是在驱动代码部分,唉,难啊,本人尚在学习阶段,不如我的这个问题我就很困惑: http://bbs.zndev.com/htm_data/16/0507/95655.html 你的“目的”包括3个,MAC、IP和端口,都在包里有相应的位置。自己看TCP/IP协议的包结构?这个二进制的东西对成天看文本的人来说也有点难度。 |
|
7楼#
发布于:2005-07-29 14:25
首先很感谢yunyanrong的回复,不过你只解决了往哪里放这些地址的问题,而没有解决怎样得到正确的地址的问题。因为我是自己直接在中间层组织包,不经过上面的协议,所以我不知道其MAC地址甚至IP地址到底是什么,这些信息从哪里得到呢?
|
|
|
8楼#
发布于:2005-08-01 11:02
另外,请教各位,校验和的问题如何解决
|
|
9楼#
发布于:2005-08-01 11:46
下面是引用whomi于2005-08-01 11:02发表的: 按公式计算就行了,具体的看TCP/IP协议。 |
|
10楼#
发布于:2005-08-01 15:06
下面是引用michael4338于2005-07-29 14:25发表的: 这些信息你都不知道从哪得到,别人更不可能知道, 如果对方是固定的,那你就可以在代码里面写死了, 如果对方不是,那你就得想办法查询,这个和你的需求有关,别人怎么可能知道怎么得到这些信息 比如你可以从收到的包里解析出这些信息,但是如果这些不是你想要的,那别人就帮不了你了 |
|
11楼#
发布于:2005-08-01 17:47
具体来说吧,在发送的时候,首先得经过局域网内,或广域网内的第一个节点。这第一个节点的信息好像注册表里有吧?因为系统每次接包发包都得经过它
|
|
|
12楼#
发布于:2005-08-02 09:40
下面是引用michael4338于2005-07-29 14:25发表的: 1、从你接收到的包中获得。 2、从注册表中获得。 3、发OID查询获得。 通过这三个手段,基本能得到你需要的大部分信息。 |
|
13楼#
发布于:2005-08-02 09:41
下面是引用whomi于2005-08-01 11:02发表的: 我贴过源码,搜搜看。 |
|
14楼#
发布于:2005-08-02 17:02
谢谢asmsys老大帮助,不过不知老大提供的这三种方法具体怎么实现呢?不敢要源码,只求简单描述一下或是告知一下哪里有资料,不胜感激 |
|
|
15楼#
发布于:2005-08-03 12:56
下面是引用michael4338于2005-08-02 17:02发表的: 比如从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。 |
|
16楼#
发布于:2005-08-05 11:30
在版主zhaock的帮助建议下,我完成了在中间层自己构造数据包发送的中间层驱动程序,其实是完全仿照2000/XP的DDK的协议驱动例子passthru/ndisuio,得出以下结论,希望对你有建议性帮助:在中间层之间传输数据(用以太网)数据结构是包含MAC头的帧;帧内容只需要1个六位目的MAC地址,其他信息位可任意,就可把数据传输到目的计算机中间层;计算机MAC地址获得方法为,开始--附件-dos系统下输入ipconfig/all
|
|
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? 谢谢啦 |
|
|
18楼#
发布于:2005-08-06 15:59
1。中间层驱动只能用RegistDevice,不能IoCreateDevice。
2.收发数据用IRP_MJ_READ。IRP_MJ_WRITE ,其他用IRP_MJ_IOCTROL,我都用了 |
|
19楼#
发布于:2005-08-06 17:28
不会吧?我用IRP_MJ_READ和IRP_MJ_WRITE进去就重启,什么都没干就返回Irp,真是奇怪。另外好像中间层可以用IoCreateDevice吧?以前HuYuguang老大有个帖子专门说的
|
|
|
上一页
下一页