Advertisement
Bannan

Parse Strings and Replace (IDA 7 - ida.hlp)

Jan 19th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 26.20 KB | None | 0 0
  1. ; ==============================================================================
  2. ; Версия AutoIt:   3.3.14.5
  3. ; Язык:            Russian
  4. ; Платформа:       Windows NT
  5. ; Автор:           Bannan (http://forum.ru-board.com)
  6. ; Версия сценария: 0.1 (alpha)
  7. ;
  8. ; Назначение сценария:
  9. ;   - извлечение строк интерфейса IDA 7.0 для последующего перевода;
  10. ;   - запись переведенных строк и замена таблицы смещений.
  11. ;
  12. ; Сценарий проверен на бинарном файле ida.hlp для IDA 7.0
  13. ;===============================================================================
  14.  
  15. ; ~~~~~~~~ ОПИСАНИЕ РАБОТЫ ~~~~~~~~~
  16. ; Исходными данными для обработки является файл ida.hlp.
  17. ;
  18. ; Поместите этот файл в отдельную папку и создайте его резервную копию.
  19. ;
  20. ; [[ Извлечь ]]
  21. ; Выберите исходный файл ресурса ida.hlp и нажмите "Открыть". По окончании
  22. ; процесса обработки, если не было никаких ошибок, в папке с файлом ida.hlp
  23. ; будет создан текстовый файл с именем ida.hlp и расширением ТХТ. Кодировка
  24. ; документа UTF-8 (with BOM). При переводе строк кодировку не меняйте. Также
  25. ; не изменяйте форматирование строк. В них обильно присутствуют различные
  26. ; метки, указатели, спецификаторы, теги и прочие. Работайте только с текстом.
  27. ;
  28. ; Полученный файл при работе со сценарием:
  29. ;  - ida.hlp.txt
  30. ;
  31. ; [[ Заменить ]]
  32. ; Для замены в одной папке должны находиться исходный файл ida.hlp и его
  33. ; одноименный текстовый документ с переведенными строками - ida.hlp.txt.
  34. ; Выберите исходный файл ресурса ida.hlp и нажмите "Открыть". По окончании
  35. ; процесса обработки, если не было никаких ошибок, исходный файл ida.hlp
  36. ; будет перезаписан.
  37. ;
  38. ;
  39. ; ~~~~~~~ СТРУКТУРА ФАЙЛА ~~~~~~~~
  40. ; Ресурс состоит из 3-х блоков:
  41. ;  I   | Header          | - ID файла ida.hlp и характеристики массивов
  42. ;  II  | Array OffsetStr | - массив ссылок на строки
  43. ;  III | Array Strings   | - массив строк с их размерами
  44. ;
  45. ; Блок I имеет размер - 13 байт. Он содержит идентификатор ресурса ida.hlp
  46. ; с начальными двумя байтами 4846, которые используются еще раз между
  47. ; II и III блоками. Третий байт от начала (02) возможно определяет число
  48. ; блоков. Последние два байта заголовка определяют количество ссылок.
  49. ;
  50. ; Блок II содержит ссылки на строки. Размер ссылки - 4 байта. Порядок байт -
  51. ; обратный. Ссылка по сути является прямым смещением, по которому строка
  52. ; находится в файле ida.hlp.
  53. ;
  54. ; -- ПРИМЕР:
  55. ; Имеем в блоке II ссылку вида ......... - 9F1F0000.
  56. ; Переворачиваем последовательность байт - 00001F9F
  57. ;
  58. ; В блоке III строка находится по смещению 00001F9F.
  59. ; --
  60. ;
  61. ; Блок III содержит следующие данные:
  62. ;  - размер (длина) строки
  63. ;  - нуль-терминированная строка (с завершающим нулем - 00)
  64. ;
  65. ; Длина строки определяется двумя байтами, порядок байт - обратный.
  66. ;
  67. ; -- ПРИМЕР:
  68. ; Имеем в блоке II ссылку вида ......... - 9F1F0000.
  69. ; Переворачиваем последовательность байт - 00001F9F
  70. ; Байты по смещению 00001F9F ........... - 09004E6F204572726F7200
  71. ; Первые два байта ..................... - 0900
  72. ; Переворачиваем последовательность байт - 0009
  73. ; Байты строки ......................... - 4E6F204572726F7200
  74. ;
  75. ; Итак, в блоке III по смещению 00001F9F находится строка "No Error",
  76. ; длина которой - 9(9) байт/символов вместе с завершающим нулем.
  77. ;
  78. ;===============================================================================
  79.  
  80. ; [BEGIN SCRIPT]
  81.  
  82. #NoTrayIcon
  83. #include <ButtonConstants.au3>
  84. #include <GUIConstantsEx.au3>
  85. #include <StaticConstants.au3>
  86. #include <WindowsConstants.au3>
  87. #include <ProgressConstants.au3>
  88.  
  89. ; Элементы GUI
  90. Local $hGUI = GUICreate("IDA 7.0 (ida.hlp)", 277, 69)
  91. Local $iButton1 = GUICtrlCreateButton("Заменить", 4, 14, 70, 25)
  92. Local $iButton2 = GUICtrlCreateButton("Извлечь", 202, 14, 70, 25)
  93. $sLabel = GUICtrlCreateLabel("Обработка данных ida.hlp.", 1, 46, 276, 16, $SS_CENTER)
  94. Local $sLabel1 = GUICtrlCreateLabel("Bannan©2019", 80, 20, 116, 14, $SS_CENTER)
  95. $hProgress = GUICtrlCreateProgress(7, 50, 262, 10)
  96. GUICtrlSetState(-1, $GUI_HIDE)
  97. GUISetState(@SW_SHOW, $hGUI)
  98.  
  99. ; Обработка оконных событий
  100. Local $iMsg
  101. While 1
  102.    $iMsg = GUIGetMsg()
  103.    Switch $iMsg
  104.       Case $GUI_EVENT_CLOSE
  105.          ExitLoop
  106.       Case $iButton2
  107.          _extract()
  108.       Case $iButton1
  109.          _inject()
  110.    EndSwitch
  111. WEnd
  112.  
  113. GUIDelete($hGUI)
  114.  
  115. ; Функция извлечения строк в текстовый документ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  116. Func _extract()
  117.    ; Установка начальных значений для свойств элементов управления GUI
  118.    GUICtrlSetColor($sLabel, 0x000000)
  119.    GUICtrlSetData($sLabel, "")
  120.  
  121.    ;--- Диалог выбора исходных файлов ресурсов (HLP) ---
  122.    $sResRawFile = FileOpenDialog("Открыть файл", @ScriptDir, "Строковый ресурс (*.hlp)", 1)
  123.    ; Проверка сделанного выбора (есть строка пути или нет)
  124.    If $sResRawFile = "" Then
  125.       ; Информируем пользователя
  126.       GUICtrlSetColor($sLabel, 0x8b0000)
  127.       GUICtrlSetData($sLabel, "Файл не выбран.")
  128.       ; Выход из функции, если файл не выбран
  129.       Return
  130.    EndIf
  131.  
  132.    ; Получаем дескриптор полного пути для выбранного файла
  133.    $hResRawFileInit = FileFindFirstFile($sResRawFile)
  134.    ; Получаем имя выбранного файла, включая расширение
  135.    $sResRawFileName = FileFindNextFile($hResRawFileInit)
  136.    ; Проверка имени файла заданным условиям
  137.    If $sResRawFileName <> 'ida.hlp' Then
  138.       ; Информируем пользователя
  139.       GUICtrlSetColor($sLabel, 0xff0000)
  140.       GUICtrlSetData($sLabel, "Выбранный файл не является ресурсным.")
  141.       ; Выход из функции, если имя файла не соответствует условиям
  142.       Return
  143.    EndIf
  144.  
  145.    ; Формируем имя файла для записи извлеченных строк
  146.    $sResTxtFileName = $sResRawFileName & ".txt"
  147.    ; Проверка наличия файла (есть/нет)
  148.    If FileExists($sResTxtFileName) Then
  149.       ; Информируем пользователя
  150.       If MsgBox(4 + 48, "Предупреждение", "Файл " & $sResTxtFileName & _
  151.                         " уже существует." & @CRLF & @CRLF & _
  152.                         "Хотите его перезаписать?") = 7 Then
  153.          GUICtrlSetData($sLabel, "Обработка данных ida.hlp.")
  154.          ; Выход из функции, если нажата кнопка "Нет"
  155.          Return
  156.       EndIf
  157.    EndIf
  158.  
  159.    ; Открываем файл для записи строк
  160.    $hResTxtFile = FileOpen($sResTxtFileName, 2 + 128) ;  + 128 (UTF-8 with BOM)
  161.  
  162.    ;--- Определение характеристик ресурсного файла ---
  163.    ; Открываем файл в двоичном режиме для чтения
  164.    $hResRawFile = FileOpen($sResRawFileName, 16)
  165.    ; Считываем файл в буфер
  166.    $vResRawData = FileRead($hResRawFile)
  167.    ; Определяем количество ссылок в таблице смещений на строки
  168.    $iCountLinks = BitRotate((BinaryMid($vResRawData, 12 , 2)),0)
  169.    ; Устанавливаем адрес начала таблицы смещений на строки (14 позиция от начала файла)
  170.    $iBeginOffsetLinksTable = 14
  171.    ; Объявляем переменную для записи ссылок и присваиваем ей начальное значение
  172.    $iNextOffsetLinksTable = $iBeginOffsetLinksTable
  173.  
  174.    ; Отключаем отображенине текстовой метки
  175.    GUICtrlSetState($sLabel, $GUI_HIDE)
  176.    ; Включаем отображенине прогресс бара
  177.    GUICtrlSetState($hProgress, $GUI_SHOW)
  178.    ; Устанавливаем начальную позицию прогресс бара
  179.    GUICtrlSetData($hProgress, 0)
  180.  
  181.    ;--- Извлечение строк из ресурсного файла (HLP) и запись в новый файл ---
  182.    For $i = 1 To $iCountLinks
  183.  
  184.       ; Определяем позицию строки в массиве строк
  185.       $iOffsetString = BitRotate((BinaryMid ($vResRawData , $iNextOffsetLinksTable , 4)),0)
  186.       ; Проверяем не нулевое значение адреса.
  187.       If $iOffsetString <> 0 Then ; Если адрес не пустой, то...
  188.          ; Определяем размер строки для извлечения
  189.          $iSizeString = BitRotate((BinaryMid($vResRawData , $iOffsetString + 1 , 2)),0)
  190.          ; Получаем бинарный формат строки (без последнего нулевого байта)
  191.          $sStringLine = BinaryMid($vResRawData , $iOffsetString + 3 , $iSizeString - 1 )
  192.  
  193.          ;//--------------------------------------------------------------------
  194.          ; Замена символов в диапазоне 7F - FF.
  195.          ; Большинство строк содержат служебные коды в диапазоне 7F - FF.
  196.          ; При конвертации переведенных строк в UTF-8 эти служебные символы
  197.          ; будут также преобразованы и в результате утрачены. Чтобы этого
  198.          ; не произошло, все коды заменяем их символьным эквивалентом.
  199.          $sStringLine = StringReplace($sStringLine, 'DC0A', '5C307844430A') ; \0xDC
  200.          $sStringLine = StringReplace($sStringLine, 'DF', '5C30784446') ;     \0xDF
  201.          $sStringLine = StringReplace($sStringLine, '0A03', '0A5C30783033') ; \0x03
  202.          $sStringLine = StringReplace($sStringLine, '034361', '5C307830334361')
  203.          $sStringLine = StringReplace($sStringLine, '20DA', '205C30784441') ; \0xDA
  204.          $sStringLine = StringReplace($sStringLine, '0ADA', '0A5C30784441')
  205.          $sStringLine = StringReplace($sStringLine, '20A9', '205C30784139') ; \0xA9
  206.          $sStringLine = StringReplace($sStringLine, '20BF', '205C30784246') ; \0xBF
  207.          $sStringLine = StringReplace($sStringLine, 'BF20', '5C3078424620')
  208.          $sStringLine = StringReplace($sStringLine, 'BF0A', '5C307842460A')
  209.          $sStringLine = StringReplace($sStringLine, 'B320', '5C3078423020') ; \0xB3
  210.          $sStringLine = StringReplace($sStringLine, 'B30A', '5C307842300A')
  211.          $sStringLine = StringReplace($sStringLine, 'D90A', '5C307844390A') ; \0xD9
  212.          $sStringLine = StringReplace($sStringLine, 'D920', '5C3078443920')
  213.          $sStringLine = StringReplace($sStringLine, 'D93C', '5C307844393C')
  214.          ;$sStringLine = StringReplace($sStringLine, 'DBDB', '5C307844425C30784442') ; \0xDB
  215.          $sStringLine = StringReplace($sStringLine, 'C0C4C4', '5C307843305C307843345C30784334') ; \0xC0
  216.          $sStringLine = StringReplace($sStringLine, 'C0C2C4', '5C307843305C307843325C30784334') ; \0xC2
  217.          $sStringLine = StringReplace($sStringLine, 'C4C1C4', '5C307843345C307843315C30784334') ; \0xC1
  218.          $sStringLine = StringReplace($sStringLine, 'C1C4C4', '5C307843315C307843345C30784334')
  219.          $sStringLine = StringReplace($sStringLine, '4441C1C4', '44415C307843315C30784334')
  220.          $sStringLine = StringReplace($sStringLine, 'C4C4C4', '5C307843345C307843345C30784334') ; \0xC4
  221.          $sStringLine = StringReplace($sStringLine, 'C4C45C30', '5C307843345C307843345C30')
  222.          $sStringLine = StringReplace($sStringLine, '4334C4', '43345C30784334')
  223.          ;//--------------------------------------------------------------------
  224.  
  225.          ; Преобразуем бинарные данные в строку
  226.          $sStringLine = BinaryToString($sStringLine, 1)
  227.          ; Выполняем замену внутристроковых переносов на символьный эквивалент
  228.          $sStringLine = StringRegExpReplace($sStringLine, '(\n)', '\\r\\n') ; 0x0D0A @CRLF \r\n
  229.       Else ; если адрес пустой (0)
  230.          ; Записываем строку с признаком "пустая"
  231.          $sStringLine = '-null-'
  232.       EndIf
  233.  
  234.       ; Записываем строку в новый текстовый документ
  235.       FileWrite ($hResTxtFile, $sStringLine & @CRLF) ; @CRLF "0D0A"
  236.       ; Переходим к следующему адресу в таблице смещений
  237.       $iNextOffsetLinksTable += 4
  238.       ; Устанавливаем позицию прогресс бара
  239.       GUICtrlSetData($hProgress, $i / $iCountLinks * 100)
  240.    Next
  241.  
  242.    ;--- Закрываем открытые файлы ---
  243.    FileClose($hResRawFile) ; Исходный файл ресурса
  244.    FileClose($hResTxtFile) ; Текстовый файл со строками
  245.  
  246.    ;--- Информируем пользователя ---
  247.    GUICtrlSetColor($sLabel, 0x006400)
  248.    GUICtrlSetData($sLabel, "Все строки записаны в " & $sResTxtFileName & "!")
  249.  
  250.    ; Отключаем отображенине прогресс бара
  251.    GUICtrlSetState($hProgress, $GUI_HIDE)
  252.    ; Включаем отображенине текстовой метки
  253.    GUICtrlSetState($sLabel, $GUI_SHOW)
  254. EndFunc   ;==>_extract
  255.  
  256.  
  257. ; Функция перепаковки строковых ресурсов <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  258. Func _inject()
  259.    ; Установка начальных значений для свойств элементов управления GUI
  260.    GUICtrlSetColor($sLabel, 0x000000) ;
  261.    GUICtrlSetData($sLabel, "")
  262.  
  263.    ;--- Диалог выбора исходных файлов ресурсов (HLP) ---
  264.    $sResRawFile = FileOpenDialog( "Открыть файл", @ScriptDir, "Строковый ресурс (*.hlp)", 1)
  265.    ; Проверка сделанного выбора (есть строка пути или нет)
  266.    If $sResRawFile = "" Then
  267.       ; Информируем пользователя
  268.       GUICtrlSetColor($sLabel, 0x8b0000)
  269.       GUICtrlSetData($sLabel, "Файл не выбран.")
  270.       ; Выход из функции, если файл не выбран
  271.       Return
  272.    EndIf
  273.  
  274.    ; Получаем дескриптор полного пути для выбранного файла
  275.    $hResRawFileInit = FileFindFirstFile($sResRawFile)
  276.    ; Получаем имя выбранного файла, включая расширение
  277.    $sResRawFileName = FileFindNextFile($hResRawFileInit)
  278.    ; Проверка имени файла заданным условиям
  279.    If $sResRawFileName <> 'ida.hlp' Then
  280.       ; Информируем пользователя
  281.       GUICtrlSetColor($sLabel, 0xff0000)
  282.       GUICtrlSetData($sLabel, "Выбранный файл не является ida.hlp.")
  283.       ; Выход из функции, если файла не существует
  284.       Return
  285.    EndIf
  286.  
  287.    ; Формируем имя файла, в котором находятся строки
  288.    $sResTxtFileName = $sResRawFileName & ".txt"
  289.    ; Формируем полный путь к файлу со строками
  290.    $sPathResTxtFile = GetDir($sResRawFile) & "\" & $sResTxtFileName
  291.    ; Проверка наличия файла (есть/нет)
  292.    If FileExists($sPathResTxtFile) = 0 Then
  293.       ; Информируем пользователя
  294.       GUICtrlSetColor($sLabel, 0xff0000)
  295.       GUICtrlSetData($sLabel, "Файл " & $sResTxtFileName & " не найден.")
  296.       ; Выход из функции, если файла не существует
  297.       Return
  298.    EndIf
  299.  
  300.    ;--- Определение характеристик ресурсного файла ---
  301.    ; Открываем файл в двоичном режиме для чтения
  302.    $hResRawFile = FileOpen($sResRawFileName, 16)
  303.    ; Считываем файл в буфер
  304.    $vResRawData = FileRead($hResRawFile)
  305.    ; Определяем количество ссылок в таблице ссылок на строки
  306.    $iCountLinks = BitRotate((BinaryMid($vResRawData, 12 , 2)),0)
  307.    ; Устанавливаем адрес начала таблицы ссылок на строки (15 позиция от начала файла)
  308.    $iBeginOffsetLinksTable = 14
  309.    ; Определяем размер таблицы ссылок на строки
  310.    $iSizeLinksTable = $iCountLinks * 4
  311.    ; Определяем адрес начала массива строк
  312.    $iBeginStringsTable = $iBeginOffsetLinksTable + $iSizeLinksTable + 1
  313.    ; Закрываем исходный файл ресурсов
  314.    FileClose($hResRawFile)
  315.  
  316.  
  317.    ;--- Модификация ресурсного файла ---
  318.    ; Открываем файл со строками в текстовом режиме только для чтения
  319.    $hResTxtFile = FileOpen($sPathResTxtFile, 0 + 128) ;  + 128 (UTF-8 with BOM)
  320.    ; Открываем исходный файл в бинарном режиме для записи
  321.    $hResRawFile = FileOpen($sResRawFile, 16 + 1)
  322.    ; Объявляем переменную для записи новой таблицы ссылок для строк
  323.    $aTempOffsetString = ""
  324.    ; Объявляем переменную для записи позиций и присваиваем ей начальное значение
  325.    $iPosFileNextString = $iBeginStringsTable
  326.    ; Устанавливаем в ресурсном файле позицию на начало массива со строками
  327.    FileSetPos($hResRawFile, $iBeginStringsTable, 0)
  328.  
  329.    ; Отключаем отображенине текстовой метки
  330.    GUICtrlSetState($sLabel, $GUI_HIDE)
  331.    ; Включаем отображенине прогресс бара
  332.    GUICtrlSetState($hProgress, $GUI_SHOW)
  333.    ; Устанавливаем начальную позицию прогресс бара
  334.    GUICtrlSetData($hProgress, 0)
  335.    ; Объявляем переменную счетчика обработки для прогресс бара
  336.    Local $i = 0
  337.  
  338.    ;--- Чтение и запись строк, создание таблицы смещений ---
  339.    While 1
  340.       $i += 1
  341.       ; Считываем строку из текстового файла со строками (ТХТ)
  342.       $sStringLineN = FileReadLine($hResTxtFile)
  343.       If @error = -1 Then ExitLoop ; если ошибка чтения, то выход из цикла
  344.       ; Проверяем, является ли строка '-null-'
  345.       $iResult = StringCompare($sStringLineN, '-null-', 1)
  346.       ; Если строка не "пустая", то...
  347.       If $iResult <> 0 Then
  348.          ; Выполняем в строке замену символьных эквивалентов переноса
  349.          $sStringLineN = StringRegExpReplace($sStringLineN, '(\\r\\n)', @LF)
  350.          ; Если в строке есть символы кириллицы, то...
  351.          If StringRegExp($sStringLineN , '[А-Яа-яЁё]+?') Then
  352.             ; Конвертируем в UTF-8, затем в НЕХ и дополняем нулевым байтом (конец строки)
  353.             $sHexStringLineN = StringTrimLeft(StringToBinary($sStringLineN, 4), 2) & "00"
  354.          Else
  355.             ; Конвертируем в UTF-8, затем в НЕХ и дополняем нулевым байтом (конец строки)
  356.             $sHexStringLineN = StringTrimLeft(StringToBinary($sStringLineN), 2) & "00"
  357.          EndIf
  358.  
  359.          ;//--------------------------------------------------------------------
  360.          ; Восстанавливаем оригинальные символы в диапазоне 7F - FF
  361.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784443', 'DC') ; \0xDC
  362.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784446', 'DF') ; \0xDF
  363.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30783033', '03') ; \0x03
  364.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784441', 'DA') ; \0xDA
  365.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784139', 'A9') ; \0xA9
  366.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784246', 'BF') ; \0xBF
  367.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784230', 'B3') ; \0xB3
  368.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784439', 'D9') ; \0xD9
  369.          ;$sHexStringLineN = StringReplace($sHexStringLineN, '5C30784442', 'DB') ; \0xDB
  370.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784330', 'C0') ; \0xC0
  371.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784331', 'C1') ; \0xC1
  372.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784332', 'C2') ; \0xC2
  373.          $sHexStringLineN = StringReplace($sHexStringLineN, '5C30784334', 'C4') ; \0xC4
  374.          ;//--------------------------------------------------------------------
  375.  
  376.          ; Определяем размер строки
  377.          $iSizeStringN = BinaryLen(Binary("0x" & $sHexStringLineN))
  378.          ; Получаем байты размера строки в перевернутом виде
  379.          $iHexSizeStringN = Hex(BitShift(BitRotate(Binary("0x" & Hex($iSizeStringN)),0),16), 4)
  380.          ; Дополняем НЕХ данные строки её размером
  381.          $sHexStringLineN = $iHexSizeStringN & $sHexStringLineN
  382.          ; Переворачиваем байты смещения
  383.          $iReversNewOffsetStringShiftN = Hex(BitRotate(Binary("0x" & Hex($iPosFileNextString, 8)),0))
  384.          ; Записываем новое смещение строки в таблицу смещений
  385.          $aTempOffsetString = $aTempOffsetString & $iReversNewOffsetStringShiftN
  386.          ; Записываем новую строку в ресурсный файл
  387.          FileWrite($hResRawFile, Binary("0x" & $sHexStringLineN))
  388.          ; Получаем текущую позицию в ресурсном файле
  389.         $iPosFileNextString = FileGetPos($hResRawFile)
  390.       Else ; если же строка "пустая", то...
  391.          ; Присваиваем нулевое значение адреса
  392.          $iReversNewOffsetStringShiftN = '00000000'
  393.          ; Записываем новое смещение строки в таблицу смещений
  394.          $aTempOffsetString = $aTempOffsetString & $iReversNewOffsetStringShiftN
  395.       EndIf
  396.       ; Устанавливаем позицию прогресс бара
  397.       GUICtrlSetData($hProgress, $i / $iCountLinks * 100)
  398.    WEnd
  399.  
  400.    ;--- Запись таблицы смещений для строк ---
  401.    FileSetPos($hResRawFile, $iBeginOffsetLinksTable - 1, 0)
  402.    FileWrite($hResRawFile, Binary("0x" & $aTempOffsetString))
  403.  
  404.    ;--- Закрытие открытых файлов ---
  405.    FileClose($hResRawFile) ; Исходный файл ресурса
  406.    FileClose($hResTxtFile) ; Текстовый файл со строками
  407.  
  408.    ;--- Информируем пользователя ---
  409.    GUICtrlSetColor($sLabel, 0x006400)
  410.    GUICtrlSetData($sLabel, "Файл " & $sResRawFileName & " изменён!")
  411.  
  412.    ; Отключаем отображенине прогресс бара
  413.    GUICtrlSetState($hProgress, $GUI_HIDE)
  414.    ; Включаем отображенине текстовой метки
  415.    GUICtrlSetState($sLabel, $GUI_SHOW)
  416. EndFunc   ;==>_inject
  417.  
  418.  
  419. ; Функция получения папки для выбранного файла <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  420. Func GetDir($sFilePath)
  421.  
  422.    ;--- Объявление переменных ---
  423.     Local $aFolders = StringSplit($sFilePath, "\")
  424.     Local $iArrayFoldersSize = UBound($aFolders)
  425.     Local $FileDir = ""
  426.  
  427.    ;--- Проверка наличия пути ---
  428.     If (Not IsString($sFilePath)) Then
  429.         Return SetError(1, 0, -1)
  430.     EndIf
  431.  
  432.    ;--- Разделение строки пути на подстроки ---
  433.     $aFolders = StringSplit($sFilePath, "\")
  434.    ;--- Получение размера массива с подстроками ---
  435.     $iArrayFoldersSize = UBound($aFolders)
  436.  
  437.    ;--- Формирование пути к папке ---
  438.     For $i = 1 To ($iArrayFoldersSize - 2)
  439.         $FileDir &= $aFolders[$i] & "\"
  440.     Next
  441.  
  442.     Return $FileDir
  443.  
  444. EndFunc   ;==>GetDir
  445.  
  446. ; [END SCRIPT]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement