【发布时间】: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