1. 程式人生 > >在64-bit 驅動中支援32-bit I/O 操作

在64-bit 驅動中支援32-bit I/O 操作

原文

https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/supporting-32-bit-i-o-in-your-64-bit-driver

        WOW64 機制使得Win32 使用者模式應用程式可以在64-bit windows 上執行。在Win32 函式呼叫轉移到64-bit 核心之前,截獲其呼叫並將指標精度型別的引數轉化為恰當的固定精度的型別。這種轉換叫做thunking,除了傳遞給DeviceIoControl 的資料緩衝外,其自動應用在所有的Win32 函式上。這些緩衝區的內容是通過InputBuffer和OutputBuffer 引數指定的,其並沒有被thunk,因為它們的結構是驅動相關的。
        儘管緩衝區內容沒有被thunk,緩衝區指標被轉換為64-bit 指標。
        使用者模式應用程式呼叫DeviceIoControl 函式來直接向特定的核心模式驅動傳送一個I/O 請求。這個請求包含一個I/O 控制碼(IOCTL)或者檔案系統控制碼(FSCTL)和指向輸入和輸出緩衝區的指標。這些資料緩衝區的結構是由IOCTL 或者 FSCTL 指定的,另外,這IOCTL 和 FSCTL 是由核心模式驅動定義的。因為緩衝區格式是任意的,只有定義它的驅動知道它的結構,而WOW64並不知道它的結構,所以thunk 這些資料的任務就留給了驅動。
        驅動程式滿足下面的要求時將支援32-bit I/O。

  1. 驅動暴露一個IOCTL(或FSCTL)給使用者模式應用程式。
  2. IOCTL 所使用的I/O 緩衝區至少有一個包含指標精度的資料型別。
  3. IOCTL 不能輕易被重寫以消除指標精度的快取資料型別的使用。