Advertisement
AZJIO

_RegExport_X + _RegFunc

Aug 3rd, 2012
473
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 5.90 KB | None | 0 0
  1. #Include <_RegFunc.au3>
  2.  
  3. ; $Key = 'HKEY_LOCAL_MACHINE\SOFTWARE\aa'
  4. $Key = 'HKEY_LOCAL_MACHINE\HARDWARE'
  5. ; $Key = 'HKEY_LOCAL_MACHINE\HARDWARE\RESOURCEMAP\PnP Manager\PnpManager'
  6. ; $Key = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.nfo\OpenWithProgids'
  7. ; $Key = 'HKEY_LOCAL_MACHINE\HARDWARE\RESOURCEMAP\Hardware Abstraction Layer\ACPI 1.0 - APIC platform MP'
  8.  
  9. $timer1 = TimerInit()
  10. $sResult1=''
  11. $DataErr = _RegExport_X($Key, $sResult1)
  12. $timer1 = Round(TimerDiff($timer1), 2)
  13.  
  14.  
  15. If MsgBox(4, "", '_RegExport_X_RegFunc : ' & $timer1 &@CRLF&@CRLF& $DataErr)=6 Then
  16.     $file = FileOpen(@ScriptDir&'\я Export_RegFunc.reg',2)
  17.     FileWrite($file, $sResult1)
  18.     FileClose($file)
  19. EndIf
  20.  
  21. Func _RegExport_X($sKey, ByRef $Data)
  22.     Local $aaaValue, $asValue0, $cmd, $DataErr, $hex, $i, $L, $line1, $Re, $sTemp, $sValue, $sValue0, $sValueName, $sValuetype
  23.  
  24.     $i = 0
  25.     Do
  26.         $i += 1
  27.         ; If $i=1 Then $Data &= @CRLF & '[' & $sKey & ']' & @CRLF
  28.         $sValueName = RegEnumVal($sKey, $i)
  29.         If @error Then ExitLoop
  30.         $sValue = _RegRead($sKey, $sValueName, True)
  31.         If @error Then ContinueLoop
  32.         $sValuetype = @extended
  33.         ; $sValueName = StringRegExpReplace($sValueName, '[\\]', "\\$0") ; всегда заменяем в параметре наклонную черту на двойную
  34.         $sValueName = StringReplace($sValueName, '\', "\\") ; всегда заменяем в параметре наклонную черту на двойную
  35.         If $i=1 Then $Data &= @CRLF & '[' & $sKey & ']' & @CRLF ; если строку переместить к началу, то все разделы даже пустые добавятся
  36.         ; здесь для каждого типа данных свой алгоритм извлечения значений
  37.         Switch $sValuetype
  38.             Case 1
  39.                 $sValue = StringReplace(StringReplace(StringRegExpReplace($sValue, '["\\]', "\\$0"), '=\"\"', '="\"'), '\"\"', '\""')
  40.                 $Data &= '"' & $sValueName & '"="' & $sValue & '"' & @CRLF
  41.             Case 7, 2
  42.                 $hex=_HEX($sValuetype, $sValue, $sValueName, $L)
  43.                 $Data &= '"' & $sValueName & '"=' & $L & $hex & @CRLF
  44.             Case 4
  45.                 $Data &= '"' & $sValueName & '"=dword:' & StringLower(Hex(Int($sValue))) & @CRLF
  46.             Case 3
  47.                 $hex=_HEX(3, $sValue, $sValueName, $L)
  48.                 $Data &= '"' & $sValueName & '"=' & $L & $hex & @CRLF
  49.             Case 0, 8, 9, 10, 11 ; тип данных которые не распознаёт AutoIt3, поэтому используется экспорт консольной командой.
  50.                 ; Вытаскиваем значение в консоль и читаем с неё
  51.                 $hex=_HEX($sValuetype, $sValue, $sValueName, $L)
  52.                 $Data &= '"' & $sValueName & '"=' & $L & $hex & @CRLF
  53.             Case Else
  54.                 $DataErr &= '# error... Key:"' & $sKey & '" Valuename:"' & $sValueName & '" значение:"' & $sValue & '" type:"' & $sValuetype & '"' & @CRLF
  55.         EndSwitch
  56.     Until 0
  57.     ;рекурсия
  58.     $i = 0
  59.     While 1
  60.         $i += 1
  61.         $sTemp = RegEnumKey($sKey, $i)
  62.         If @error Then ExitLoop
  63.         $DataErr &= _RegExport_X($sKey & '\' & $sTemp, $Data)
  64.     WEnd
  65.     $Data = StringReplace($Data, '""=', '@=') ; заменяем в данных параметры по умолчанию на правильные
  66.     Return $DataErr
  67. EndFunc   ;==>_RegExport_X
  68.  
  69. ; функция шестнадцатеричных данных, основное её значение - привести запись к формату reg-файла (перенос строк)
  70. ; данные подгонялись методом сравнения оригинального экспорта и reg-файлом полученным скриптом до полного совпадения.
  71. Func _HEX($sValuetype, ByRef $sValue, $sValueName, ByRef $L)
  72.     Local $aValue, $hex, $i, $k, $len, $lenVN, $r, $s, $s0
  73.     $k = 0
  74.     $lenVN = StringLen($sValueName) - 1
  75.     Switch $sValuetype
  76.         Case 0
  77.             $L = 'hex(0):'
  78.         Case 3
  79.             $k = 1
  80.             $L = 'hex:'
  81.         Case 2
  82.             $k = 1
  83.             $L = 'hex(2):'
  84.             $sValue = StringToBinary($sValue, 2)
  85.             $sValue &= '0000'
  86.             $lenVN = StringLen($sValueName) + 2
  87.         Case 7
  88.             $k = 1
  89.             $L = 'hex(7):'
  90.             ; $sValue = StringToBinary($sValue, 2) ; строковый в бинарный вид
  91.             ; $sValue = StringReplace($sValue, '000a00', '000000') ; по какой то причине экспортированные и прочитанные данные разнятся этими блоками
  92.             ; $sValue &= '00000000' ; шестнадцатеричные данные заполнены окончания нулями, иногда не совпадает количество, автоит обрезает так как читает данные как текстовые
  93.         Case 8
  94.             $sValue = StringTrimLeft($sValue, 2)
  95.             $L = 'hex(8):'
  96.         Case 10
  97.             $L = 'hex(a):'
  98.         Case 11
  99.             $L = 'hex(b):'
  100.         Case 9
  101.             ; $k = -1
  102.             $sValue = StringTrimLeft($sValue, 2)
  103.             $L = 'hex(9):'
  104.     EndSwitch
  105.     $hex = ''
  106.     $aValue=StringRegExp($sValue, '..', 3)
  107.     $len = UBound($aValue) ; от колич. символов параметра зависит колич. бинарных данных первой строки
  108.     If $lenVN >= 69 Then $lenVN = 66
  109.     $s0 = 22 - ($lenVN - Mod($lenVN, 3)) / 3 ; количество символов для первой строки reg-данных
  110.     Switch $sValuetype
  111.         Case 7,8,9
  112.             $s0 -= 1
  113.     EndSwitch
  114.     $s = 0
  115.     $r = 0
  116.     For $i = $k To $len-1 ; цикл формирует правильный перенос строк, и разделительные запятые
  117.         If $s = $s0 Or $r = 24 Then
  118.             $hex &= $aValue[$i] & ',\' & @CRLF & '  '
  119.             $s = 24
  120.             $r = 0
  121.         Else
  122.             $hex &= $aValue[$i] & ','
  123.             $s += 1
  124.             $r += 1
  125.         EndIf
  126.     Next
  127.     $hex = StringTrimRight($hex, 1)
  128.     If StringRight($hex, 5) = ',\' & @CRLF & ' ' Then $hex = StringTrimRight($hex, 5) ;обрезка конца значания
  129.     $hex = StringLower($hex) ; преобразование в строчные
  130.     Return $hex
  131. EndFunc   ;==>_HEX
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement