【问题标题】:File System Filter Driver - File Name Breakage文件系统过滤器驱动程序 - 文件名损坏
【发布时间】:2017-07-11 02:49:14
【问题描述】:

我目前正在开发文件系统过滤器驱动程序。

过滤器驱动的作用是检查哪些文件被创建和删除并留下日志。

在大多数情况下,此过滤器驱动程序运行良好。

然而,有时 TargetFileObject-> FileName 会奇怪地分解为 Unicode 字符串。

我不知道为什么会这样。

当这种情况发生时,就会发生 BSOD。

(BSOD的原因是0x19 Bad Pool Header。)保存文件名和日志后调用ExFreePool函数时发生。

我应该忽略这种情况吗?或者有没有办法验证这样的事情?

上图可能是“\Windows\...”

谁有同样的问题并解决了?

--------------修改--------- ---

以下是我的部分源代码。

FLT_PREOP_CALLBACK_STATUS FLTAPI MinifilterPreCallBack
(
    __inout PFLT_CALLBACK_DATA pData,
    __in PCFLT_RELATED_OBJECTS pFltObjects,
    __deref_out_opt PVOID* ppCompletionContext
)
{

    ...

    if(KeGetCurrentIrql() != PASSIVE_LEVEL)
    {
        return FLT_PREOP_SUCCESS_NO_CALLBACK;
    }
    if(PsGetCurrentProcessId()==4)
    {
        return FLT_PREOP_SUCCESS_NO_CALLBACK;
    }

    ...

    Status = IoVolumeDeviceToDosName(Data->Iopb->TargetFileObject->DeviceObject, &DriveName);

    ...

    UNICODE_STRING FileName = Data->Iopb->TargetFileObject->FileName;
    WCHAR* FullFilePath = ExAllocatePool(NonPagedPool, (DriveName.Length + FileName.Length) * 2 + 10);
    swprintf(FullFilePath, L"FILE_CREATED %wZ%wZ", &DriveName, &Data->Iopb->TargetFileObject->FileName);

    ... // Save Log or DbgPrint ...

    ExFreePool(FullFilePath);
}

它的操作大致如上。

查找驱动器名称为 IoVolumeDeviceToDosName (\Device\HarddiskVolume1 -> C:) 查找文件名(FileObject-> FileName)

通过使用 ExAllocatePool 分配缓冲区大小 使用 swprintf 获取完整路径。

我不知道为什么这是一个错误。

当出现蓝屏时,总是出现断线如上的情况。

【问题讨论】:

  • 显然 FileName.Buffer 已经被调用 ExFreePool 释放(这并给出损坏的前 2 个 Unicode 符号(4 字节 - x86 上的 sizeof(pvoid))) - 内存返回到池中。还值得注意的是FileName.Length==0。所以这里是双重免费的。可能是这个你和这样做,没有查看代码很难说。为什么你要尝试免费文件名?仅当您返回 STATUS_REPARSE 时,这才有意义。根本就 - 为什么你用ExFreePool而不是RtlFreeUnicodeString来命名?替换为 RtlFreeUnicodeString 开始 - 你还有这个蓝屏吗?
  • 我从来没有释放过相同的内存两次。据我所知,连续释放相同的内存认为自己是蓝屏。我不确定 STATUS_REPARSE。我不能很好地搜索。我认为重要的是 swprintf () 由于字符串损坏而导致溢出。我尝试使用 _snwprintf 来避免溢出,但发生了同样的问题。我希望能够过滤掉损坏的字符串并忽略它们。
  • 在屏幕中显示FileObject.FileName,而在代码中显示绝对另一个(FullFilePath)(以及这里的NonPagedPool 是什么?)。我怎么说这种开始字符串更改(在屏幕上)到期FileObject.FileName.Buffer 已经免费
  • 对不起,我的英语不够。我看不懂你的英语。你能简单解释一下吗?

标签: filesystems driver windows-kernel filter-driver


【解决方案1】:

FileName 在任何文件对象结构中,无论是Data->Iopb->TargetFileObject 还是pFltObjects,都不需要一直存在。操作系统可以在需要时释放该内存。

FileName 仅在Pre-Create 回调函数中有效。 通常,您需要将文件名存储在附加到文件对象的自己的结构中,作为流/文件/句柄上下文。并在其他回调中使用它。

【讨论】:

  • 那么你的意思是在 PreCallBack 中我需要将文件名存储在全局变量中或分配的驱动程序的内存空间中并在 PostCallBack 中使用它?文件名在 PostCallback 中无效吗?我认为它们在 PostCallback 中是有效的,但是......我会尝试评论。
  • 他们保证它在 PreCreate 回调中是有效的。在其他 IRP 中可能是也可能不是。
【解决方案2】:

缓冲区溢出。

L"FILE_CREATED"的长度超过10,所以缓冲区不够。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 2021-08-19
    • 1970-01-01
    • 2015-03-21
    • 2017-10-09
    • 2015-06-18
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多