我试图确定为什么我的过滤器导致磁盘管理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,因此它将无限期等待。那就是它卡住的地方。那么我的问题是内核与用户态之间的通信存在错误。就我而言,userland应用程序本身就失败了。由于失败,它不会向驱动程序发送确认,因此它会等待。

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

10-13 06:42