Minifilter导致磁盘管理和系统还原滞后

时间:2018-05-08 12:54:42

标签: 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;
                        }
                    }

        }

如果"否则"将是FLT_PREOP_SUCCESS_WITH_CALLBACK;,它会滞后。

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

我的PostOperation功能除了记录之外没有做很多事情。该函数始终返回FLT_POSTOP_FINISHED_PROCESSING。

1 个答案:

答案 0 :(得分:0)

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