c - Minifilter 导致磁盘管理和系统恢复滞后

标签 c driver lag minifilter

我正在尝试确定为什么我的过滤器会导致磁盘管理 diskmgmt.msc 滞后。它会卡住很长一段时间,直到显示或根本不显示。

我的调查和结论已经大大缩小了问题的范围。我将编写一些代码,这些代码被大大缩短以方便阅读。我相当确定这足以回答这个问题。

你看,下面的代码有效。结果是返回的值。

    if(Data->Iopb->MajorFunction == IRP_MJ_VOLUME_MOUNT)
        {
dev = diskDevice->DeviceType;
        if((FILE_DEVICE_MASS_STORAGE == dev) || (FILE_DEVICE_DISK == dev) || 
                    (FILE_DEVICE_DISK_FILE_SYSTEM == dev) || (FILE_DEVICE_VIRTUAL_DISK == dev)
                    || (FILE_DEVICE_FILE_SYSTEM == dev) || (dev >= 32768))
                    {
                        if(FLT_FSTYPE_NTFS == fs_type)
                        {
                            Result = FLT_PREOP_SUCCESS_WITH_CALLBACK; 

                        }
                        else
                        {
                            Result = FLT_PREOP_SUCCESS_NO_CALLBACK;
                        }
                    }

        }

如果“else”是FLT_PREOP_SUCCESS_WITH_CALLBACK;,它就会滞后。

因此,我的假设是,除 NTFS 之外,某些特定的 FLT_FSTYPE 有特定的行为。因此我的问题是,哪一个有具体要求?

除了日志记录之外,我的 PostOperation 函数不执行其他操作。该函数始终返回 FLT_POSTOP_FINISHED_PROCESSING。

最佳答案

好吧,我的问题不是由枚举值或涉及任何“魔法”引起的。枚举决定 postOperation 是否应该运行。常识告诉我们,问题就在这里。正如我所说,我在那里所做的只是记录东西。是的,这就是问题所在。我使用FltSendMessage函数。由于我没有计时器并且设置为 NULL,因此它将无限期地等待。这就是它被卡住的地方。我的问题是内核和用户空间之间的通信存在错误。就我而言,用户态应用程序本身失败了。由于失败,它不会向驱动程序发送确认,因此它会等待。

关于c - Minifilter 导致磁盘管理和系统恢复滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50234168/

相关文章:

video - "Man in the middle"驱动程序?

linux - 如何在内核模块代码中添加轮询功能?

java - 无法使用我的设备运行我的应用程序

c++ - 为什么在我的多人乒乓球游戏中对手的 Racket 滞后?

安卓 2.2 : Problem playing video from SD card

c - 系统调用读取行为怪异

c - 如何从(文本数据 bss dec hex)估计 RAM ROM 使用情况

c++ - 在 qt creator 中使用 winpcap 库

c++ - longjmp 展开的 C/C++ 实现?

cuda - 在长内核期间避免延迟显示的任何提示?