文件系统驱动开发心得
2009-03-05 13:47
176 查看
* 打开文件系统对象的特殊方式
文件系统驱动接收到IRP请求IRP_MJ_CREATE时,如果IrpSp->Flags指定了SL_OPEN_TARGET_DIRECTORY,则表示并不是真的要打开指定的文件系统对象,而是要检查对象是否可以删除已经它所在的目录是否可以进行创建操作。 通常这样的请求会发生在重命名文件系统对象之前。
* 文件系统驱动处理相对路径
处理IRP_MJ_CREATE时,如果IRP的FileObject使用的相对路径,可以通过FileObject的RelatedFileObject获得相对路径所在的目录信息。
* 提供正确的存储空间信息
处理IRP_MJ_QUERY_VOLUME_INFORMATION时,如果要查询的信息类型为FileFsSizeInformation或者FileFsFullSizeInformation,必须没有提供正确的存储空间参数,可能会造成资源管理器查看文件属性时崩溃。尤其是信息结构的BytesPerSector成员,千万不要设置为0。
* 支持文件的内存映射
Windows的文件内存映射机制能够缓解文件的IO次数,比如CreateFileMapping函数。要实现最基本的文件映射支持,文件系统驱动必须在处理IRP_MJ_CREATE时给FileObject的SectionObjectPointer成员赋值,并设置SectionObjectPointer的成员都为NULL值。FileObject的FsContext成员必须指向一块已分配的并全部填充为0的内存区,这块内存区的大小不能小于FSRTL_COMMON_FCB_HEADER类型的字节数。在处理IRP_MJ_CLEANUP时,如果FileObject的SectionObjectPointer的DataSectionObject成员不为NULL,应该调用CcPurgeCacheSection函数清除缓存管理器产生的数据。
* 正确处理IRP_MJ_CREATE
文件系统驱动的IRP_MJ_CREATE不仅要处理打开文件或目录,还要处理打开卷。如果FileObject的FileName字节数为0,则表示要打开的是卷。
* FltRegisterFilter函数返回STATUS_OBJECT_NAME_NOT_FOUND
一个文件系统迷你过滤驱动的注册表项(HKLM/System/CurrentControlSet/Services/<驱动的服务名>)下面必须有一个名为"Instances"的子项用于存放驱动的实例信息,该子项下面的字符串值"DefaultInstance"指定了默认实例的名称。"Instances"项下面的每一个子项表示一个实例,每个实例子项必须有一个字符串值"Altitude"。
FltRegisterFilter函数执行时,如果在注册表中没有找到默认实例的"Altitude"值,将会返回STATUS_OBJECT_NAME_NOT_FOUND错误。
文件系统驱动接收到IRP请求IRP_MJ_CREATE时,如果IrpSp->Flags指定了SL_OPEN_TARGET_DIRECTORY,则表示并不是真的要打开指定的文件系统对象,而是要检查对象是否可以删除已经它所在的目录是否可以进行创建操作。 通常这样的请求会发生在重命名文件系统对象之前。
* 文件系统驱动处理相对路径
处理IRP_MJ_CREATE时,如果IRP的FileObject使用的相对路径,可以通过FileObject的RelatedFileObject获得相对路径所在的目录信息。
* 提供正确的存储空间信息
处理IRP_MJ_QUERY_VOLUME_INFORMATION时,如果要查询的信息类型为FileFsSizeInformation或者FileFsFullSizeInformation,必须没有提供正确的存储空间参数,可能会造成资源管理器查看文件属性时崩溃。尤其是信息结构的BytesPerSector成员,千万不要设置为0。
* 支持文件的内存映射
Windows的文件内存映射机制能够缓解文件的IO次数,比如CreateFileMapping函数。要实现最基本的文件映射支持,文件系统驱动必须在处理IRP_MJ_CREATE时给FileObject的SectionObjectPointer成员赋值,并设置SectionObjectPointer的成员都为NULL值。FileObject的FsContext成员必须指向一块已分配的并全部填充为0的内存区,这块内存区的大小不能小于FSRTL_COMMON_FCB_HEADER类型的字节数。在处理IRP_MJ_CLEANUP时,如果FileObject的SectionObjectPointer的DataSectionObject成员不为NULL,应该调用CcPurgeCacheSection函数清除缓存管理器产生的数据。
* 正确处理IRP_MJ_CREATE
文件系统驱动的IRP_MJ_CREATE不仅要处理打开文件或目录,还要处理打开卷。如果FileObject的FileName字节数为0,则表示要打开的是卷。
* FltRegisterFilter函数返回STATUS_OBJECT_NAME_NOT_FOUND
一个文件系统迷你过滤驱动的注册表项(HKLM/System/CurrentControlSet/Services/<驱动的服务名>)下面必须有一个名为"Instances"的子项用于存放驱动的实例信息,该子项下面的字符串值"DefaultInstance"指定了默认实例的名称。"Instances"项下面的每一个子项表示一个实例,每个实例子项必须有一个字符串值"Altitude"。
FltRegisterFilter函数执行时,如果在注册表中没有找到默认实例的"Altitude"值,将会返回STATUS_OBJECT_NAME_NOT_FOUND错误。
相关文章推荐
- Windows文件系统过滤驱动开发教程
- 搭建tiny6410驱动开发环境_NFS起文件系统_NoSharedLibs
- Windows 文件系统过滤驱动开发教程 (第二版)
- 【转帖】文件过滤系统驱动开发Filemon学习笔记
- [Linux驱动开发] cramfs文件系统制作及移植
- Windows文件系统过滤驱动开发教程(6)
- (转载)Windows文件系统过滤驱动开发教程
- 文件系统过滤驱动开发(二)
- 文件系统驱动开发实例
- VC文件过滤系统驱动开发Filemon学习笔记
- Windows文件系统过滤驱动开发教程(0,1)
- 【windows内核驱动开发】文件系统微过滤驱动Minifilter——绑定指定的卷(磁盘分区)
- Windows文件系统过滤驱动开发教程
- VC文件过滤系统驱动开发Filemon学习笔记
- Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析
- Windows文件系统过滤驱动开发教程
- 【转帖】Windows文件系统过滤驱动开发教程-楚狂人
- [转载]关于文件系统和磁盘驱动的一点学习心得
- Linux设备驱动开发详解-Note(10)--- Linux 文件系统与设备文件系统(2)
- Windows文件系统过滤驱动开发教程