通过Windows文件系统属性发送自定义信息

时间:2010-02-16 15:59:46

标签: c++ windows winapi filesystems

在谈到这一点之前,我会概述一下我想做什么。因为我不知道使用Windows文件系统属性是否是正确的选择。

我在系统中有两个组件。 其中一个是ShellExtension ,在满足某些条件时放置OverlayIcon,另一个组件是文件系统驱动程序,它向Windows提供信息(因此向ShellExtension提供)

FileSystem使用文件名向远程服务器发出网络请求,根据此请求的结果,应显示或不显示重叠图标。

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

我想到的第一个解决方案是使用Windows FileSystem属性。我的意思是,在Filesystem驱动程序中,我将放置一个显然未使用的attrubute(例如 0x1000000 ,似乎根据MSDN不使用),并在OverlayIcon中恢复此信息,因为explorer将文件属性作为“ IsMemberOf ”的参数发送到Shell扩展。也就是说,使用Windows文件属性将信息从FileSystem端编码为ShellExtension。

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

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

但是当我在游戏的两边时,如果我可以使用Windows文件系统信息会更好。

你有什么建议?

谢谢!

2 个答案:

答案 0 :(得分: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吗?

答案 1 :(得分:1)

您可以在NTFS Alternate Data Streams

中存储信息