深度剖析WinPcap之(九)——数据包的发送过程(12)

本文转自http://eslxf.blog.51cto.com/918801/219072

 

1.8.3 发送队列方式的接口实现
1.8.3.1 NPF_IoControl函数
          用户层应用程序执行DeviceIoControl系统调用,通过BIOCSENDPACKETSSYNC 或BIOCSENDPACKETSNOSYNC 的IOCTL命令来调用NPF_BufferedWrite函数。下面为具体的实现代码:
NTSTATUS NPF_IoControl(
IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp
)
{
    case BIOCSENDPACKETSSYNC:/*与时间戳同步的方式发送*/
       SyncWrite = TRUE;
 
    case BIOCSENDPACKETSNOSYNC: /*与时间戳不同步的方式发送*/  
/*写操作开始,设置为写状态*/      
       NdisAcquireSpinLock(&Open->WriteLock);
       if(Open->WriteInProgress)
       {
           NdisReleaseSpinLock(&Open->WriteLock);
           //另一个写操作当前正在处理,设置失败,函数返回
           SET_FAILURE_UNSUCCESSFUL();
           break;
       }
       else
       {
           Open->WriteInProgress = TRUE;
       }
       NdisReleaseSpinLock(&Open->WriteLock);
      
/*执行写操作*/
       WriteRes = NPF_BufferedWrite(
Irp,
           (PUCHAR)Irp->AssociatedIrp.SystemBuffer,        
IrpSp->Parameters.DeviceIoControl.InputBufferLength,
           SyncWrite
);
 
       /*写操作结束,设置为非写状态*/
       NdisAcquireSpinLock(&Open->WriteLock);
       Open->WriteInProgress = FALSE;
       NdisReleaseSpinLock(&Open->WriteLock);
       /*函数返回*/
       if( WriteRes != -1)
       {
           SET_RESULT_SUCCESS(WriteRes);
       }
       else
       {
           SET_FAILURE_UNSUCCESSFUL();
       }
       break;
    …
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值