您的位置:首页 > 其它

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

2010-06-23 10:52 441 查看
本文转自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;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: