Srdelayed.exe
Приложения, выполняющие операции восстановления состояния системы в начале запуска операционной системы, могут не использовать функции управления файлами для перемещения, удаления или задания короткого имени определенных системных файлов. Srdelayed.exe — это исполняемый файл, предоставляемый функцией резервного копирования Windows Server (WSB) в Windows Server 2008, который позволяет приложениям восстановления состояния системы перемещать, удалять и задавать короткое имя системных файлов.
Средство Srdelayed предназначено для приложений восстановления состояния системы; Он не заменяет функции управления файлами. Это средство следует использовать только в том случае, если приложению не удается переместить, удалить или задать короткое имя системного файла с помощью функций MoveFileEx, DeleteFile и SetFileShortName. Во время восстановления и перезапуска состояния системы Srdelayed.exe используется системным восстановлением и средством командной строки wbadmin.exe для перемещения, удаления и задания короткого имени в определенных системных файлах. Поэтому srdelayed может оказаться полезным для разработчиков, которым требуется возможность восстановить эти системные файлы в собственных приложениях восстановления состояния системы.
Srdelayed может выполнять следующие операции:
- Операция перемещения файла, аналогичная функции MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT
- Операция удаления файла, аналогичная функции DeleteFile
- Операция с коротким именем набора, аналогичная функции SetFileShortName
Чтобы использовать Srdelayed, приложению требуется полный путь к расположению файла Srdelayed.exe и полный путь к текстовому файлу Юникода, который вы создали, чтобы содержать сведения, необходимые средству для выполнения всех запрошенных операций управления файлами. Ваше приложение отвечает за то, что этот текстовый файл не содержит избыточных запросов для операции и что он обрабатывает все необходимые порядок операций управления файлами. Например, так как папка должна быть пуста для удаления, приложение должно убедиться, что текстовый файл указывает удаление всех файлов в папке, прежде чем запрашивать удаление папки.
Если запись SetupExecute еще не существует в реестре, приложение должно создать запись типа REG_MULTI_SZ с именем SetupExecute в следующем разделе реестра: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager.
Приложение должно использовать следующий формат, чтобы задать для параметра SetupExecute полный путь к расположению файла Srdelayed.exe и полному пути к расположению текстового файла. Префикс "\\?? \" в путь к текстовому файлу следующим образом:
Полный путь к Srdelayed.exe \\?? \Полный путь к текстовому файлу
Например, следующее значение для SetupExecute указывает, что Srdelayed.exe находится в папке System32, а текстовый файл называется DelayedOperations:
C:\Windows\System32\srdelayed.exe \\?? \C:\temp\DelayedOperations
Пробелы в пути и имени должны быть шестнадцатеричными. Например, для program Files закодируйте путь как "\\?? \C:Program%20Files\a.dll".
При восстановлении реестра или системы при перезапуске приложение должно убедиться, что SetupExecute записывается в правильный hive реестра. Восстановление реестра выполняется перед запуском Srdelayed.exe. Приложению необходимо написать SetupExecute в восстановленную версию реестра, так как это версия, считываемая.
Формат для входного файла srdelayed
Все сведения, необходимые для выполнения операций управления файлами, указываются в виде строки символов Юникода в текстовом файле Юникода. Строка символов Юникода секционирована по записям, которые сами по себе секционированы по четырем полям. Каждая запись задает один файл перемещения, удалить файл или задать операцию короткого имени. Четыре поля каждой записи содержат параметры для операции. Srdelayed.exe выполняет каждую операцию в порядке их записей в строке. Приложение должно проверка для всех повторяющихся записей в этом файле и удалить дубликаты.
Следующая строка иллюстрирует формат для файла, запрашивающего две операции, и состоит из двух записей. Каждое поле параметра заканчивается одним символом L'\0. Запись состоит из четырех последовательных полей. Дополнительный символ L'\0 добавляется к концу всех записей.
<ParamA1>L'\0'<ParamA2>L'\0'<ParamA3>L'\0'<ParamA4>L'\0'<ParamB1>L'\0'<ParamB2>L'\0'<ParamB3>L'\0'<ParamB4>L'\0'L'\0'
|-----------------------RecordA------------------------|------------------------RecordB------------------------|
Значение первого, второго, третьего и четвертого полей параметров зависит от того, описывает ли запись операцию перемещения, удаления или задания короткого имени.
Формат записи перемещаемого файла
Поле 1 определяет это как запрос на перемещение файла. Значение в этом поле всегда имеет значение L"MoveFile" и учитывает регистр.
Поле 2 указывает исходное расположение файла. Операция с перемещением srdelayed не поддерживает перемещение папки. Файл должен быть указан в этом поле. Значением этого поля является полный путь к файлу, добавленный к "\\?? \" если путь не содержит глобально уникальный идентификатор (GUID), который использует "\\?\" в качестве префикса. Удалите "\\?\" перед добавлением к "\\?? \".
Поле 3 указывает назначение файла. Операция перемещения файлов работает только в томе. Источник и назначение должны находиться в одном томе. Значением этого поля является полный путь к файлу, добавленный к "\\?? \" если путь не содержит глобально уникальный идентификатор (GUID), который использует "\\?\" в качестве префикса. Удалите "\\?\" перед добавлением к "\\?? \".
Поле 4 получает сведения о состоянии из Srdelayed. Значение в этом поле должно иметь значение L"NotExecuted" для новой записи.
Следующий пример ссылается на файл по пути к диску. Если путь и имя источника — C:\Stage\a.dll, эта запись запрашивает, что srdelayed переместит его в C:\temp\a.dll.
MoveFile \\?? \C:\Stage\a.dll \\?? \C:\temp\a.dll NotExecuted
Следующий пример ссылается на файл по пути GUID тома. Если путь и имя источника — \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6e6963}\Stage\a.dll, эта запись запрашивает, чтобы srdelayed переместить его в \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\a.dll
MoveFile \\?? \Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\Stage\a.dll \\?? \Volume{26a21bda-a627-11d7-9931-806e6f6e6e6963}\temp\a.dll NotExecuted
Формат записи удаления файла
Поле 1 определяет это как запрос на удаление файла. Значение в этом поле всегда имеет значение L"DeleteFile" и учитывает регистр.
Поле 2 не используется. Значение в этом поле должно иметь значение L"Unused".
Поле 3 указывает файл, который нужно удалить. Папка должна быть пуста для удаления. Перед удалением папки используйте операции удаления файлов, чтобы удалить все файлы в папке. Значением этого поля является полный путь к файлу, добавленный к "\\?? \" если путь не содержит глобально уникальный идентификатор (GUID), который использует "\\?\" в качестве префикса. Удалите "\\?\" перед добавлением к "\\?? \".
Поле 4 получает сведения о состоянии из Srdelayed. Значение в этом поле должно иметь значение L"NotExecuted" для новой записи.
Следующий пример ссылается на файл по пути к диску. Если путь и имя — C:\temp\b.dll, эта запись запрашивает удаление файла srdelayed.
DeleteFile Unused \\?? \C:\temp\b.dll NotExecuted
Следующий пример ссылается на файл по GUID тома. Если путь и имя — \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\b.dll, эта запись запрашивает удаление файла srdelayed.
DeleteFile Unused \\?? \Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\b.dll\ NotExecuted
Формат для задания записи короткого имени
Поле 1 определяет это как запрос на задание короткого имени файла. Значение в этом поле всегда имеет значение L"SetFileShortName" и учитывает регистр.
Поле 2 указывает короткое имя.
Поле 3 указывает путь и длинное имя для получения короткого имени. Значением этого поля является путь и длинное имя файла, добавленного к "\\?? \" если путь не содержит глобально уникальный идентификатор (GUID), который использует "\\?\" в качестве префикса. Удалите "\\?\" перед добавлением к "\\?? \".
Поле 4 получает сведения о состоянии из Srdelayed. Значение в этом поле должно иметь значение L"NotExecuted" для новой записи.
Следующий пример ссылается на файл по пути к диску. Если путь и имя файла — C:\temp\ShortFileName.dll, эта запись запрашивает, что файл получает короткое имя, ShortN~1.dll.
SetFileShortName ShortN~1.dll \\?? \C:\temp\ShortFileName.dll NotExecuted
Следующий пример ссылается на файл по GUID тома. Если путь и имя файла : \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\ShortFileName.dll\, эта запись запрашивает, что файл получает короткое имя, ShortN~1.dll.
SetFileShortName ShortN~1.dll \\?? \Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\ShortFileName.dll\ NotExecuted
Состояние операций srdelayed
Srdelayed записывает строку L"SC=xxxxxxxx" в четвертое поле каждой записи текстового файла, где xxxxx является шестнадцатеричным, указывающим состояние запрошенной операции. Значение нуля указывает, что операция выполнена успешно.
Srdelayed создает раздел реестра с именем SystemRestore в разделе HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion для регистрации результатов всей операции восстановления. Если Srdelayed выполняет все запрошенные операции с успехом, имя RestoreStatusResult записывается под этим ключом с нулевым значением. Если srdelayed не может выполнять какие-либо запрошенные операции, имена RestoreStatusResult и RestoreStatusDetails записываются под этим ключом с ненулевыми значениями. Имя RestoreStatusDetails записывается под этим ключом, только если srdelayed не может выполнять какие-либо запрошенные операции. Если операция для задания короткого имени файла завершается неудачно, srdelayed продолжает следующую операцию. Srdelayed считает, что операции перемещения и удаления файлов являются критически важными и не продолжаются, если операция перемещения или удаления завершается неудачно.