首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

檔案系統驅動程式開發基礎(三):IOCTL 控制操作詳解

     編輯:關於C++

物件管理與命名空間

核心空間物件由物件管理器統一管理,邏輯上以命名空間組織。Device 目錄存放 IoCreateDevice 建立的裝置物件,FileSystem 目錄存放檔案系統驅動與識別器裝置物件。使用者模式透過「符號連結」映射存取核心裝置物件,如 COM1 對應 Serial0,C: 對應 HarddiskVolume4。核心建立符號連結用 IoCreateSymbolicLink,使用者模式用 DefineDosDevice。

hDevice = CreateFile("\\\\.\\IoctlTest", GENERIC_READ | GENERIC_WRITE, 0, NULL,
                     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

其中 \\.\\ 對應命名空間 GLOBAL??。

IOCTL 控制碼結構

IOCTL 為 4 位元組整數,由巨集 CTL_CODE 定義:

#define IOCTL_Device_Function CTL_CODE(DeviceType, Function, Method, Access)

位元分配:DeviceType (16-31)、Function (2-13)、Method (0-1)、Access (14-15)。驅動程式可定義多個 IOCTL 碼對應不同功能。

同步/非同步與緩衝區模式

DeviceIoControl 函數

BOOL DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode,
    LPVOID lpInBuffer, DWORD nInBufferSize,
    LPVOID lpOutBuffer, DWORD nOutBufferSize,
    LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);

最後一個參數決定同步/非同步(需 FILE_FLAG_OVERLAPPED 開啟裝置)。同步模式下函數阻塞直到核心操作完成。

四種緩衝模式比較

模式特性效率
METHOD_BUFFERED輸入/輸出皆在使用者與核心緩衝區間複製較低
METHOD_IN_DIRECT輸入複製,輸出透過 MDL 直接映射中等
METHOD_OUT_DIRECT輸出透過 MDL 直接映射,輸入複製中等
METHOD_NEITHER直接傳遞使用者緩衝區位址,驅動需在該處理序內文存取最高

MDL (Memory Descriptor List) 將使用者模式記憶體映射至核心,避免複製。Neither 模式要求驅動程式在正確的處理序內文執行。

執行內文

驅動例程可能在三種內文執行:系統處理序內文、特定使用者執行緒/處理序內文、任意使用者執行緒/處理序內文。理解內文對正確存取使用者模式記憶體至關重要。

實作範例與資源

  • WINDDK\\3790\\src\\general\\ioctl:標準 IOCTL 範例,含服務安裝/啟動/停止/移除流程與 DeviceIoControl 使用。
  • Rootkits 內核鉤子、SSDT 分析、被佔用檔案操作、diskid32 磁碟序列號讀取 等進階應用。

結語

IOCTL 設計簡單功能強大,掌握控制碼定義、緩衝模式選擇與同步/非同步機制,即可實現使用者模式與核心高效互動。建議以標準範例為基礎,逐步理解相關資料結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved