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

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;
   
}

你可能感兴趣的:(职场,休闲,winpcap)