Отправить пользовательскую информацию через атрибуты файловой системы Windows - PullRequest
0 голосов
/ 16 февраля 2010

Прежде чем перейти к сути, я дам вам обзор того, что я хочу сделать. Потому что я не знаю, является ли использование атрибутов файловой системы Windows правильным вариантом для этого.

У меня есть два компонента в системе. Одним из них является ShellExtension , который помещает OverlayIcon при выполнении какого-либо условия, а другим компонентом является драйвер файловой системы , который предоставляет информацию для Windows (и, следовательно, для ShellExtension)

Файловая система, используя имя файла, отправляет сетевой запрос к удаленному серверу и , в зависимости от результата этого запроса, должен появиться значок наложения или нет.

Простое решение - повторить запрос со стороны OverlayIcon, но это нежелательно. На стороне файловой системы у меня есть результат запроса, но мне нужно отправить его на оверлей.

Первым решением, которое мне пришло в голову, было использование атрибутов Windows FileSystem. Я имею в виду, что в драйвере файловой системы я добавлю явно неиспользуемый атрибут (например, 0x1000000 , который, как представляется, не используется в соответствии с MSDN), и восстановлю эту информацию в OverlayIcon, учитывая, что проводник отправляет в расширение оболочки атрибут файла в качестве параметра « IsMemberOf ». То есть использует атрибуты файлов Windows для кодификации информации со стороны файловой системы на сторону ShellExtension.

Это решение не работает, кажется, что в некоторой части потока этот атрибут удален. Это имеет смысл, потому что этот атрибут оказывается недействительным. Если я заменю значение атрибута на такое, как HIDDEN, оно будет отлично работать.

Очевидное решение (но у него есть над чем поработать) - это использовать некоторый механизм IPC.

Но так как я нахожусь по обе стороны игры, было бы лучше, если бы я мог использовать информацию о файловой системе Windows.

Что вы предлагаете?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Почему так сложно? Для этого есть подходящий интерфейс. Позвоните 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 нс, или достаточно 200 нс? Не могли бы вы как-то сохранить его в BY_HANDLE_FILE_INFORMATION::nFileIndexHigh

1 голос
/ 16 февраля 2010

Вы можете хранить информацию в Альтернативных потоках данных NTFS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...