本人刚刚开始学习过滤驱动,自己想做一个微过滤驱动来实现特定文件名的访问限制。
比如: README.txt 这个文件名的文件 不可以创建,打开,编辑和删除。
我在IRP_MJ_SET_INFORMATION 的 预处理里实现的属性的禁止修改。
但是在用IRP_MJ_READ , IRP_MJ_WRITE, IRP_MJ_CREATE 里却 不能实现。。。
不知道是不是因为在缓存中读取所以文件名字不一致导致的。 如果是的话应该怎么解决。
if( NT_SUCCESS( FltGetFileNameInformation( Data, FLT_FILE_NAME_NORMALIZED |
FLT_FILE_NAME_QUERY_DEFAULT, &nameInfo ) ) )
{
if( NT_SUCCESS( FltParseFileNameInformation( nameInfo ) ) )
{
WCHAR pTempBuf[ 512 ] = { 0 };
WCHAR *pNonPageBuf = NULL, *pTemp = pTempBuf;
if( nameInfo->Name.MaximumLength > 512 )
{
pNonPageBuf = ExAllocatePool( NonPagedPool,nameInfo->Name.MaximumLength );
pTemp = pNonPageBuf;
}
RtlCopyMemory( pTemp, nameInfo->Name.Buffer, nameInfo->Name.MaximumLength );
DbgPrint("[MiniFilter][IRP_MJ_READ]%wZ\n", &nameInfo->Name);
_wcsupr( pTemp );
if( NULL != wcsstr( pTemp, L"READ.TXT" ) ) //
{
//DbgPrint( "\r\nIn NPPreWrite(), FilePath{%wZ} is forbided.", &nameInfo->Name );
if( NULL != pNonPageBuf )
ExFreePool( pNonPageBuf );
FltReleaseFileNameInformation( nameInfo );
// Data->IoStatus.Status = STATUS_ACCESS_DENIED;
// Data->IoStatus.Information = 0;
DbgPrint("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
return FLT_PREOP_DISALLOW_FASTIO;
}
if( NULL != pNonPageBuf )
ExFreePool( pNonPageBuf );
}
FltReleaseFileNameInformation( nameInfo );
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法