文件系统筛选器驱动程序 - 文件名破坏

时间:2017-07-11 02:49:15

标签: filesystems driver windows-kernel filter-driver

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

过滤器驱动程序的作用是检查正在创建和删除的文件以及保留日志。

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

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

我不知道为什么会这样。

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

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

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

enter image description here

上面的图片可能是“\ 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获取完整路径。

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

当发生BSOD时,总是出现断线字符串如上所述的情况。

2 个答案:

答案 0 :(得分:0)

任何文件对象结构中的

FileNameData->Iopb->TargetFileObjectpFltObjects都不需要始终存在。操作系统可以在需要时释放内存。

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

答案 1 :(得分:0)

缓冲区溢出。

L“ FILE_CREATED”的长度大于10。因此缓冲区不足。

相关问题