Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Всем доброго времени суток.
Столкнулся с двумя проблемами.
В папке $WINDIR\System32\drivers\ хочу удалить файл .sys. В семерке этот файл спокойно удаляется с помощью макроса и команды:
!insertmacro DisableX64FSRedirection
Delete "$WINDIR\System32\drivers\test.sys"
!insertmacro EnableX64FSRedirection
В десятке почему то не удаляется. Когда начал пробовать в десятке удалить его вручную, то он пишет, что занят процессом. Но IObit Unlocker показывает, что никаким процессом он не занят и командой "разблокировать и удалить" спокойно его удаляет.
Вот такой вопрос, имеется ли в nsis команда типа "снять все атрибуты, разблокировать и удалить", чтобы удалялся в десятке файл, как это делает IObit Unlocker?
И вторая проблема.
Имеется батник - это вполне рабочий генератор случайного 32 значного кода с записью в нужную область реестра:
@echo off
cls
@echo.
@echo.
call :randomizeSequence 32 sequence
@echo sequence = '%sequence%'
REG ADD HKLM\Software\Test/v TestId /t REG_SZ /d %sequence% /f
exit /b
:randomize
set MIN=%1
set MAX=%2
set /A %3=%MIN% + (%MAX% - %MIN% + 1) * %random% / 32768
exit /b
:fillArray
set "array[%cnt%]=%1"
set /a cnt +=1
exit /b
:initialRandomize
if defined ALREADYINIT (exit /b)
set ALREADYINIT=true
for %%a in ( 1 2 3 4 5 6 7 8 9 a b c d e f g) do (
call :fillArray %%a
)
exit /b
:accumulate
call :randomize 1 15 index
call set "char=%%array[%index%]%%"
call set "%dst%=%%%dst%%%%char%"
exit /b
:randomizeSequence
set len=%1
set dst=%2
call :initialRandomize
for /L %%a in (1 1 %len%) do (
call :accumulate %%a
)
exit /b
Помогите, пожалуйста сделать то же самое, что в батнике только кодом.
имеется ли в nsis команда типа "снять все атрибуты, разблокировать и удалить", чтобы удалялся в десятке файл, как это делает IObit Unlocker? »
Нет.
Если "IObit Unlocker показывает, что никаким процессом он не занят и командой "разблокировать и удалить" спокойно его удаляет", то он, скорее всего, чего-то не договаривает (дабы не перегрузить пользователю мозг технической информацией ).
Имеется батник - это вполне рабочий генератор случайного 32 значного кода »
Можно сгенерировать GUID и отфильтровать до [0-9A-F]
макрос ${GetRandomHexStringG} OUTPUT LENGTH
Запишет в переменную OUTPUT строку длиной:
LENGTH символов для 1 <= LENGTH <= 32
32 символа для других значений!include "Util.nsh"
!define GetRandomHexStringG '!insertmacro GetRandomHexStringG'
!macro GetRandomHexStringG OUTPUT LENGTH
Push ${LENGTH}
${CallArtificialFunction} GetRandomHexStringG_
Pop ${OUTPUT}
!macroend
!macro GetRandomHexStringG_
Push $0 ; result string
Exch
Exch $1 ; result chars count
Push $2 ; guid string
Push $3 ; length of guid string
Push $4 ; counter
Push $5 ; temp / char
StrCpy $0 ''
System::Call 'ole32::CoCreateGuid(g .r2)'
StrLen $3 $2
IntOp $3 $3 - 1 ; to skip last curly bracket
StrCpy $4 1 ; to skip first curly bracket
Loop:
IntCmp $4 $3 ExitLoop 0 ExitLoop
StrCpy $5 $2 1 $4
IntOp $4 $4 + 1
StrCmp $5 '-' Loop
StrCpy $0 $0$5
IntOp $1 $1 - 1
IntCmp $1 0 ExitLoop
Goto Loop
ExitLoop:
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
!macroend
пример:
${GetRandomHexStringG} $9 10
DetailPrint "result $9"
iglezz,
Можно сгенерировать GUID и отфильтровать до [0-9A-F]
Я понял, что ничего не понял. Что конкретно нужно прописать в строку добавления в реестр WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Test" "TestId" "?" , чтобы с вашего кода прописывалось 32 значное случайное число?
inco1, ${GetRandomHexStringG} $0 32 ; записать сгенерированное значение (32 символа) в $0
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Test" "TestId" "$0" ; записать $0 в реестр
iglezz, Спасибо, буду пробовать.
PS. Всё отлично работает. Правда буквы заглавные, но это не критично. Спасибо.
Правда буквы заглавные, но это не критично. »
!define GetRandomHexStringRL '!insertmacro GetRandomHexStringR x'
!define GetRandomHexStringRU '!insertmacro GetRandomHexStringR X'
!macro GetRandomHexStringR CASE OUTPUT LENGTH
Push ${LENGTH}
Push ${CASE}
${CallArtificialFunction} GetRandomHexStringR_
Pop ${OUTPUT}
!macroend
!macro GetRandomHexStringR_
Exch $0 ; 'x'/'X'
Exch
Exch $1 ; length
Push $2 ;
Push $3 ;
Push $4 ;
Push $5 ;
Push $R0 ; CSP handle returned by CryptAcquireContext()
Push $R1 ; buffer address for data generated by CryptGenRandom()
System::Alloc 32
Pop $R1
System::Call "advapi32::CryptAcquireContext(*i.R0, i0, i0, i1, i0x40)"
System::Call "advapi32::CryptGenRandom(iR0, i32, iR1)"
System::Call "advapi32::CryptReleaseContext(iR0, i0)"
System::Call "*$R1(&i4.r2, &i4.r3, &i4.r4, &i4.r5)"
System::Free $R0
StrCpy $R0 "%08$0"
IntFmt $2 $R0 $2
IntFmt $3 $R0 $3
IntFmt $4 $R0 $4
IntFmt $5 $R0 $5
StrCpy $0 $2$3$4$5 $1
Pop $R1
Pop $R0
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
!macroend
Пример:
${GetRandomHexStringRL} $0 32 ; lowercase
${GetRandomHexStringRU} $0 32 ; uppercase
Для генерации стандартного 32 значного GUID, вроде как достаточно :
OutFile CreateGuid-test.exe
!include "WordFunc.nsh"
Section
System::Call 'OLE32::CoCreateGuid(g.R0)'
${StrFilter} "$R0" "-" "" "" $R1
MessageBox MB_OK "$R1"
SectionEnd
(${StrFilter} из WordFunc.nsh используем для смены регистра)
iglezz,
Вот такой вариант генератора позволяет задавать регистр
Это то. что я хотел. Спасибо.
Рано я обрадовался. Тот первый вариант, что только с верхним регистром отлично вносит 32 знака в реестр и на семерке и на десятке.
Этот вариант с нужным мне нижним регистром вносит 32 знака в реестр только на семерке. На десятке вносит 32 нуля.
MKN, А как я могу прикрутить ваш код , чтобы добавлялось 32 знака из цифр и нижнего регистра в нужную ветку реестра?
inco1,
Очевидно же :
OutFile CreateGuid-test.exe
Section
System::Call 'OLE32::CoCreateGuid(g.R0)'
MessageBox MB_OK "$R0"
SectionEnd
MKN,
Это вообще не то. Я же выложил батник, он генерирует такой код d2b7daaed38c3532d7d7aa6895fb96ge
iglezz выложил код, который отлично генерит в верхнем регистре 848D8134AB514E70ABE491A6551B5E99
Потом он выложил код с нижним регистром, но который генерит только в семерке, но не хочет генерить в десятке - записывает ноли.
Вы выложили код, который генерит следующее {AE68BE6F-43A2-1FB4-423D-D0C358720163} это не то, что я спрашивал.
Этот вариант с нужным мне нижним регистром вносит 32 знака в реестр только на семерке. На десятке вносит 32 нуля. »
Странно, под десяткой код и писался.
x64, version 10.0.19041.264
inco1, Вот библиотечка и скрипт для тестирования (https://yadi.sk/d/_7uT5tlwsGR3Og). Оно нормально генерирует?
Для статистики - какие версии и разрядность на используемых системах (и с рабочим результатом и с нерабочим)
iglezz,
На семерках 32 и 64 от идима https://i.paste.pics/a21061b1ec343569d6bd1140262bc1c2.png
На десятках 32 и 64 и 8х64 от монкруса https://i.paste.pics/205de24bee8fd46ff5940d7684f39adc.png
Десятки 1809 17753.253 про и корпорат.
Восьмерка про последняя от монкрус.
Вы выложили код, который генерит следующее {AE68BE6F-43A2-1FB4-423D-D0C358720163} это не то, что я спрашивал. »
Если смущают дефисы и фигурные скобки, то удалить их - несколько строк кода...
Думаю это гораздо проще, чем городить портянки... Но дело хозяйское...
inco1, Раз на некоторых системах генерятся нули, лучше на этот метод и не расчитывать, тем более что это функции из крипто апи, которое объявлено устаревшим и когда-нибудь будет внезапно выпилено из актуальных на тот момент систем. Да и не быстрое оно, если часто его дёргать.
iglezz, Для моего случая подходит и работает ваш первый вариант с заглавными буквами. Просто хотелось "по честному" :)
NorvesBear
18-06-2020, 14:57
Добрый день, возник вопрос как передаются параметры из скрипта в динамическую библиотеку.
Код не мой (остался от предшественника) хочу разобраться. Код рабочий!!!! Ничего придумывать не нужно.
Напомню, что согласно оф. документации параметры при подключении dll передаются (с права на лево)
Это вызов библиотечной функции из скрипта. Как видно передаются параметры для распаковки БД, но это не важно.
dbdll::NSIS_IBExecuteRestore /NOUNLOAD $0 $szGBackUtilityPath "$INSTDIR\DataBase\BackUp\${SDMP_DB_IB}" "localhost:$INSTDIR\DataBase\DataBase.FDB" "SYSDBA" "masterkey" "$INSTDIR\DataBase\LogFile.LOG"
А это кусок библиотечной функции. Как можно видеть параметры передаются через стек.
(во вложенном файле)
Вопросы к знатокам:
1) Что хранится в стеке (не тип переменной, а идейно. Что туда кладут, какую информацию?)
2) Кто пишет в стек (NSIS или внутри DLL)
3) Кто читает из стека
4) Где располагается стек. Тип в памяти процесса скрипта или в памяти dll?
5) Где можно почитать подробнее про то каким образом происходит взаимодействия с внешними функциями у NSIS?
P.S: на некоторые вопросы я предполагаю ответы, но хочу узнать у более опытных людей.
NorvesBear
19-06-2020, 03:45
С вопросом выше полностью разобрался самостоятельно.
Оказывается при вызове функции из длл, переменные можно передать как через параметры, так и через стек.
Здесь есть официальный пример.
https://nsis.sourceforge.io/Examples/Plugin/exdll.c
В местном справочнике по NSIS удалось найти зачем.
В плагинах файл "System: Вызов функций из внешних библиотек"
Как я понял как параметры можно передать ограниченное кол-во переменных, а через стек не ограниченно + через стек безопаснее. Цитирую
Очень полезное свойство у системного плагина - отдельный(приватный) стек. Очень помогает при написании макросов и сложных функций.
Позволяет сохранить все исходные значения переменных в приватный стек до использования макроса, и восстановить все эти значения
переменных, после завершения макроса или функции в исходное(оригинальное) состояние.
Вы не будете получать конфликтов значений, при использовании одновременно одинаковых переменных.
S cохраняет значения переменых $R0 - $R9
L восстанавливает значения переменых $R0 - $R9
s cохраняет значения переменых $0 - $9
l восстанавливает значения переменых $0 - $9
Единственно важно помнить, что согласно офф документации, параметры передаются в любом случае справа на лево "https://nsis.sourceforge.io/Docs/Chapter4.html#plugindlls" Зачем сделано так для меня загадка...
И отвечая на свои же вопросы для моего примера:
1) В стеке находится то что в него засунули (ДА ЛАДНО?!), ну а именно в моём случае это параметры для функции. Ничего особенного в этом стеке нет.
2) В стек пишет NSIS, но он может доставать из стека например результат внешней функции.
3) Из стека читает функция (она сама разбирает стек и забирает нужное).
4) Стек располагается где-то в системе (не важно где). Он один и он глобальный (для всего процесса) т.е. для скрипта NSIS и всей подключённой либы вместе..
5) Подробнее про подключение динамических библиотек можно почитать
5.1) официальная документация с примерами "https://nsis.sourceforge.io/Docs/Chapter4.html#plugindlls"
5.2) замечательный хелпер этого сообщества. Ссылка, я думаю излишняя
По итогу. Свою проблему решил в полном объёме. Спасибо сообществу за замечательный хелпер без него как без рук уже (он у меня работает не корректно и не отображает содержимое страниц. Приходится доставать оттуда нужные html ручками хз почему, а форум хелпера мёртв).
Всем доброго дня.
В Messagebox по умолчанию текст выравнивается по левому краю. Применив right можно выравнять по правому краю. А center не работает.
Покажите , пожалуйста, как центрируются слова и предложения в Messagebox. А то применение пробелов для "центрации" как то не серьёзно и не совсем "центрально".
center не работает »
В стандартном варианте не работает.
https://nsis-dev.github.io/NSIS-Forums/html/t-212400.html
Или используй спец. плагины или делай свой Messagebox из окна и т.п.
MKN, по данной ссылке некий DrO в 2005 году писал, что, когда закончит с почтовым плагином, то займется этим.
Дайте, пожалуйста ссылку этого самого спец плагина.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC