Выполнение INF-файла через Rundll32.exe
INF-файл можно выполнить путем вызова из коммандной строки через системную библиотеку Rundll32.exe (также в Win98 Rundll.exe). Кроме того, Rundll32 можно вызывать прямо из INF-файла, используя RunPreSetupCommands и RunPostSetupCommands (например, вызвать секцию из другого или текущего INF-файла).
Вызов через интерпретатор Setupx.dll (setupapi.dll)
Синтаксис:
RunDll32.exe setupx.dll, InstallHinfSection <section> <reboot-mode> <inf-name>
RunDll32.exe setupapi.dll, InstallHinfSection <section> <reboot-mode> <inf-name>
1. <section> - Исполняемая секция
2. <reboot-mode> - Флаг перезагрузки
3. <inf-name> - имя и путь к inf- файлу
После такого вызова в INF-файле setupx.dll повторно ее вызывать нельзя, так как это может привести к перезагрузке или другим неприятным последствиям. Для многократных вызовов из файла интерпретатора лучше использовать RunOnce (см.ниже).
Имя исполняемой секции: если секция с таким именем не будет найдена, то ничего не будет "выполняться", и сообщений об ошибках тоже не будет.
Флаги перезагрузки:
Интерпретатор понимает следующие значения этого параметра:
NeverReboot 0 или 128 - не перезагружать компьютер.
AlwaysSilentReboot 1 или 129 - обязательно (и без вопросов) перезагружать компьютер.
AlwaysPromptReboot 2 или 130 - спросить у пользователя, перезагружать компьютер или нет.
SilentReboot 3 или 131 - определить, надо или нет перезагружать компьютер. Если оказалось, что перезагружать надо, то выполнить перезгрузку (без вопросов).
PromptReboot 4 или 132 - определить, надо или нет перезагружать компьютер. Если оказалось, что перезагружать надо, то спросить у пользователя, перезагружать компьютер или нет.
Параметр 132 - рекомендованный режим перезагрузки (после "выполнения").
Каким образом интерпретатор определяет необходимость перезагрузки? Если при "выполнении" обновлялись системные файлы, и хотя бы один из них не смог быть обновлён из-за того, что в это время использовался системой, то перезагрузка необходима (сразу после перезагрузки произойдёт обновление файлов и процесс будет завершён).
Rundll32.exe может работать в режиме совместимости с Win9X (
rundll32 setupx.dll) и в режиме совместимости с NT (
rundll32 setupapi.dll). Одним из отличий 9X и NT вариантов выполнения является набор используемых констант
LDID (logical directory identifier - переменных путей к системным папкам).
Важно! Именно через
Setupx.dll (Setupapi.dll), происходит выполнение INF-файла при запуске его из контекстного меню командой "Установить".
Вызов через advpack.dll
Синтаксис
RunDll32.exe advpack.dll, LaunchINFSectionEx <inf-file>, <section>, <cab>, <flag1>, <flag2>, 0
1. <inf-file> имя и путь к INF-файлу
2. <section> Исполняемая секция
3. <cab> Путь к CAB-файлу если INF-файл запакован (в этом случае параметр <inf-file> просто содержит имя файла без пути)
4. <flag1> - Флаг режима установки
5. <flag2> - Флаг перезагрузки
6. <0- nShow> не используется, равен 0, приведен только для информации о синтаксисе функции.
Флаг режима установки:
4 Тихий режим без UI
8 Не запускать GrpConv
16 Обновление программы (Force self-updating on user's system)
32 Сделать резервные копии файлов (точку отката) до установки
64 Откатиться до предыдущего состояния
128 Проверить резервные копии файлов
256 Полностью откатиться до предыдущего состояния
512 Принудительная задержка регистрации OCX (Force delay of OCX registration)
Эти флаги могут складываться.
Например, довольно распрастраненный режим Quiet | Backup (32+4) = 36.
Флаг перезагрузки:
Без данного флага используется Smart Reboot, т. е. перезагрузка по требованию.
A - Перезагрузка всегда
I - Тот самый Smart Reboot, по умолчанию стоит этот флаг
N - Не перезагружаться
Пример с распаковкой INF из CAB:
rundll32.exe advpack.dll,LaunchINFSectionEx myinf.inf,,c:\temp\mydata.cab,36
Пример с откатом установки INF:
rundll32.exe advpack.dll,LaunchINFSectionEx c:\windows\inf\myinf.inf,,,256
Важно! При использовании в INF-файле инструкции Reboot и вызове через Rundll32 данного INF-файла, будет обработан режим перезагрузки, указанный в строке вызова через
Rundll32.exe. Напомню, что в руководстве по INF-файлам написано:
Reboot= Флаг перезагрузки после выполнения пакета процедур. Этот флаг может быть отменён флагом вызова скрипта (через точку входа LaunchINFSectionEx)
Важно! Синтаксис описанных команд содержит запятые и пробелы. Не забывайте их ставить, иначе команда не сработает.
Важное замечание по синтаксису INF- скрипта. При вызове интерпретатора из INF-файла имеются различия вызова через
setupapi.dll и
advpack.dll. Вызов
setupapi.dll должен осуществляться через инструкцию Run= , а вызов advpack.dll - только через RunPostSetupCommands=
Пример:
[DefaultInstall]
RunPostSetupCommands=Section.advpack
Run=Section.setupapi
[Section.advpack]
Rundll32.exe advpack.dll, LaunchINFSectionEx infname.inf, SectionToRun , , 4, 64
[Section.setupapi]
Rundll32.exe setupapi.dll, InstallHinfSection SectionToRun 132 infname.inf
Использование RunOnce
Для запуска исполняемых файлов после того, как INF-файл исполнен, можно использовать RunOnce. Команды из RunOnce выполняются после перезагрузки или следующего входа в систему. Ключ регистрации RunOnce дает возможность выполнить файлы в "тихом" режиме (без подсказок пользователю) или в виде списка программ или действий ("Установка Windows устанавливает следующие элементы"), которые видит пользователь.После выполнения программ записи из RunOnce удаляются.
Для "тихого режима" добавляется путь к приложению в раздел реестра: HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce, "APPNAME", "APP_PATH"
Для режима с отображением установки в виде окна со списком устанавливаемых программ добавляется путь к приложению в раздел реестра: HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup, "APPNAME", "APP_PATH"
"APPNAME" - во втором варианте будет отображатся в окне установки.
К содержанию
Содержание раздела