代码之家  ›  专栏  ›  技术社区  ›  clyfe

Windows I/O管理器-IRP的分类为“读”和“写”两种

  •  2
  • clyfe  · 技术社区  · 14 年前

    我正在写一篇文章 windows filesystem minifilter driver 必须失败 I/O Request Packets (IRP's) 在一个 preoperation callback 基于它们的类型(读/写)。
    如何从回调参数(或其他地方)中找出答案?如果操作是 像阅读 (只读取数据)或者 写得像 (修改磁盘上的数据-写入、删除、格式化等)?

    Here 是主要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;
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   clyfe    14 年前

    以下是我经过多次尝试和错误后得到的一个欧里斯特列表:

    写得像:

    IRP_MJ_SET_EA
    IRP_MJ_SET_INFORMATION
    IRP_MJ_SET_QUOTA
    IRP_MJ_SET_SECURITY
    IRP_MJ_SET_VOLUME_INFORMATION
    IRP_MJ_WRITE 
    

    读起来像:

    IRP_MJ_CREATE
    IRP_MJ_DEVICE_CONTROL
    IRP_MJ_FILE_SYSTEM_CONTROL
    IRP_MJ_FLUSH_BUFFERS
    IRP_MJ_INTERNAL_DEVICE_CONTROL
    IRP_MJ_QUERY_EA
    IRP_MJ_QUERY_INFORMATION
    IRP_MJ_QUERY_QUOTA
    IRP_MJ_QUERY_SECURITY
    IRP_MJ_QUERY_VOLUME_INFORMATION
    IRP_MJ_READ
    IRP_MJ_OPERATION_END