C 如何使用过滤器驱动程序(内核)捕获文件访问尝试,并提供允许/拒绝(用户)对话框?

C 如何使用过滤器驱动程序(内核)捕获文件访问尝试,并提供允许/拒绝(用户)对话框?,c,windows,kernel,driver,wdk,C,Windows,Kernel,Driver,Wdk,我一直在看Windows的。我从这个“FsFilter”示例开始: 经过努力,我成功地构建并登录了从64位Win8到32位WinXP的所有版本。(好的,只要我运行Bcdedit.exe-set TESTSIGNING ON以允许它接受我的测试证书,因为我没有向Microsoft支付250美元来签署我的.SYS文件。:-/) 现在我想修改FsFilter。我希望对某些类型的文件进行写访问,以被筛选器捕获。然后,我希望用户收到一个对话框,在这个对话框中,他们可以允许访问,也可以拒绝访问 很明显,内

我一直在看Windows的。我从这个“FsFilter”示例开始:

经过努力,我成功地构建并登录了从64位Win8到32位WinXP的所有版本。(好的,只要我运行
Bcdedit.exe-set TESTSIGNING ON
以允许它接受我的测试证书,因为我没有向Microsoft支付250美元来签署我的.SYS文件。:-/)

现在我想修改FsFilter。我希望对某些类型的文件进行写访问,以被筛选器捕获。然后,我希望用户收到一个对话框,在这个对话框中,他们可以允许访问,也可以拒绝访问

很明显,内核模式代码无法显示UI。它必须向某个用户模式进程发送信号,该进程将(在任意潜伏期后)向驾驶员发回用户意愿的信号。我看了一下(这是,而不是.DOC)

我不知道最好的方法是什么。我发现要研究的唯一示例是sysinternalsfilemon。它安装的驱动程序在缓冲区中收集数据,该缓冲区由.EXE根据WM_计时器循环定期请求:

// Have driver fill Stats buffer with information
if ( ! DeviceIoControl( SysHandle, IOCTL_FILEMON_GETSTATS,
            NULL, 0, &Stats, sizeof Stats,
            &StatsLen, NULL ) )
{
    Abort( hWnd, _T("Couldn't access device driver"), GetLastError() );
    return TRUE;
}
我应该使用类似的技术吗?也许过滤器驱动程序在收到想要检查的请求时,可以在包含两个事件的缓冲区中放置一条记录来跟踪请求。然后,它将等待这两个事件上的多个对象,它们表示用户模式发出的关于是否允许访问的信号“是”或“否”

监视器进程(在用户模式下运行)将定期使用自定义IOCTL从另一个线程轮询驱动程序。筛选器驱动程序将返回请求信息。。。以及请求正在等待的两个事件。监视器将等待用户的反馈,并在可用时发出相应事件的信号

我也可以反转这个模型。用户模式代码可以使用自定义IOCTL传入数据。。。例如,可以由驱动程序发出信号的事件,只需实现某种安全协议。这将消除投票的需要

基本上只是寻找方法上的指导,或在网上的一个工作示例!我还想知道异步文件访问的机制是什么。我假设有一种方法可以让正在进行检查的异步调用的客户端保持运行,并且只有在等待请求完成时才会被阻止


(注意:在构建和调试过滤器的过程中,我学到了一些通过“迷你过滤器”实现的更现代的技术,这些技术是所谓的。但目前,只要支持传统模型,我就不担心了。无论如何,它看起来很相似。)

你(又称我)我几乎列举了各种可能性。以FileMon的方式轮询,或传递事件。传递事件可能更容易出错,如果您不是线程专家,那么出错的可能性可能更大。但是如果你经常犯很多错误,那么设备驱动程序可能不适合你……跳伞也可能是一个糟糕的选择

我将提供一个看这个项目,但请注意自述中的免责声明。(这只是一个测试和调查):


是的,在某种程度上,微软和他们的驱动程序模型是令人担忧的,微型过滤器是当今更好的选择。

仍然建议我们看看微型过滤器,它有着非常简单的操作方式。简而言之,您可以从内核向用户发出请求,阻止用户检查访问,然后允许/禁止访问。@Rohan啊……不知何故,我忽略了以下优点:“过滤器管理器为与微型过滤器驱动程序一起工作的用户模式服务和控制程序提供通用功能。filter manager用户模式库Filterlib.dll支持用户模式服务或控制程序与微型过滤器驱动程序之间的通信。Filterlib.dll还为管理工具提供接口。“这可能正是我想要的,我会研究它的!”!