我目前正在开发文件系统过滤器驱动程序。
过滤器驱动程序的作用是检查正在创建和删除的文件以及保留日志。
在大多数情况下,此过滤器驱动程序运行良好。
然而,有时,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获取完整路径。
我不知道为什么这是一个错误。
当发生BSOD时,总是出现断线字符串如上所述的情况。
答案 0 :(得分:0)
FileName
,Data->Iopb->TargetFileObject
或pFltObjects
都不需要始终存在。操作系统可以在需要时释放内存。
FileName
仅在Pre-Create
回调函数中有效。
通常,您需要将文件名存储在作为流/文件/句柄上下文附加到文件对象的自己的结构中。并在其他回调中使用它。
答案 1 :(得分:0)
缓冲区溢出。
L“ FILE_CREATED”的长度大于10。因此缓冲区不足。