首先,WDK 中关于 IRP_MJ_XX_INFORMATION 请求有这样一段话
“The file system driver should extract and decode the file object to determine whether it represents a user file or directory open”
可是文件对象中没有找到那个地方标记了对象是文件还是目录。于是只能使用函数查询
FltQueryInformationFile() 这个函数只能运行在 IRQL==PASSIVE_LEVEL
不过幸好,微软给出了每个文件IO对应的IRQL 如下,IRP_MJ_XX_INFORMATION 刚刚好在 PASSIVE_LEVEL
Dispatch Routine IRQL and Thread Context
The following table summarizes the IRQL and thread context requirements for file system filter driver dispatch routines.
| Dispatch routine | Caller's IRQL: | Caller's thread context: |
|---|---|---|
| Cleanup | PASSIVE_LEVEL | Nonarbitrary |
| Close | APC_LEVEL | Arbitrary |
| Create | PASSIVE_LEVEL | Nonarbitrary |
| DeviceControl (except paging I/O) | PASSIVE_LEVEL | Nonarbitrary |
| DeviceControl (paging I/O path) | APC_LEVEL | Arbitrary |
| DirectoryControl | APC_LEVEL | Arbitrary |
| FlushBuffers | PASSIVE_LEVEL | Nonarbitrary |
| FsControl (except paging I/O) | PASSIVE_LEVEL | Nonarbitrary |
| FsControl (paging I/O path) | APC_LEVEL | Arbitrary |
| LockControl | PASSIVE_LEVEL | Nonarbitrary |
| PnP | PASSIVE_LEVEL | Arbitrary |
| QueryEa | PASSIVE_LEVEL | Nonarbitrary |
| QueryInformation | PASSIVE_LEVEL | Nonarbitrary |
| QueryQuota | PASSIVE_LEVEL | Nonarbitrary |
| QuerySecurity | PASSIVE_LEVEL | Nonarbitrary |
| QueryVolumeInfo | PASSIVE_LEVEL | Nonarbitrary |
| Read (except paging I/O) | PASSIVE_LEVEL | Nonarbitrary |
| Read (paging I/O path) | APC_LEVEL | Arbitrary |
| SetEa | PASSIVE_LEVEL | Nonarbitrary |
| SetInformation | PASSIVE_LEVEL | Nonarbitrary |
| SetQuota | PASSIVE_LEVEL | Nonarbitrary |
| SetSecurity | PASSIVE_LEVEL | Nonarbitrary |
| SetVolumeInfo | PASSIVE_LEVEL | Nonarbitrary |
| Shutdown | PASSIVE_LEVEL | Arbitrary |
| Write (except paging I/O) | PASSIVE_LEVEL | Nonarbitrary |
| Write (paging I/O path) | APC_LEVEL | Arbitrary |
本文探讨了WDK中IRP_MJ_XX_INFORMATION请求的处理方式,特别是如何确定文件对象是否代表文件或目录。介绍了FltQueryInformationFile()函数的应用,并列举了不同文件IO操作对应的IRQL级别。
1254

被折叠的 条评论
为什么被折叠?



