本文转自http://eslxf.blog.51cto.com/918801/219072
1.8.3 发送队列方式的接口实现
1.8.3.1 NPF_IoControl函数
用户层应用程序执行DeviceIoControl系统调用,通过BIOCSENDPACKETSSYNC 或BIOCSENDPACKETSNOSYNC 的IOCTL命令来调用NPF_BufferedWrite函数。下面为具体的实现代码:
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;
…
}