Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Регфайл, синтаксис.

Ответить
Настройки темы
Регфайл, синтаксис.

Аватара для semiono

Ветеран


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

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


Изменения
Автор: semiono
Дата: 23-06-2009
Думаю пора обсудить написание валидных регфайлов средствами AutoIt3.
Хочется объединить всё вместе, как некое знание и рассмотреть все встречающиеся особенности записи различных типов параметров.

Сразу же хочеться отметить различие реестров x86 и x64, и в то же время рег синтакс исключающий записи вида HKLM/HKCU и т.п.

Здесь могут быть полезными выключатели
Код: Выделить весь код
Switch @OSArch
    Case 'x86'
        $sRegKey = 'HKLM\Software\RegKey'
    Case 'x64'
        $sRegKey = 'HKLM\Software\Wow6432Node\RegKey'
EndSwitch
Запись в файл может определяться переменной как

Код: Выделить весь код
$sFileContent = _
    'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _
    '[' & $sRegKey & ']' & @CRLF & _
    '"ValueName"=' & $sSerialResult & & @CRLF & @CRLF
Но при этом нельзя забывать, что имя куста должно быть полное, например $sRegKey = "HKEY_LOCAL_MACHINE\...", здесь нельзя использовать HKLM\

Однако, большую сложность думаю представляет запись значений параметров в валидном виде для регфалов!

Например, все типы кроме REG_SZ и REG_DWORD имеют запись вида = hex(2):
Причём, понятно что REG_EXPAND_SZ содержит юникод, экспортирующийся в виде шеснадцетиричного кода разделённого запятыми в регфайл. Закрывается строка нуевым символом, то-есть двумя байтами нулей ',00,00' (впрочем это так же актуально и для multisz и для binary)
Несмотря на то, что строки могут быть размещены без переносов, и это работает, однако майкрософт придумала способ записи разделяемой слеш, для переноса строки. Это красиво и хотелось бы тоже этому следовать.

Длина строк в такой записи содержит 25 байт разделённых запятыми, строки начинается с двух пробелов и заканчивается слеш, если нужен перенос
Код: Выделить весь код
  61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,\
Однако первая строка имеет не постоянную длину относительно имени переменной.
Минимальная строка содержит 22 байта разделённых запятыми, и начинает убавляться на один байт при увеличении длины имени переменной на 4 символа.
Код: Выделить весь код
"1"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\
"12"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\
"123"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\
"1234"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,\ < строка стала короче
Тоже самое по поводу dword, запись имеет свою особенность.
"zzz"=dword:0001e240

И другие (zero-lenth-binary-value)
"value1"=hex(0):

У меня просьба, сделайте свои предложения по поводу кода autoit, и быть может это соберёться в некий включаемый файлик?

Вопрос: можно ли получить юникод или бинарную не ascii строку в перменную и затем разделить все байты строки запятыми?
Ну и особое желание - это установить слеши по схеме регфайла, тоесть с расчётом длинны, длин и т.п.


Ещё проще вопрос, как записать запятую через каждые два символа, заранее неизвестной строки...
aa,bb,ab,ac,....

-------
Полезное сообщение


Отправлено: 20:17, 22-06-2009

 

Аватара для FlatX007

Ветеран


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

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


Простите а зачем это нужно ???

Отправлено: 09:44, 23-06-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для proxy

Старожил


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

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


FlatX007, а дело в том, что вот такая ситуация:

Задача: необходимо создать файл типа .reg, который будет записывать (или обновлять) данные в реестре велечины типа REG_EXPAND_SZ.
В реестре это будет выглядеть так:

Цитата:
Имя величины: SN
Значение величины: VMKJGNDIDNWLDMKJGNDIDNWLD
Тип величины: REG_EXPAND_SZ

А вот в .reg файле это будет выглядеть так:
Цитата:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\DashSignature\Knagalis]
"SN"=hex(2):56,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,00,44,00,4d,00,4b,0 0,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,00,44,00,00,00

Дело в том, что значения в .reg файле записываются следующим образом:
Цитата:
REG_NONE - hex(0)
REG_BINARY - hex(3) или hex
REG_DWORD - hex(4) или dword
REG_SZ - hex(1) или отсутствие указателя типа
REG_EXPAND_SZ - hex(2)
REG_MULTI_SZ - hex(7)
REG_RESOURCE_LIST - hex(8)
REG_FULL_RESOURCE_DESCRIPTOR - hex(9)

Если тип задан с использованием префикса "hex", то значение установки должно быть записано в виде последовательности чисел (от 0 до 255), разделённых запятыми. Если тип hex(4), то должно быть 4 числа, а в двойное слово они будут собраны в обратной последовательности (т.е. записаны они должны быть от младшего байта к старшему).

Если после префикса hex в скобках указано число 5,6,10 или большее 10, то считается, что тип установки REG_UNKNOWN, а её значение обрабатывается как REG_BINARY. Например, Corel использует тип hex(80000001).

Если тип не указан, то значение установки трактуется как символьная строка и должно быть взято в кавычки.

Если указан тип dword, то значение установки трактуется как шестнадцатиричное число. Оно должно содержать только символы 0-9, a-f, A-F (без кавычек). Символов может быть от 1 до 8.

Соответсвенно появился интерес накатать функции, для форматирования/перекодировки значений реестового типа REG_BINARY, REG_DWORD, REG_SZ и т.д. в формат .reg файла hex(3), hex(4), hex(1) и т.д.
Для типа REG_EXPAND_SZ, ни чего умней не родилось, как это:
Код: Выделить весь код
$sRegKey = 'HKEY_CURRENT_USER\Software\DashSignature\Knagalis'
$sSerial = RegRead($sRegKey, 'SN')

For $i=1 To StringLen($sSerial)
    $sSerialResult &= Hex(Asc(StringMid($sSerial, $i, 1)), 2) & ',00,'
Next
$sSerialResult = 'hex(2):' & $sSerialResult
If StringRight($sSerialResult, 1) == ',' Then $sSerialResult = StringTrimRight($sSerialResult, 1)

$sFileContent = _
    'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _
    '[' & $sRegKey & ']' & ',00,00' & @CRLF & _
    '"SN"=' & $sSerialResult & @CRLF & @CRLF


Вот и все, в этом и вопрос....осталось немного покодить

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

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

Отправлено: 10:23, 23-06-2009 | #3


Аватара для FlatX007

Ветеран


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

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


А что утилита ConvRegToAu3 - неумеет этого делать ?

Отправлено: 13:37, 23-06-2009 | #4


Аватара для proxy

Старожил


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

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


Цитата FlatX007:
ConvRegToAu3 »
, благодраю, интересная утилитка .....НО - задача то другая ))

FlatX007, ээ-хеее-ххххххххх......стал бы я возиться если уже все есть? - нет конечно )) конечно может и есть уже, но пока не нашел ))

Задача - с помощью AutoIt создать reg файл. А не из reg файла RegWrite функци... ))

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 13:51, 23-06-2009 | #5


Аватара для FlatX007

Ветеран


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

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


А всё допёрло ... я сначало невкурил.

Отправлено: 18:21, 23-06-2009 | #6


Аватара для semiono

Ветеран


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

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


FlatX007, ещё хочу напомнить то, что reg.exe expand /? имеет тоже ограничения.
Я бы хотел иметь замену reg.exe, так как утилита коммандной строки сама по себе хороша,
потому что можно использовать батники, а так же вызывать из InnoSetup,
но стандартная утилита не всё умеет, а жаль.

-------
Полезное сообщение


Отправлено: 20:27, 23-06-2009 | #7


Аватара для SyDr

Старожил


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

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


Дайте спецификацию .reg файлов. То есть как выглядит в нём каждый из указанных типов значений.
Для любого ли типа необходимо ковертить в hex? Какое условие переноса строки?

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Отправлено: 21:43, 23-06-2009 | #8


Аватара для proxy

Старожил


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

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


Sylver Dragon, а мне дайте 7 миллионов долларов ))))))))))))))))))))))))))
И то есть, почему ни кто не приносит кофе мне в постел?
Где моя любимая кока-кола?? Какие условия возврата d-link барахла? ))))))))))

Спецификацию файлов, типа которых разработан в Miscrosoft....что может быть проще? хотя и не совсем спецификация ((

Цитата Sylver Dragon:
Какое условие переноса строки? »
По мойму, это для удобочитабельности, т.е., как автору интересней, так и расставляется ..

...ааагрррх, на самом деле форматирование выглядит вот так:
Код: Выделить весь код
$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
MsgBox(0, $sSerial, Hex(StringToBinary($sSerial, 2), 7))
для других типов необходимо поментья length на соответсвующий типу в Hex......освобожусь, допишу func

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 23:05, 23-06-2009 | #9


Аватара для semiono

Ветеран


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

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


Перенос строки я посчитал, смотрите выше:
Цитата semiono:
Минимальная строка содержит 22 байта разделённых запятыми, и начинает убавляться на один байт »
Мне кажется это встроенно в регэдит и не меняется, и скорее всего все типы кроме REG_SZ и DWORD,
будут записываться одинакого, в том числе и переносы. Так как вроде бы нет причины их записывать
иначе. И для переноса строк в MULTI_SZ в самом регфайле ничего не будет предусмотренно,
так как это выполняется самим кодом, а это значит, что там в закрытии строк будут какие-то нули...
два байта или четыре, не знаю... 00,00,00,00 типа того! То-есть само оформление будет обычным,
но байт-контент надо уже контролировать... В InnoSetup переносы в multisz выполняет {break}

Характерные примеры multisz (WinXP)
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager
BootExecute =
Код: Выделить весь код
autocheck autochk /k:D /k:E /k:F /k:G /k:H /k:I /k:J /k:K /k:L /k:M /k:N /k:O /k:P /k:Q /k:R /k:S /k:T /k:U /k:V /k:W /k:X /k:Y /k:Z *
pgdfgsvc C 1
Вторая строка - запись от Sysinternals PageDefrag утилиты.


Я как-то возился над PendingFileRenameOperating так и не понял ничего, запарился его тестить
перезагрузками

-------
Полезное сообщение


Отправлено: 02:40, 24-06-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Регфайл, синтаксис.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WHS/JS - синтаксис On Error Dr.Dark Программирование и базы данных 8 26-08-2008 11:42
Delphi - Синтаксис масивов в Паскале verdix Программирование и базы данных 3 13-05-2008 16:36
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI DillerInc Программирование и базы данных 60 13-03-2006 21:36
Синтаксис setup.iss ags Автоматическая установка приложений 11 06-03-2006 07:58
синтаксис php E-mail Вебмастеру 6 03-03-2005 22:42




 
Переход