Раздел реестра RunOnce
Все версии Windows поддерживают раздел реестра RunOnce, который можно использовать для указания команд, которые система будет выполнять один раз, а затем удалить. Создание разделов реестра RunOnce можно сделать из пакета драйвера.
Примечание.
Создание раздела реестра RunOnce для устройств, отличных от устройств SWENUM только для программного обеспечения, не соответствует изоляции пакетов драйверов и не может быть выполнено из драйвера Windows.
В Windows 8 и Windows 8.1 записи RunOnce для установки устройств SWENUM только программного обеспечения обрабатываются во время установки устройства. Другие записи RunOnce добавляются в ключ RunOnce . Они применяются при следующем обработке системного ключа RunOnce . Установка устройства не принудительно обрабатывает записи RunOnce .
В Windows 7 и предыдущих версиях сразу после установки устройства Windows выполняет команду, хранящуюся под ключом RunOnce , а затем удаляет ключ. Кроме того, при каждом запуске системы она выполняет команду, хранящуюся под ключом RunOnce , а затем удаляет ключ. Таким образом, если вы помещаете команду в ключ RunOnce , вы не можете легко предсказать, когда она выполняется.
Сразу после установки устройства Windows выполняет команду, хранящуюся под ключом RunOnce , а затем удаляет ключ. Кроме того, при каждом запуске системы она выполняет команду, хранящуюся под ключом RunOnce , а затем удаляет ключ. Таким образом, если вы помещаете команду в ключ RunOnce , вы не можете легко предсказать, когда она выполняется.
Для установки устройств разделы реестра RunOnce можно создать с помощью разделов надстройки, которые задаются с помощью директив INF AddReg. Каждый раздел надстройки имеет следующий синтаксис:
reg-root, [subkey], [value-entry-name], [flags], [value]
Значения корневого реестра (reg-root) и подключа для раздела реестра RunOnce приведены следующим образом:
HKLM, "Software\Microsoft\Windows\CurrentVersion\RunOnce"
Строка имени значения опущена из записи реестра RunOnce. Тип записи, указанной значением Flags, должен быть либо REG_SZ (значение флагов 0x00000000), либо REG_EXPAND_SZ (значение флагов 0x00010000). Для записи типа REG_SZ (по умолчанию) можно опустить значение Флагов .
Параметр значения в ключе RunOnce указывает выполняемую команду. Этот параметр представляет собой строку с кавычками, которая имеет следующий формат:
Rundll32[.exe] DllName,EntryPoint[Arguments]
По умолчанию ключ RunOnce удаляется после выполнения указанной команды. Можно префиксировать параметр значения ключа RunOnce с восклицательным знаком (!), чтобы отложить удаление ключа до тех пор, пока команда не будет успешно выполнена. Без префикса восклицательного знака, если указанная команда завершается ошибкой, ключ RunOnce по-прежнему будет удален, и команда не будет выполнена при следующем запуске системы.
Кроме того, по умолчанию ключи RunOnce игнорируются при запуске системы в безопасном режиме. Параметр значения ключей RunOnce можно префиксировать звездочкой (*), чтобы принудительно выполнить команду даже в безопасном режиме.
При создании записи строки значения следует учитывать следующие рекомендации.
Rundll32 может отображаться с расширением имени файла .exe или без нее.
DllName — это полный путь к файлу DLL или исполняемому изображению. За исключением обязательной запятой, выражение не должно содержать запятые. Если расширение имени файла не указано, расширение по умолчанию .dll.
EntryPoint — это имя точки входа в библиотеке DLL, указанной в dllName.
Аргументы — это необязательная подстрока, содержащая все аргументы , которые необходимо передать в указанную библиотеку DLL.
Ровно один пробел должен отделять строку EntryPoint от подстроки аргументов .
В следующем примере кода показана запись раздела надстройки, в которой хранятся команда и его аргументы в разделе RunOnce :
;; WDMAud swenum install
HKLM,%RunOnce%,"WDM_WDMAUD",,\
"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_WDMAUD.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_WDMAUD%,%17%\WDMAUDIO.inf,WDM_WDMAUD.Interface.Install"
[Strings]
RunOnce = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
WDM_WDMAUD.DeviceId = "{CD171DE3-69E5-11D2-B56D-0000F8754380}"
KSNAME_Filter = "{9B365890-165F-11D0-A195-0020AFD156E4}"
KSCATEGORY_WDMAUD = "{3E227E76-690D-11D2-8161-0000F8775BF1}"
Следующие правила применяются при использовании разделов реестра RunOnce для установки устройств:
Эти разделы реестра должны использоваться только для установки устройств, доступных только для программного обеспечения, перечисленных SWENUM, перечислителя программного обеспечения.
Ключи RunOnce должны состоять только из вызовов Rundll32.exe. В противном случае WHQL не будет цифрово подписывать пакет драйвера.
Выполняемый код не должен запрашивать входные данные пользователя.
Установка на стороне сервера выполняется в системном контексте. По этой причине необходимо убедиться, что выполняемый код не содержит уязвимостей системы безопасности, и разрешения на доступ к файлу препятствуют вредоносному изменению кода.
Начиная с Windows Vista система не будет выполнять команды, указанные ключами RunOnce , если пользователь без прав администратора вошел в систему. Это может привести к неполным или поврежденным установкам после перезагрузки системы.
Перед созданием записей RunOnce приложение установки устройства сообщает текущему пользователю, что пользователь с правами администратора должен войти после перезагрузки системы.
Дополнительные сведения см. в статье "Разработка приложений, работающих на сайте входа в Windows Vista".