文件系统的过滤
11.4 文件系统控制设备的绑定
11.4.1 生成文件系统控制设备的过滤设备
接下来要生成过滤设备,这里再次用到设备拓展。下面给出过本过滤设备设备拓展的数据结构。
typedef struct _SFILTER_DEVICE_EXTENSION{
//绑定的文件系统设备(真实设备)
PDEVICE_OBJECT AttachedToDeviceObject;
//与文件系统设备相关的真实设备,这个在绑定时使用
PDEVICE_OBJECT StorageStackDeviceObject;
//如果绑定了一个卷,那么这是物理磁盘卷名;否则这是绑定的控制设备名
UNICODE_STRING DeviceName;
//用来保存名字字符串的缓冲区
WCHAR DeviceNameBuffer[MAX_DEVNAME_LENGTH];
}SFILTER_DEVICE_EXTENSION,*PSFILTER_DEVICE_EXTENSION;
这个数据结构完全是自定义的,这里我们只想记得自己绑定在那个设备上,如果想记录更多信息完全可以自定义再添加。这里我们在得到设备对象指针后,只需要使用下面代码就可以知道这个设备绑定的原始设备。
nextDeviceObject = ((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension->AttachedToDeviceObject);
回顾以前的内容,为了让系统看起来过滤设备和原来的设备没什么区别,必须设置该设备的一些标志位与所绑定的设备相同。
if ( FlagOn( DeviceObject->Flags, DO_BUFFERED_IO )) {
SetFlag( newDeviceObject->Flags, DO_BUFFERED_IO );
}
if ( FlagOn( DeviceObject->Flags, DO_DIRECT_IO )) {
SetFlag( newDeviceObject->Flags, DO_DIRECT_IO );
}
if ( FlagOn( DeviceObject->Characteristics, FILE_DEVICE_SECURE_OPEN ) ) {
SetFlag( newDeviceObject->Characteristics, FILE_DEVICE_SECURE_OPEN );
}
这里标志 DO_BUFFER_IO 和 DO_DIRECT_IO 对应着前面介绍过的缓冲IO和直接IO,两种方式的不同之处在于,外部向这些设备发送读写请求时,所用的缓冲地址将有所不同。
11.4.2 绑定文件系统控制设备
下面直接给出完整函数并注释解读。只需要在文件系统变动回调函数中调用这个函数,就可以完成

最低0.47元/天 解锁文章
458

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



