|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Регфайл, синтаксис. |
|
Регфайл, синтаксис.
|
Ветеран Сообщения: 842 |
Думаю пора обсудить написание валидных регфайлов средствами 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 Однако, большую сложность думаю представляет запись значений параметров в валидном виде для регфалов! Например, все типы кроме REG_SZ и REG_DWORD имеют запись вида = hex(2): Причём, понятно что REG_EXPAND_SZ содержит юникод, экспортирующийся в виде шеснадцетиричного кода разделённого запятыми в регфайл. Закрывается строка нуевым символом, то-есть двумя байтами нулей ',00,00' (впрочем это так же актуально и для multisz и для binary) Несмотря на то, что строки могут быть размещены без переносов, и это работает, однако майкрософт придумала способ записи разделяемой слеш, для переноса строки. Это красиво и хотелось бы тоже этому следовать. Длина строк в такой записи содержит 25 байт разделённых запятыми, строки начинается с двух пробелов и заканчивается слеш, если нужен перенос Однако первая строка имеет не постоянную длину относительно имени переменной. Минимальная строка содержит 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,\ < строка стала короче "zzz"=dword:0001e240 И другие (zero-lenth-binary-value) "value1"=hex(0): У меня просьба, сделайте свои предложения по поводу кода autoit, и быть может это соберёться в некий включаемый файлик? Вопрос: можно ли получить юникод или бинарную не ascii строку в перменную и затем разделить все байты строки запятыми? Ну и особое желание - это установить слеши по схеме регфайла, тоесть с расчётом длинны, длин и т.п. ![]() Ещё проще вопрос, как записать запятую через каждые два символа, заранее неизвестной строки... aa,bb,ab,ac,.... |
|
------- Отправлено: 20:17, 22-06-2009 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Получается следующий результат:
$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD' MsgBox(0, 'Строка для reg-файла', _StringToRegFileFormat($sSerial, 'REG_EXPAND_SZ')) Func _StringToRegFileFormat($sData, $sType, $iSlash=10) Local $sHex, $iHexLength, $aData, $sDataResult, $i, $j=4 If $iSlash < 0 OR ($iSlash > 0 AND $iSlash < 4) Then $iSlash = 4 Switch $sType Case 'REG_DWORD' Return 'dword:' & Hex($sData, 8) Case 'REG_BINARY' $sType = 'hex:' $iHexLength = 3 Case 'REG_EXPAND_SZ' $sType = 'hex(2):' $iHexLength = 2 Case 'REG_MULTI_SZ' $sType = 'hex(7):' $iHexLength = 7 Case Else Return '"' & $sData & '"' EndSwitch $sData = StringLower(Hex(StringToBinary($sData, 2), $iHexLength)) For $i=1 To StringLen($sData) Step 2 $sDataResult &= StringMid($sData, $i, 2) & ',' If $j == $iSlash Then $j = 0 $sDataResult &= '\' & @CRLF EndIf $j += 1 Next Return $sType & $sDataResult & '00,00' EndFunc Цитата:
|
|
------- Последний раз редактировалось proxy, 24-06-2009 в 04:51. Отправлено: 03:17, 24-06-2009 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Цитата semiono:
Если длина строки более 76 символов - выполняется перенос. Следующая строка содержит в начале два пробела. Вроде что-то написал ![]() |
|
------- Отправлено: 12:12, 24-06-2009 | #12 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата:
|
|
------- Отправлено: 12:27, 24-06-2009 | #13 |
![]() Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Да.
Изменил немного. Стало меньше. Но всё равно много (хотя, в принципе, знаю как ещё больше можно уменьшить): Func RegValueReadAndConvert($KeyName, $ValueName) Local $Data = RegRead($KeyName, $ValueName) Local $Type = @extended Local $Return = '"' & $ValueName & '"=' Local $Temp = "" Local $ArrT[1] Switch $Type Case $REG_SZ Return $Return & '"' & $Data & '"' Case $REG_EXPAND_SZ $Data = StringReplace(StringToBinary($Data, 2), "0x", "") $Temp = $Return & "hex(2):" $Length = StringLen($Data) / 2 For $i = 1 To $Length + 3 If $I < $Length + 1 Then $Temp &= StringMid($Data, $I * 2 - 1, 2) & "," Else $Temp &= "00" If $I < $Length + 3 Then $Temp &= "," EndIf $ArrT = StringSplit($Temp, @LF) If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & " " ; два пробела Next Return $Temp Case $REG_BINARY $Data = StringReplace($Data, "0x", "") $Temp = $Return & "hex:" For $i = 1 To StringLen($Data) / 2 - 1 $Temp &= StringMid($Data, $I * 2 - 1, 2) & "," $ArrT = StringSplit($Temp, @LF) If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & " " ; два пробела Next $Temp &= StringMid($Data, StringLen($Data) - 1, 2) Return $Temp Case $REG_DWORD Return $Return & "dword:" & Hex($Data) Case $REG_MULTI_SZ $Data = StringReplace(StringToBinary($Data, 2), "0x", "") $Temp = $Return & "hex(2):" $Length = StringLen($Data) / 2 For $i = 1 To $Length + 4 If $I < $Length + 1 Then $Temp &= StringMid($Data, $I * 2 - 1, 2) & "," Else $Temp &= "00" If $I < $Length + 4 Then $Temp &= "," EndIf $ArrT = StringSplit($Temp, @LF) If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & " " ; два пробела Next Return $Temp EndSwitch EndFunc |
------- Отправлено: 12:31, 24-06-2009 | #14 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать + мой вариант:
#region: - Options Opt('MustDeclareVars', 1) Opt('TrayIconDebug', 1) Opt('TrayIconHide', 0) #endregion Local $sFilePath = 'd:\reg.reg' Local $sRegKey = 'HKEY_LOCAL_MACHINE\SYSTEM' Local $sValueName = 'SN' Local $sValueType = 'REG_EXPAND_SZ' Local $fAllInKey = 1 Local $iSlash = 10 _CreatRegFile($sFilePath, $sRegKey, $sValueName, $sValueType, $fAllInKey, $iSlash) Func _CreatRegFile($sFilePath, $sRegKey, $sValueName, $sValueType, $fAllInKey=0, $iSlash=10) Local Const $REG_SZ = 1 Local Const $REG_EXPAND_SZ = 2 Local Const $REG_BINARY = 3 Local Const $REG_DWORD = 4 Local Const $REG_MULTI_SZ = 7 Local $hFile, $i=1 Local $sFileContent = 'Windows Registry Editor Version 5.00' $sRegKey = StringRegExpReplace($sRegKey, '\\+$', '') While 1 If $fAllInKey Then $sValueName = RegEnumVal($sRegKey, $i) If @error <> 0 Then ExitLoop Switch @extended Case $REG_SZ $sValueType = 'REG_SZ' Case $REG_EXPAND_SZ $sValueType = 'REG_EXPAND_SZ' Case $REG_BINARY $sValueType = 'REG_BINARY' Case $REG_DWORD $sValueType = 'REG_DWORD' Case $REG_MULTI_SZ $sValueType = 'REG_MULTI_SZ' EndSwitch EndIf $sFileContent &= @CRLF & @CRLF & '[' & $sRegKey & ']' & @CRLF & _StringToRegFileFormat($sValueName, RegRead($sRegKey, $sValueName), $sValueType, $iSlash) If NOT $fAllInKey Then ExitLoop $i += 1 WEnd $hFile = FileOpen($sFilePath, 8+2) FileWrite($hFile, $sFileContent) FileClose($hFile) EndFunc Func _StringToRegFileFormat($sName, $sData, $sType, $iSlash=10) Local $sHex, $iHexLength, $iNameLen, $iStartLen, $aResult, $sResult, $i Switch $sType Case 'REG_DWORD' Return 'dword:' & Hex($sData, 8) Case 'REG_BINARY' $sType = 'hex:' $iHexLength = 3 Case 'REG_EXPAND_SZ' $sType = 'hex(2):' $iHexLength = 2 Case 'REG_MULTI_SZ' $sType = 'hex(7):' $iHexLength = 7 Case Else Return '"' & $sData & '"' EndSwitch $iNameLen = Floor(StringLen($sName & $sType) / 2) $sResult = StringLower(Hex(StringToBinary($sData, 2), 2)) & '0000' If StringLen($sResult)+(StringLen($sResult)/2)-1 > 76 Then $iSlash = 10 If $iNameLen > $iSlash Then $iStartLen = 0 Else $iStartLen = $iSlash - $iNameLen + 6 EndIf If StringLen($sResult)+(StringLen($sResult)/2)-1 < StringLen($sName & $sType) Then $iSlash = 0 If $iNameLen < $iStartLen Then $iStartLen = $iSlash - $iNameLen + $iSlash-4 If Mod($iStartLen, 2) <> 0 Then $iStartLen += 1 Dim $aResult[2] $aResult[0] = StringLeft($sResult, $iStartLen) $aResult[1] = StringMid($sResult, $iStartLen+1) For $i=0 To 1 $aResult[$i] = StringRegExpReplace($aResult[$i], '([a-z0-9]{2,2})', '\1,') If $i Then If $iSlash Then $aResult[$i] = '\' & @CRLF & StringRegExpReplace($aResult[$i], '(.{' & ($iSlash*3)-1 & '},)', '\1\\' & @CRLF) $aResult[$i] = StringRegExpReplace($aResult[$i], ',+$', '') EndIf Next $sResult = $aResult[0] & $aResult[1] Return '"' & $sName & '"=' & $sType & $sResult & @CRLF EndFunc Учтено: длина строки < 76, и @CRLF в конце. Уже лучше расставляются слеши, вся разбивка на StringRegExpReplace. |
------- Последний раз редактировалось proxy, 24-06-2009 в 22:21. Отправлено: 14:30, 24-06-2009 | #15 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Sylver Dragon:
Local Const $REG_SZ = 1 Local Const $REG_EXPAND_SZ = 2 Local Const $REG_BINARY = 3 Local Const $REG_DWORD = 4 Local Const $REG_MULTI_SZ = 7 Hex конвертацию можно упростить: $sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD' MsgBox(0, $sSerial, Hex(StringToBinary($sSerial, 2), 7)) Расстановка запятых, так не проще? $sData = 'VMKJGNDIDNWLDMKJGNDIDNWLD' For $i=1 To StringLen($sData) Step 2 $sDataResult &= StringMid($sData, $i, 2) & ',' Next MsgBox(0, $sData, $sDataResult) Расстановка запятых + слеши: |
------- Отправлено: 14:56, 24-06-2009 | #16 |
![]() Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Разве всё надо в hex конвертить?
Цитата proxy:
Цитата proxy:
|
||
------- Отправлено: 15:08, 24-06-2009 | #17 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата Sylver Dragon:
Цитата:
Закрывающие нули: Цитата:
Удаление запятой: Цитата:
Цитата:
Цитата:
...обновил.. |
||||||
------- Последний раз редактировалось proxy, 24-06-2009 в 17:56. Отправлено: 17:44, 24-06-2009 | #18 |
![]() Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать StringRegExpReplace($TempValue, "([^,]{2})", "$0,") - расстановка запятых после каждого второго символа (в конце тоже будет).
Цитата proxy:
Цитата proxy:
Плюс, после каждого раздела следует ещё один @CRLF |
||
------- Отправлено: 18:27, 24-06-2009 | #19 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата Sylver Dragon:
![]() |
|
------- Отправлено: 18:52, 24-06-2009 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 | Вебмастеру | 6 | 03-03-2005 22:42 |
|