有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 各執行一次

驅動層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的位址對于驅動層是可讀的,實際上這就是所謂“輸出緩沖區可作為附加的輸入緩沖區”