Windows下删除文件的实现方式本质上有以下两种:
1. 使用FILE_DELETE_ON_CLOSE
ZwCreateFile和IoCreateFile的 CreateOptions 参数可以通过使用FILE_DELETE_ON_CLOSE标志来实现删除文件的功能。顾名思义,使用此标志打开的文件在关闭时会删除该文件。
如要在文件过滤驱动中判断是否设置了FILE_DELETE_ON_CLOSE标志,只需截获IRP_MJ_CREATE请求,通过pIrpStack->Parameters.Create.Options判断即可。
2. 使用FileDispositionInformation
这种方式需要使用Native API ZwSetInformationFile,将最后一个参数 FileInformationClass设置为 FileDispositionInformation即可。ZwSetInformationFile的详细用法可参见DDK。Windows API中的DeleteFile就是使用这种方式实现删除文件功能的。
如需要在文件过滤驱动中监视这种方式的删除文件,只需监视IRP_MJ_SET_INFORMATION请求,通过判断pIrpStack->Parameters.SetFile.FileInformationClass是否为 FileDispositionInformation且((PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->DeleteFile是否为TRUE来判断是否是删除文件操作。
1. 使用FILE_DELETE_ON_CLOSE
ZwCreateFile和IoCreateFile的 CreateOptions 参数可以通过使用FILE_DELETE_ON_CLOSE标志来实现删除文件的功能。顾名思义,使用此标志打开的文件在关闭时会删除该文件。
如要在文件过滤驱动中判断是否设置了FILE_DELETE_ON_CLOSE标志,只需截获IRP_MJ_CREATE请求,通过pIrpStack->Parameters.Create.Options判断即可。
2. 使用FileDispositionInformation
这种方式需要使用Native API ZwSetInformationFile,将最后一个参数 FileInformationClass设置为 FileDispositionInformation即可。ZwSetInformationFile的详细用法可参见DDK。Windows API中的DeleteFile就是使用这种方式实现删除文件功能的。
如需要在文件过滤驱动中监视这种方式的删除文件,只需监视IRP_MJ_SET_INFORMATION请求,通过判断pIrpStack->Parameters.SetFile.FileInformationClass是否为 FileDispositionInformation且((PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->DeleteFile是否为TRUE来判断是否是删除文件操作。