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;
…
}
本文出自 “千江月” 博客,請務必保留此出處http://eslxf.blog.51cto.com/918801/219072