FltGetFileNameInformation+VISTA+IRP_MJ_NETWORK_QUERY_OPEN+BSOD

本文探讨了使用MiniFilter进行操作时的一些关键特性,特别是涉及到IRP(I/O请求包)的处理方式。文中建议通过禁止快速I/O请求并等待常规创建路径来简化处理流程,这种方法在某些内置MiniFilter如LUAFV中已被采用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 I'm assuming you're using a minifilter. The most interesting feature of this operation is that one of the parametersis an Irp. This is pretty much the only place in a minifilter where you willactually touch an IRP. That IRP is a fully initialized CREATE IRP and youcan use it for all your context needs (getting the PID and the user like youwould for any normal create). I don't remember about FltGetFileNameInformation, could be a bug or it couldbe something that simply doesn't make sense in this context. Regardless, I would suggest that you disallow this request (returnFLT_PREOP_DISALLOW_FASTIO in the preOp) and expect it will come on theregular create path, which is much easier to handle. As Rod pointed out,LUAFV (which is an inbox minifilter enabled by default on all Vista+ systemsas far as I remember) does it anyway so you're not gaining anything from aperformance perspective. And then there are other gotchas about thisoperation which IMO do not justify the extra effort.
<think>好的,用户想了解IRP_MJ_CREATE在Windows Driver Framework中的定义和作用。首先,我需要回忆一下WDF中的IRP处理机制。在WDM驱动中,IRP_MJ_CREATE通常用于处理文件对象的创建请求,比如当应用程序调用CreateFile时,系统会生成这个IRP。但在WDF中,框架对IRP处理进行了封装,可能通过I/O队列和事件回调来管理。 根据提供的引用内容,特别是引用[3],用户提到了KMDF驱动中如何设置EvtIoRead、EvtIoWrite等回调函数。类似地,IRP_MJ_CREATE应该对应某个特定的事件回调函数,可能在队列配置时设置。例如,在WDF_IO_QUEUE_CONFIG结构体中,可能有EvtIoCreate这样的成员来处理创建请求。 另外,引用[2]中提到驱动需要创建和打开I/O target,这可能与文件对象的创建有关联。当应用程序尝试打开设备时,IRP_MJ_CREATE会被发送到驱动,驱动可能需要通过WdfIoTargetOpen来关联目标设备或文件,确保后续的I/O操作能够正确路由。 还需要确认IRP_MJ_CREATE的具体作用,它主要用于设备或文件的打开请求,驱动需要处理这个请求以允许后续的读写或控制操作。在WDF中,框架可能已经封装了默认的处理方式,但驱动开发者仍可以通过注册回调函数来自定义处理逻辑。 总结一下,IRP_MJ_CREATE对应创建请求的处理,在WDF中通过配置队列的回调函数(如EvtIoCreate)来实现,确保驱动能够响应应用程序的打开设备请求,并进行必要的初始化和资源分配。</think>### IRP_MJ_CREATE 的定义及作用 **IRP_MJ_CREATE** 是 Windows 驱动框架(WDF)中用于处理文件或设备对象创建请求的主功能码。当用户态应用程序调用 `CreateFile` 或类似 API 尝试打开设备时,系统会生成此类型的 I/O 请求包(IRP),并将其发送到驱动程序的相应处理函数[^3]。 #### 核心作用: 1. **设备/文件对象初始化** 当应用程序首次与设备交互时,IRP_MJ_CREATE 用于初始化设备上下文、分配资源(如内存缓冲区)或验证访问权限。例如,驱动可能需要检查调用方的权限是否满足设备操作要求[^2]。 2. **建立通信通道** 该请求为后续的读写(如 IRP_MJ_READ/WRITE)或控制(IRP_MJ_DEVICE_CONTROL)操作建立通道。如果未正确处理此请求,后续的 I/O 操作将无法执行。 3. **关联 I/O Target** 在 KMDF 驱动中,可通过 `WdfIoTargetOpen` 关联到具体的设备栈或文件对象,确保后续操作能正确路由到目标设备。例如: ```c WDF_IO_TARGET_OPEN_PARAMS params; WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_NAME(&params, &deviceName, ...); WdfIoTargetOpen(hIoTarget, &params); ``` 此代码初始化一个 I/O Target 并关联到指定设备,为后续操作提供基础[^2]。 #### WDF 中的实现方式: 在 KMDF 驱动中,IRP_MJ_CREATE 通常通过 **I/O 队列配置** 进行响应。驱动需在初始化队列时注册回调函数 `EvtIoCreate`,例如: ```c WDF_IO_QUEUE_CONFIG queueConfig; WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel); queueConfig.EvtIoCreate = MyEvtIoCreate; // 自定义处理函数 WdfIoQueueCreate(device, &queueConfig, ..., &queue); ``` 当收到创建请求时,框架会调用 `MyEvtIoCreate`,驱动可在其中执行初始化逻辑或返回错误码(如访问被拒绝)[^3]。 --- ### § 相关问题 § 1. IRP_MJ_CREATE 未正确处理会导致什么问题? 2. 如何在 WDF 驱动中限制设备的并发访问? 3. IRP_MJ_CLEANUP 与 IRP_MJ_CLOSE 的区别是什么? --- **引用说明** [^1]: 关于 WDF_IO_QUEUE_CONFIG 结构体的初始化与默认队列配置。 : KMDF 中 I/O Target 的创建与关联方法。 : IRP_MJ_READ 等请求在 KMDF 中的回调实现示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值