驅動程式堆疊的主要職責之一是在使用者模式應用程式和系統裝置之間傳輸資料。 作系統提供下列三種方法來存取數據緩衝區:
緩衝 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 方法。 如需詳細資訊,請參閱 初始化裝置物件。
針對 IRP_MJ_DEVICE_CONTROL 和 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求,I/O 方法是由每個 IOCTL 值中包含的 TransferType 值所決定。 如需詳細資訊,請參閱 定義 I/O 控制程式碼。
驅動程式堆疊中的所有驅動程式都必須針對每個要求使用相同的緩衝區存取方法,但最高層級的驅動程式例外,因為它可以不使用任何一種方法,而不論其他較低層級的驅動程式所使用的方法為何。