【发布时间】:2015-06-05 22:08:39
【问题描述】:
我已经实现了一个用户模式程序和一个 Windows 文件系统微过滤器,它为远程文件存储系统创建用户文件的骨架视图。它将远程文件映射到本地驱动器。用户模式程序为远程系统上的每个文件创建一个重新分析标记。当检测到创建请求(例如,CreateFile for read)时,微过滤器要求用户模式程序下载文件。这应该只在程序想要打开文件进行查看或编辑时发生。
但是,我发现 Windows 资源管理器正在触发我的文件下载。我想阻止资源管理器文件窗口和文件打开/保存对话框 触发下载。而且,我还想显示文件缩略图和文件 尺寸。
[更新:我发现我可以使用 Windows 稀疏文件来显示我的遥控器 资源管理器中的文件大小。 ]
因此,我还实现了一个 Shell 扩展 IThumbnailProvider,它可以下载文件的再现。这提供了文件缩略图。
为了我的测试,我为所有文件 (*) 和 .jpg 文件注册了 IThumbnailProvider。
结合使用 Process Monitor 和 DebugView(均来自 SysInternals),我看到了两个有趣的行为: 1. 如果我让我的微过滤器拒绝从资源管理器打开文件的请求,那么我的 IThumbnailProvider 会被调用。 2. 如果我允许来自资源管理器的打开请求,我在调用堆栈中看到 thumbcache.dll 试图打开文件并且我的 IThumbnailProvider 没有被调用。似乎默认缩略图提供程序会读取下载的文件并创建缩略图。
我一定错过了什么。
更新:如果我使用 InitializeWithStream 而不是 InitializeWithFile,我的处理程序似乎被调用了。但是,这也会触发文件的下载。
【问题讨论】:
-
设置
FILE_ATTRIBUTE_OFFLINE文件属性。这表示the file is will trigger a download when accessed。 Explorer 尊重此属性并尝试避免自动触发下载。其他 shell 扩展也应该尊重该属性。 -
@RaymondChen - 我正在 Windows Server 2012 上尝试使用
FILE_ATTRIBUTE_OFFLINE。我已取消注册我的 Shell 扩展并重新启动资源管理器。资源管理器在“属性”窗格中将文件显示为脱机(可用性:仅联机)。但是,我仍然看到 IRP_CREATE 的微过滤器 PostCreateCallback 被 Explorer.exe 中的 STATUS_REPARSE 调用,所需访问权限为 0x00120089。从 ProcMon 看来,它似乎正在被 thumbcache.dll 打开。
标签: windows explorer shell-extensions