天天看點

windows驅動程式wdf--KMDF擷取應用程式資料緩沖區位址

有3種常用方式:method_buffered  method_in_direct  method_out_direct

  還有method_neither,《windows裝置驅動wdf開發》描述為:源自win 9x的vxd的模式,不建議讀者掌握。這個就不管了。

  method_buffered:無論讀和寫都對應同一緩沖區

  method_in_direct\ method_out_direct:輸入緩沖區可作為附加輸出緩沖區,輸出緩沖區可作為附加輸入緩沖區,兩者差別隻在dma讀寫要厘清,詳見《windows裝置驅動wdf開發》的dma_sample

  舉簡例:

  應用層deviceiocontrol傳兩個unchar數(2 和 4)的位址給驅動。

  驅動讀取位址提取數值,兩數相加完成請求返還給應用層。

  以上過程分别以:method_buffered    method_in_direct  method_out_direct 各執行一次

windows驅動程式wdf--KMDF擷取應用程式資料緩沖區位址

   驅動層evtdeviceiocontrol例程讀取處理部分:

#define iosample_ioctl_buffered ctl_code(file_device_unknown, 0x800, method_buffered, file_any_access)

#define iosample_ioctl_in_direct ctl_code(file_device_unknown, 0x801, method_in_direct, file_any_access)

#define iosample_ioctl_out_direct ctl_code(file_device_unknown, 0x802, method_out_direct, file_any_access)

    switch(iocontrolcode)

   {

    case iosample_ioctl_buffered:

    case iosample_ioctl_in_direct:

    case iosample_ioctl_out_direct:

if (inputbufferlength  == 0 || outputbufferlength == 0)

{ //檢查輸入、輸出參數有效性

wdfrequestcomplete(request, status_invalid_parameter);

}

else

{

//method_buffered,method_out_direct,method_in_direct三種方式,

//輸入緩沖區位址可通過調用wdfrequestretrieveinputbuffer函數獲得

//輸出緩沖區位址可通過調用wdfrequestretrieveoutputbuffer函數獲得

//擷取輸入緩沖區位址buffer

status = wdfrequestretrieveinputbuffer(request, 1, &buffer, null);

if (!nt_success(status))

wdfrequestcomplete(request, status_unsuccessful);

        break;

//buffer表示輸入緩沖區位址

//輸入x1=應用程式傳給驅動程式的數字

x1 = *(uchar *)buffer;

//擷取輸出緩沖區位址buffer

status = wdfrequestretrieveoutputbuffer(request, 1, &buffer, null);

if (!nt_success(status)) 

break;

//輸入x2=應用程式通過輸出緩沖區傳給驅動程式的數字

x2 = *(uchar *)buffer;

*(uchar *)buffer=x1+x2;

//完成i/o請求,驅動程式傳給應用程式的資料長度為1位元組

wdfrequestcompletewithinformation(request, status_success, 1);

    default :

        status = status_invalid_device_request;

wdfrequestcompletewithinformation(request, status, 0);

    }

分析:對于method_buffered:

  驅動層輸入輸出緩沖區對應應用層的輸入緩沖區和輸出緩沖區,wdfrequestretrieveinputbuffer和wdfrequestretrieveoutputbuffer都讀取同一位置,是以2+2=4。那個6的位址在驅動層是不可讀的,他隻是應用層接受來自驅動的輸出結果

對于method_out_direct,method_in_direct:

  驅動層輸入緩沖區,驅動層輸出緩沖區分别于應用層對應。是以那個6的位址對于驅動層是可讀的,實際上這就是所謂“輸出緩沖區可作為附加的輸入緩沖區”

繼續閱讀