存取資料緩衝區的方法
驅動程式堆疊的其中一個主要責任是在使用者模式應用程式與系統裝置之間傳輸資料。 作業系統提供下列三種方法來存取資料緩衝區:
緩衝 I/O
作業系統會建立非分頁系統緩衝區,大小等於應用程式的緩衝區。 針對寫入作業,I/O 管理員會在呼叫驅動程式堆疊之前,將使用者資料複製到系統緩衝區。 針對讀取作業,I/O 管理員會在驅動程式堆疊完成要求的作業之後,將資料從系統緩衝區複製到應用程式的緩衝區。
如需詳細資訊,請參閱 使用緩衝 I/O。
直接 I/O
作業系統會在記憶體中鎖定應用程式的緩衝區。 然後它會建立記憶體描述元清單 (MDL) ,以識別鎖定的記憶體頁面,並將 MDL 傳遞至驅動程式堆疊。 驅動程式會透過 MDL 存取鎖定的頁面。
如需詳細資訊,請參閱 使用直接 I/O。
未緩衝處理或直接 I/O
作業系統會將應用程式緩衝區的虛擬起始位址和大小傳遞給驅動程式堆疊。 緩衝區只能從在應用程式執行緒內容中執行的驅動程式存取。
如需詳細資訊,請參閱 使用未緩衝處理或直接 I/O。
針對 IRP_MJ_READ 和 IRP_MJ_WRITE 要求,驅動程式會在每個 DEVICE_OBJECT 結構中使用旗標來指定 I/O 方法。 如需詳細資訊,請參閱 初始化 Device 物件。
對於 IRP_MJ_DEVICE_CONTROL 和 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求,I/O 方法取決於每個 IOCTL 值中包含的 TransferType 值。 如需詳細資訊,請參閱 定義 I/O 控制程式碼。
驅動程式堆疊中的所有驅動程式都必須針對每個要求使用相同的緩衝區存取方法,但可能適用于最高層級驅動程式 (,不論較低驅動程式所使用的方法為何) 。