Minifilter 导致磁盘管理和系统还原滞后
Minifilter cause lag on disk management and system restore
我正在尝试确定为什么我的过滤器导致磁盘管理 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;,它会滞后。
所以,我在这里的假设是某些特定的 FLT_FSTYPE 除了 NTFS 之外还有特定的行为。因此,我的问题是,哪一个有具体要求?
除了日志记录,我的 PostOperation 函数并没有做很多事情。该功能始终 returns FLT_POSTOP_FINISHED_PROCESSING。
好的,我的问题不是由枚举值或涉及的任何 "magic" 引起的。枚举决定 postOperation 是否应该 运行 。常识说问题出在这里。正如我所说,我在那里所做的只是记录东西。是的,这就是问题所在。我使用函数 FltSendMessage。由于我没有计时器并且设置为 NULL,它将无限期地等待。这就是它卡住的地方。我的问题是内核和用户空间之间的通信存在错误。在我的例子中,用户空间应用程序失败了。当它失败时,它不会向驱动程序发送确认,因此它会等待。
我正在尝试确定为什么我的过滤器导致磁盘管理 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;,它会滞后。
所以,我在这里的假设是某些特定的 FLT_FSTYPE 除了 NTFS 之外还有特定的行为。因此,我的问题是,哪一个有具体要求?
除了日志记录,我的 PostOperation 函数并没有做很多事情。该功能始终 returns FLT_POSTOP_FINISHED_PROCESSING。
好的,我的问题不是由枚举值或涉及的任何 "magic" 引起的。枚举决定 postOperation 是否应该 运行 。常识说问题出在这里。正如我所说,我在那里所做的只是记录东西。是的,这就是问题所在。我使用函数 FltSendMessage。由于我没有计时器并且设置为 NULL,它将无限期地等待。这就是它卡住的地方。我的问题是内核和用户空间之间的通信存在错误。在我的例子中,用户空间应用程序失败了。当它失败时,它不会向驱动程序发送确认,因此它会等待。