"緩衝"方法(method_buffered)
備註:在下面的討論中,"輸入"表示資料從使用者模式的應用程式到驅動程式,"輸出"表示資料從驅動程式到應用程式。
對於讀取請求,i/o 管理器分配乙個與使用者模式的緩衝區大小相同的系統緩衝區。irp 中的 systembuffer 字段包含系統位址。 userbuffer 字段包含初始的使用者緩衝區位址。當完成請求時,i/o 管理器將驅動程式已經提供的資料從系統緩衝區複製到使用者緩衝區。對於寫入請求,會分配乙個系統緩衝區並將 systembuffer 設定為位址。使用者緩衝區的內容會被複製到系統緩衝區,但是不設定 userbuffer。對於 ioctl 請求,會分配乙個容量大小足以包含輸入緩衝區或輸出緩衝區的系統緩衝區,並將 systembuffer 設定為分配的緩衝區位址。輸入緩衝區中的資料複製到系統緩衝區。userbuffer 字段設定為使用者模式輸出緩衝區位址。核心模式驅動程式應當只使用系統緩衝區,且不應使用 userbuffer 中儲存的位址。
對於 ioctl,驅動程式應當從系統緩衝區獲取輸入並將輸出寫入到系統緩衝區。當完成請求時,i/o 系統將輸出資料從系統緩衝區複製到使用者緩衝區。
2k中的原始碼實現是這樣的:
irpsp->parameters.deviceiocontrol.type3inputbuffer = (pvoid) null;
try
irp->flags = irp_buffered_io | irp_deallocate_buffer;
irp->userbuffer = outputbuffer;
if (argument_present( outputbuffer ))
} else
可以看出exallocatepoolwithquota先分配了一塊系統記憶體,把使用者態輸入緩衝區的資料拷貝到系統記憶體irp->associatedirp.systembuffer 中。而irp->userbuffer 則儲存了當前的輸出緩衝區。
所以我們可以用irp->userbuffer來傳遞具有多個引數的驅動 ioctl請求的第二個引數來使用。
param1buffer = irp->associatedirp.systembuffer;
param2buffer = irp->userbuffer;
最後還是要把要輸出的資料放到irp->associatedirp.systembuffer中輸出。irp->associatedirp.systembuffer中的資料會複製到irp->userbuffer。
這種使用方式要注意irp->userbuffer作為輸出緩衝區時,最好不要直接賦值。除非irp->userbuffer=irp->associatedirp.systembuffer
關於程式關於世界
首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...
關於血液關於軟體
1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...
關於冷漠,關於愛情
我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...