2010-02-16 67 views
0

在开始之前,我会给你一个我想要做的概述。因为我不知道使用Windows文件系统属性是否是正确的选择。通过Windows文件系统属性发送自定义信息

我在系统中有两个组件。 其中之一是一个ShellExtension是把当某些条件得到满足的OverlayIcon和其他组件是文件系统驱动程序其到Windows(到ShellExtension因此)提供信息

文件系统,使用该名称的文件向远程服务器发出网络请求,并根据此请求的结果执行,则应显示或不显示重叠图标。

直接的解决方案是从OverlayIcon端重复请求,但这是不可取的。在FileSystem方面,我有请求结果,但我需要将它发送到Overlay。

我想到的第一个解决方案是使用Windows FileSystem属性。我的意思是,在文件系统驱动程序中,我将放置一个纯粹未使用的属性(例如0x1000000,根据MSDN似乎不会使用它),并在OverlayIcon中恢复此信息,前提是该资源管理器发送给Shell将文件属性扩展为“IsMemberOf”的参数。即,使用Windows文件属性将信息从FileSystem端编译到ShellExtension端。

此解决方案不起作用,似乎在流程的某个部分,此属性被删除。这是有道理的,因为这个属性看起来不是有效的。如果我将属性值替换为像HIDDEN这样的属性值,它可以很好地工作。

明显的解决方案(但它有更多的工作要做)是使用一些IPC机制。

但是因为我在游戏的双方如果我可以使用Windows文件系统信息会更好。

你有什么建议?

谢谢!

+0

令我印象深刻的是,微软正在积极制止这些想法。是的,淘汰这样的保留位会减慢世界上的每一个系统,但它使得更稳定,更可靠的软件。旧的adagium“相信程序员正确地做事”只是太天真了。 – MSalters 2010-02-17 10:24:18

回答

3

为什么这么复杂?这有一个适当的界面。拨打GetFileInformationByHandleEx(FileRemoteProtocolInfo)即可获取FILE_REMOTE_PROTOCOL_INFO。将协议特定的数据放在ProtocolSpecificReserved中。这是64字节大。

与您当前的想法最接近的替代方案可能会使用FILE_ATTRIBUTE_REPARSE_POINT。如果你使用这个,你可以在WIN32_FIND_DATA::dwReserved0中添加一个标签。这不会与其他标签冲突,因为这些标签是Microsoft分配的。

http://msdn.microsoft.com/en-us/library/aa365511(VS.85).aspx

有更多的地方松鼠你的数据了。您可以考虑使用创建文件时间的最低位。你真的需要100 ns的分辨率,还是200 ns足够好?你能以某种方式将它存储在BY_HANDLE_FILE_INFORMATION::nFileIndexHigh

+0

这看起来很好。我会试一试。谢谢 – HyLian 2010-02-17 11:40:23

+0

REPARSE解决方案就像一个魅力。谢谢!! – HyLian 2010-02-19 14:20:19

1

您可以存储信息在NTFS Alternate Data Streams

+0

我想我不能用我的文件系统驱动程序(这是Dokan)来做到这一点。 – HyLian 2010-02-17 06:59:24