1.
裝置物件一共有三種讀寫方式:緩衝區方式讀寫(buffered方式);直接方式讀寫(direct方式);neither方式。這三種方式的flags分別對應do_buffered_io,do_direct_io,0
在buffered方式中,i/o管理器先建立乙個與使用者模式資料緩衝區大小相等的系統緩衝區。而你的驅動程式將使用這個系統緩衝區工作。i/o管理器負責在系統緩衝區和使用者模式緩衝區之間複製資料。
在direct方式中,i/o管理器鎖定了包含使用者模式緩衝區的物理記憶體頁,並建立乙個稱為mdl(記憶體描述符表)的輔助資料結構來描述鎖定頁。因此你的驅動程式將使用mdl工作。
在neither方式中,i/o管理器僅簡單地把使用者模式的虛擬位址傳遞給你。而使用使用者模式位址的驅動程式應十分小心。 2.
下面介紹緩衝區方式讀寫。其優點是比較簡單的解決了將使用者位址傳入驅動的問題,缺點是需要使用者模式和核心模式之間資料複製,可想而知,執行效率會受到影響。適合少量記憶體操作時使用的一種方法。
建立好裝置iocreatedevice後,需要設定do_buffered_io, pdevobj->flags |= do_buffered_io.
現在以readfile為例,首先應用程式中需要提供一段緩衝區並把緩衝區大小作為引數傳入,例如
uchar outputbuffer[10];
dword retlen = 0;
readfile(hdevice,outputbuffer,sizeof(outputbuffer),&retlen,null);
outputbuffer是提供的輸出緩衝區,是使用者模式的記憶體位址,作業系統將此緩衝區的資料複製到核心模式下的位址中,sizeof(outputbuffer)是緩衝區的大小,而retlen是真正的輸出的位元組數。
那麼核心模式怎麼得到此核心模式位址呢?怎麼得到writefile或readfile的位元組數呢?答案在下面。
此核心模式下的位址可以通過此readfile建立的irp的associatedirp.systembuffer得到。
假如請求的irp為pirp pirp(一般是派遣函式的引數),那麼uchar* outputbuffer= (uchar*)pirp->associatedirp.systembuffer;
而readfile請求的位元組數為io_stack_location中的parameters.read.length,writefilew為io_stack_location中的parameters.write.length
//得到當前堆疊
pio_stack_location stack = iogetcurrentirpstacklocation(pirp);
//得到readfile緩衝區大小
ulong cbread = stack->parameters..read.length;
//得到writefile緩衝區大小
ulong cbwrite = stack->parameters.write.length;
uchar* outputbuffer= (uchar*)pirp->associatedirp.systembuffer;
ulong cbread = stack->parameters..read.length;
memcpy(outputbuffer,0xbb,cbread);
這樣使用者模式下的緩衝區內得到的資料是0xbb。
另外還要設定實際操作的位元組數,pirp->iostatus.information = cbread;(實際操作的位元組數不一定要設定為緩衝區的大小,但也不應該大於緩衝區的大小)
那麼使用者模式下readfile的retlen被設定為cbread。
下面是irp_mj_read的派遣函式:
ntstatus dispatchread(in pdevice_object pdevobj, in pirp pirp)
裝置讀寫方式:直接讀取方式:
neither方式:
驅動開發之 裝置讀寫方式 緩衝區方式
1.裝置物件一共同擁有三種讀寫方式 緩衝區方式讀寫 buffered方式 直接方式讀寫 direct方式 neither方式。這三種方式的flags分別相應do buffered io,do direct io,0 在buffered方式中。i o管理器先建立乙個與使用者模式資料緩衝區大小相等的系統...
驅動開發之 裝置讀寫方式 緩衝區方式
驅動開發之 裝置讀寫方式 緩衝區方式 1.裝置物件一共有三種讀寫方式 緩衝區方式讀寫 buffered方式 直接方式讀寫 direct方式 neither方式。這三種方式的flags分別對應do buffered io,do direct io,0 在buffered方式中,i o管理器先建立乙個與...
裝置讀寫方式 緩衝區方式
1.裝置物件一共有三種讀寫方式 緩衝區方式讀寫 buffered方式 直接方式讀寫 direct方式 neither方式。這三種方式的flags分別對應do buffered io,do direct io,0 在buffered方式中,i o管理器先建立乙個與使用者模式資料緩衝區大小相等的系統緩衝...