#post-id: 8023-11-28
#original-date: 14.07.2022 Thu
#original-time: 11:28 AM
#original-day: 8023
#original-host: Win7 Ultimate SP1 (Build 7601)

Короче, вяло тестирую тут запуск ActiveX компонентов без регистрации. Сначала манифест генерировала из VBR файла, потом научилась юзать библиотеку из VB6, которая отвечает за работу object browser'а.

Забавное наблюдение, в VBR файле для интерфейса IDispatch указан этот GUID:

{00020420-0000-0000-C000-000000000046}

Тогда как в реестре и в актуально библиотеке типов откомпилированного компонента – вот этот:

{00020400-0000-0000-C000-000000000046}

И оба, вроде как, правильные.

Так вот. Решила поиграться с манифестами для ActiveX EXE. Оказалось, что работают они не очень. Либо процесс зависает при попытке создать объект из EXE сервера, либо всякие ошибки генерируются с разными кодами.

И вот все эти игрища происходили на машине с Windows XP. А потом я попыталась запустить это на машине с Windows 7, и неожиданно ничего не заработало. «ActiveX can't create object».

На другом компе с Нанами всё прекрасно работало, а тут всё выглядело очень странно. Программа просто не могла создать объект. Если я начинала играть с манифестами, оказывалось, что она даже не смотрит в эти манифесты. Тоесть манифест приложения ссылается на «сборку» ABCD. Если удалить манифест этой сборки, то программа не должна в принципе запуститься, и загрузчик должен сообщить, что программа сконфигурирована неправильно. Но программа запускалась как обычно, и опять случалась ошибка самого рантайма VB6.

Интересно, что, если программу скопировать в другой каталог, то всё неожиданно начинало работать нормально. Это я выяснила, когда набрела на предыдущие версии тестовых бинарников и манифестов в диалоге свойств, восстановила в отдельную папку, посравнивала с нынешними билдами, ну и запустила для проверки.

Обычно, когда проблема с манифестами, в системном журнале событий появляются сообщения, но тут тоже никаких следов не оказалось. Тогда я вспомнила, что в Нанами есть утилита sxstrace, которая вроде бы для таких вещей и предназначена. Ну, ладно, запускаем:



Потом отчаянно пытаемся запустить программу.

Что характерно, сначала ничего не обнаруживалось, журнал трассировки был пуст, но я позабыла о программе на полчаса, отвлеклась, а когда вернулась, в журнале было уже много чего.

Жмём Enter для завершения трассировки и делаем:



Да, утилита пишет двоичный журнал (на самом деле – OLE хранилище), который надо конвертировать в текстовый файл.

А в текстовом файле оказалось множество записей по запуску программ с манифестами, полный разбор что там и как читается, каждый элемент манифеста интерпретируется, и всё такое. В том числе, и моя тестовая программа:



ProcessorArchitecture, что интересно, бывает то «AMD64», то «Wow32». Конкретно тестовая программа – 32-разрядная. Но я не о том.

Что это за странный путь к файлу программы? Что это за каталог с датой и собачкой?

Я по-быстрому поковырялась, и выяснила, что, действительно, файл существует, каталог тоже, хоть и не показывается в листинге, но доступно это только через шару. При чём, независимо от того, «localhost» там или имя машины. Более того, там не только этот файл, там все файлы на диске за указанную в имени папки дату. Даже те, что удалены или перезаписаны.

Да. Это теневая копия раздела.

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

Более того, работает оно, судя по всему, по принципу copy-on-write. Тоесть, если файл не менялся со времён создания теневой копии, то он существует на диске в единственном экземпляре. Если же с ним что-то произошло, то все изменения создаются в копии файла (в смысле, не в файле с новым именем, а физически в ФС создаётся новая структура, которая помечается как актуальные данные). В результате теневая копия может занимать всего ничего.

Посмотреть, кстати, сколько места занимается теневыми копиями, можно такой командой:



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

Да.

А вот теперь бы понять, как с этим бороться.