设为首页收藏本站language 语言切换
查看: 876|回复: 0
收起左侧

数据的发送、接受和截取

[复制链接]
发表于 2013-7-29 22:12:38 | 显示全部楼层 |阅读模式
    数据的发送由上层协议驱动发起,发送的数据信息用一个NDIS_PACKET包来描述。NDIS库提供了一些函数来提取包中的信息,并对其进行处理。

发送过程可分为两种情况:
1)       当协议驱动程序有数据要发送时,启动传输操作,通过NIDS库调用微端口驱动程序的MYNE2000Send函数。该函数调用的参数是一个指向NDIS_PACKET包(描述将要发送的信息)的指针。驱动调用NdisQueryPacket函数得到包的长度和存放待发送包缓冲区的逻辑地址。然后设置NIC上的寄存器将包发送出去,并返回一个发送成功的状态。

2)      如果驱动程序不能立即发送包,则将它送到“待传输”队列中,然后由中断处理函数MYNE2000HandleInterrupt来完成发送。完成发送以后,调用NdisMSendComplete函数通知上层发送已经完成。

    由于从上层传下来的数据包到微端口层被放在预先分配的缓冲区中。用NDIS提供的相应函数,可以得到该缓冲区的首地址和数据长度。因此,可在驱动程序中加入Send_Intercept子程序,利用NDIS提供的函数得到存放数据缓冲区的相应参数。然后调用加密模块接口函数DES_ENCRYPT对数据包进行加密。最后调用CardWrite子程序将加密后的密文发送到网络上。

    这里需要注意的是当微端口驱动程序准备发送数据包时,总是认为上层的协议驱动程序不会发送一个太大的数据包到微端口层。因为根据NDIS,协议驱动程序会在初始化时查询微端口并决定包的最大长度,协议驱动只能传送大小在微端口层所支持范围内的数据包。在本方案中,数据包的最大长度不会超过1514字节。

    数据接收是将网络上的数据帧接收到网卡缓冲区中,然后由驱动程序将缓冲区中的数据读入内存中。 网卡接收数据时会产生一个中断,因此驱动程序接收数据首先要在中断处理过程MYNE2000HandleInterrup中进行。对于以太网卡,程序调用NdisMEthReceiveIndicate函数将一个称为lookahead的数据传递给上层协议驱动,由协议驱动检查收到的数据是否符合协议要求。lookahead是指网卡中准备接收的数据的一部分。因为协议驱动判断微端口接收的数据是否符合协议要求时,不需要对所有数据都进行判断,只需对一部分数据(lookahead)进行判断即可。


    如果协议驱动判断数据符合要求,就会调用微端口的MYNE2000TransferData函数,将除lookahead之外剩余的数据传送到内存中,再交给上层驱动处理。当传送完毕时,调用NdisMEthReiveIndicatecomplete函数通知上层驱动数据已经接收完毕。如果协议驱动检查数据不符合要求,就会终止接收过程。而已经传送到内存中的lookahead也会被下次接收到的数据覆盖掉。

    在接收过程中截取数据需要注意一个问题。按照NDIS的规定:在接收数据时,先要调用NdisMEthReceiveIndicate函数将网卡缓冲区中接收的数据的一部分(lookahead)送到上层驱动程序,余下的数据仍在网卡缓冲区中。但是这样会把密文数据分割开,从而无法完成对数据的解密。

    因此,必须另外开辟出一块缓冲区Prebuffer,在接收截取子程序Receive_Intercept中先调用CardRead子程序,将网卡缓冲区中所有密文数据送入内存缓冲区Prebuffer,同时得到数据长度。然后调用解密模块函数DES_DECRYPT对密文进行解密,解密后的数据存放在Prebuffer中。接下来按照原先的接收顺序,先送一部分数据到lookahead,交协议驱动确认后,再将剩余数据送往上层,最后调用Indicatecomplete函数表示接收过程已经结束。

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-2-2 16:53 , Processed in 0.058066 second(s), 12 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表