深度剖析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;

   

}

本文出自 “千江月” 博客,請務必保留此出處http://eslxf.blog.51cto.com/918801/219072

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章