欢迎来到天天文库
浏览记录
ID:20685661
大小:311.50 KB
页数:36页
时间:2018-10-14
《麦洛克菲内核驱动开发第六课》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、麦洛克菲内核开发第五课Sfilter文件系统过滤麦洛克菲www.mallocfree.com周扬荣麦洛克菲www.mallocfree.com提纲文件系统驱动绑定与过滤Sfilter基本框架文件拦截创建删除修改重命名作业麦洛克菲www.mallocfree.com过滤CancelUserBufferMdlAddressSystemBufferIOSTATUSIRPHeadern…0头部堆栈IO_STATUS_BLOCKStatusInformationIO_STACK_LOCATIONMajorFunctionMi
2、norFunctionunion{struct{…}Read;struct{…}Write;struct{…}DeviceControl;}Parameters;DeviceObjectFileObject文件过滤驱动设备文件卷设备磁盘设备IRP驱动设备IRP过滤:分层驱动中再加一层而不影响它的上下层,以过滤它们之间的数据,对数据或行为进行安全控制。过滤是通过设备绑定实现的。绑定设备栈绑定的形式。驱动自己生成一个设备(过滤设备),调用系统提供的绑定API,绑定到目标设备上。并返回一个在未绑定之前目标设备所在设备栈的
3、最顶层设备。这样发往下层的IRP或者发往上层的数据都会被过滤设备截获。绑定API:IoAttachDevice()IoAttachDeviceToDeviceStackSafe(2000SP4以及XP以上)IoAttachDeviceToDeviceStack()SourceDeviceFilter2DeviceFilter1DeviceTargetDeviceSourceDeviceTargetDeviceAttachedDeviceAttachedDeviceIRPIoAttachDeviceToDeviceS
4、tackPDEVICE_OBJECTIoAttachDeviceToDeviceStack(IN PDEVICE_OBJECTSourceDevice,IN PDEVICE_OBJECTTargetDevice);AttachedDevice需要记录在DEVICE_EXTENSION中,以便调用IoCallDriver()继续下发IRPSourceDeviceFilter2DeviceFilter1DeviceTargetDeviceSourceDeviceTargetDeviceAttachedDeviceAtt
5、achedDeviceIRP文件系统过滤框架FilemonSfilterMinifilterFilespySfilter总体流程创建控制设备创建控制设备符号链接过滤分发函数Fastio过滤与绑定生成一个过滤设备IoRegisterFsRegistrationChange(DriverObject,SfFsNotification);(文件系统设备绑定)SfFsControl(卷设备绑定)一个驱动,看见几个文件系统设备,看见几个卷设备,对应每一个设备就生成相应设备附载上去,然后进行相应处理。IoRegisterFsR
6、egistrationChangeFileMon里的方法:枚举26个盘符,打开文件,获得FileObjectDeviceObject.然后通过自己驱动生成一个过滤设备,Attach过滤设备到DeviceObject上无法监控类似U盘等动态加载上去的IoRegisterFsRegistrationChange动态获得fastio文件系统除了处理正常的IRP之外,还要处理所谓的FastIo.FastIo是CacheManager调用所引发的一种没有irp的请求。换句话说,除了正常的DispatchFunctions之
7、外,你还得为DriverObject撰写另一组FastIoFunctions.这组函数的指针在driver->FastIoDispatchSfilter代码通读分析DriverEntrysfCreate再次深入理解IRP过滤驱动与IRP处理方式a.Pending完成例程IoCopyCurrentIrpStackLocationToNextb.忽略直接下发IoSkipCurrentIrpStackLocation,下层设备拿到的IO_STACKLOCATION和当前的一样c.结束IRP不下发PIO_STACK_LOC
8、ATIONirpStack=IoGetCurrentIrpStackLocation(Irp);Irp->IoStatus.Status=STATUS_SUCCESS;Irp->IoStatus.Information=0;IoCompleteRequest(Irp,IO_NO_INCREMENT);d.手动构建IRPIoAllocateIrpIoGetNe
此文档下载收益归作者所有