Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Extractor


Сообщения: 1422
Благодарности: 821

Профиль | Отправить PM | Цитировать


jameszero,
В аддоне в файле IE7int.inf есть такая секция (я хвост обрезал, вы и так поймете ):
Код: Выделить весь код
[RenameOperation.AddReg]
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager","AllowProtectedRenames",0x00010001,01,00,00,00
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager","PendingFileRenameOperations",0x00010000,"\??\%11%\DllCache\new_imgutil.dll"................"
Так вот такая запись добавления строк в PendingFileRenameOperations не корректна, поскольку перезаписывает все, что туда могли добавить другие программы раньше, чем выполнялся ваш ИНФ.

Кроме того, если добавлять туда строки через ИНФ-файл с помощью ключа типа REG_SZ_APPEND (0x00010008), то добавление работает, но есть один побочный эффект:
В этом ключе запись на обработку одного файла занимает две строки, из которых первая - исходное имя файла, а вторая - новое имя. Но если производится удаление файла, то вторая строка будет пустая, и реально состоять из одного нулевого символа. Так вот движок, обрабатывающий ИНФ-файлы, вставляет новые строки, добавляемые через тип строки REG_SZ_APPEND начиная с позиции первой нулевой строки, например:
Если было:
Код: Выделить весь код
\??\C:\File1.ext

\??\C:\File2.ext

\??\C:\File3.ext
(в конце, после File3.ext – нулевая строка)
Что означало удаление трех файлов в корне диска С.
То после добавления из ИНФ файла такого куска, переименовывающего еще два других файла:

Код: Выделить весь код
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager","PendingFileRenameOperations",0x00010008,"\??\D:\File5.ext"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager","PendingFileRenameOperations",0x00010008,"\??\D:\File6.ext"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager","PendingFileRenameOperations",0x00010008,"\??\D:\File7.ext"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager","PendingFileRenameOperations",0x00010008,"\??\D:\File8.ext"
В реестре получится следующая каша в этом ключе:
Код: Выделить весь код
\??\C:\File1.ext
\??\D:\File5.ext
\??\D:\File6.ext
\??\D:\File7.ext
\??\D:\File8.ext
Что будет означать переименование File1.ext в File5.ext, File6.ext в File7.ext, а файл File8.ext вообще останется "подвешенным в воздухе".

Этот баг где-то описан у Майкрософта в MSDN (убейте меня, но не помню, где именно….)

Единственный способ корректной обработки этого ключа – это WinApi функция MoveFileEx с параметром MOVEFILE_DELAY_UNTIL_REBOOT, вызываемая из какой-либо программы.

Для переименования файла используется вызов:
MoveFileEx(FileName1, FileName2, MOVEFILE_DELAY_UNTIL_REBOOT)

А для удаления файла – вызов:
MoveFileEx(FileName1, NULL, MOVEFILE_DELAY_UNTIL_REBOOT)

Функция корректно производит стыковку новых добавляемых строк с существующими старыми, добавленными раньше.


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

-------
Мои проекты:
Системные: Fake-Setup Advanced | MSSTMake | UserMake
Оформление: WinstyleMonitor | Winstyle - Установка на "живую" систему | Windows 7 Universal Patcher | Панель персонализации для Windows 7 Starter & Home Basic
Уголок юного археолога: Внутренности Установщика WinXP


Последний раз редактировалось Mr dUSHA, 22-11-2008 в 18:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:21, 22-11-2008 | #977