Код:
!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