#驱动 #系统调用 #API 绑定 #Windows #minifilter

程序+库 fsfilter-rs

一个用于在 Windows 中监控文件系统和更多内容的 Rust 库

6 个版本 (重大变更)

0.8.0 2023年3月6日
0.6.0 2022年12月20日
0.5.5 2022年12月19日
0.5.0 2022年11月9日
0.3.0 2022年10月28日

#272 in Windows API

MIT 许可协议

5.5MB
2.5K SLoC

C++ 1.5K SLoC // 0.2% comments Rust 537 SLoC // 0.0% comments Visual Studio Project 130 SLoC Visual Studio Solution 37 SLoC

fsfilter-rs

Rust Crates.io docs.rs

一个用于在 Windows 中监控文件系统和更多内容的 Rust 库。

shared_def

MINIFILTER

有关构建 minifilter 或直接使用提供的 .inf 文件进行安装的说明,请参阅 MINIFILTER.md

如果您不想安装 Visual Studio、SDK 和 WDK,也可以使用 EWDK 构建。

注意:默认情况下,它为 Windows 10 及以上版本构建。

注意:在管理员命令提示符中执行 Bcdedit.exe -set TESTSIGNING ON 以启用加载测试签名驱动程序。

运行示例

使用 cargo run --bin minifilter --release 运行示例应用程序,或者直接以管理员身份运行在仓库中提供的 .exe 文件(由于某种原因,2H22 的新默认终端(不是以管理员身份运行时打开的那个)非常、非常慢)。

程序开始打印定义的 IOMessage

#[repr(C)]
pub struct IOMessage {
    /// The file extension
    pub extension: [wchar_t; 12],
    /// Hard Disk Volume Serial Number where the file is saved (from [`FILE_ID_INFO`])
    pub file_id_vsn: c_ulonglong,
    /// File ID on the disk ([`FILE_ID_INFO`])
    pub file_id_id: [u8; 16],
    /// Number of bytes transferred (`IO_STATUS_BLOCK.Information`)
    pub mem_sized_used: c_ulonglong,
    /// (Optional) File Entropy calculated by the driver
    pub entropy: f64,
    /// Pid responsible for this io activity
    pub pid: c_ulong,
    /// Windows IRP Type caught by the minifilter:
    /// - NONE (0)
    /// - READ (1)
    /// - WRITE (2)
    /// - SETINFO (3)
    /// - CREATE (4)
    /// - CLEANUP (5)
    pub irp_op: c_uchar,
    /// Is the entropy calculated?
    pub is_entropy_calc: u8,
    /// Type of i/o operation:
    /// - FILE_CHANGE_NOT_SET (0)
    /// - FILE_OPEN_DIRECTORY (1)
    /// - FILE_CHANGE_WRITE (2)
    /// - FILE_CHANGE_NEW_FILE (3)
    /// - FILE_CHANGE_RENAME_FILE (4)
    /// - FILE_CHANGE_EXTENSION_CHANGED (5)
    /// - FILE_CHANGE_DELETE_FILE (6)
    /// - FILE_CHANGE_DELETE_NEW_FILE (7)
    /// - FILE_CHANGE_OVERWRITE_FILE (8)
    pub file_change: c_uchar,
    /// The driver has the ability to monitor specific directories only (feature currently not used):
    /// - FILE_NOT_PROTECTED (0): Monitored dirs do not contained this file
    /// - FILE_PROTECTED (1)
    /// - FILE_MOVED_IN (2)
    /// - FILE_MOVED_OUT (3)
    pub file_location_info: c_uchar,
    /// File path on the disk
    pub filepathstr: String,
    /// Group Identifier (maintained by the minifilter) of the operation
    pub gid: c_ulonglong,
    /// see class [`RuntimeFeatures`]
    pub runtime_features: RuntimeFeatures,
    /// Size of the file. Can be equal to -1 if the file path is not found.
    pub file_size: i64,
    /// Rough time at which the IRP was created
    pub time: SystemTime,
}

在示例视频中,我们使用 ctrl + c 终止进程:视频

性能

最小筛选器的性能实际上并没有超过 <1% 的CPU使用率(我在运行创建多个临时文件的脚本时从未见过它达到过1%)。尽管如果你尝试运行 cargo run --bin minifilter --release,你可能会看到峰值达到 1-3%,但这是因为控制台本身(在bin示例中注释掉 writeln!)或者尝试更换控制台(也许可以直接运行 minifilter.exe)。

调试

有关使用 VirtualKD-ReduxWinDbg 在VMware Windows机器上设置调试的说明,请参阅 DEBUG

维护者

请随时提出问题或查询。您可以随时联系当前维护者。

目前由以下人员维护

  • sn99(原作者)

前任维护者

  • N/A

许可

本项目的许可条款适用于MIT许可

感谢

依赖项

~133MB
~2M SLoC