承接上集,本文說明 Windows 95/98 應用程式如何與 VxD 進行通訊。核心機制是透過 DeviceIoControl 函數傳送控制碼。以下提供完整範例程式 FHTEST.C,示範攔截檔案系統 API 的流程。
程式建立一個標準視窗,於 WM_CREATE 時以 CreateFile 開啟 \\.\FILEHOOK.VXD 動態載入 VxD,再呼叫 DeviceIoControl 發送 INSTALL_FILE_SYSTEM_API_HOOK 安裝鉤子;WM_DESTROY 時發送 UNINSTALL_FILE_SYSTEM_API_HOOK 移除鉤子並關閉裝置控制代碼。
// WM_CREATE 片段
hDevice = CreateFile("\\\\.\\FILEHOOK.VXD", 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL);
if (hDevice != INVALID_HANDLE_VALUE) {
bResult = DeviceIoControl(hDevice, INSTALL_FILE_SYSTEM_API_HOOK, NULL, 0, NULL, 0, &cb, 0);
// 顯示安裝成功或失敗訊息
}
// WM_DESTROY 片段
if (hDevice != INVALID_HANDLE_VALUE) {
bResult = DeviceIoControl(hDevice, UNINSTALL_FILE_SYSTEM_API_HOOK, NULL, 0, NULL, 0, &cb, 0);
CloseHandle(hDevice);
}
此範例展示了完整的 VxD 載入、控制碼傳送、卸載流程,可作為檔案系統監控、防毒防火牆等核心元件的基礎架構。VxD 功能遠不止於此,善用 VMM 服務與 VxD 服務可開發出用戶模式 API 無法實現的高階應用。