INF-файл можно выполнить путем вызова из коммандной строки через системную библиотеку Rundll32.exe (также в Win98 Rundll.exe). Кроме того, Rundll32 можно вызывать прямо из INF-файла, используя RunPreSetupCommands и RunPostSetupCommands (например, вызвать секцию из другого или текущего INF-файла).
Вызов через интерпретатор Setupx.dll (setupapi.dll)
После такого вызова в 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-файла при запуске его из контекстного меню командой "Установить".
Важно! При использовании в INF-файле инструкции Reboot и вызове через Rundll32 данного INF-файла, будет обработан режим перезагрузки, указанный в строке вызова через Rundll32.exe. Напомню, что в руководстве по INF-файлам написано:
Reboot= Флаг перезагрузки после выполнения пакета процедур. Этот флаг может быть отменён флагом вызова скрипта (через точку входа LaunchINFSectionEx)
Важно! Синтаксис описанных команд содержит запятые и пробелы. Не забывайте их ставить, иначе команда не сработает.
Важное замечание по синтаксису INF- скрипта. При вызове интерпретатора из INF-файла имеются различия вызова через setupapi.dll и advpack.dll. Вызов setupapi.dll должен осуществляться через инструкцию Run= , а вызов advpack.dll - только через RunPostSetupCommands=
Для запуска исполняемых файлов после того, как 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" - во втором варианте будет отображатся в окне установки.