我正在编写一个Windows 文件系统微过滤器驱动程序,该驱动程序必须根据其类型(读/写)在操作前回调中使I/O 请求数据包(IRP)失败。
我如何从回调参数(或其他地方?)中找出操作是类似读取(仅读取数据)还是类似写入(修改磁盘上的数据 - 写入、删除、格式化等)?
这是主要 IRP 代码的列表。
我正在考虑类似的事情:
Data->Iopb->TargetFileObject->ReadAccess
Data->Iopb->TargetFileObject->WriteAccess
但我不确定,我认为这些仅在术后回调中可用。文档真的很麻烦。
进一步说明的代码示例:
FLT_PREOP_CALLBACK_STATUS
Fail (
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
)
{
FLT_PREOP_CALLBACK_STATUS status = FLT_PREOP_SUCCESS_NO_CALLBACK;
//********************************************************************
if ( IS_WRITE_LIKE(Data, FltObjects) ) { // ??? HOW DO I FIND OUT ???
//********************************************************************
if( FLT_IS_FASTIO_OPERATION(Data) ){
status = FLT_PREOP_DISALLOW_FASTIO;
} else {
status = FLT_PREOP_COMPLETE;
}
Data->IoStatus.Status = STATUS_ACCESS_DENIED;
Data->IoStatus.Information = 0;
return status;
}
return status;
}