!include WinMessages.nsh

!define VerifySerialNuber '!insertmacro VerifySerial'
!macro VerifySerial Serial Result
       # for normal NSIS release this define is limited to 1024 bytes.
       # if you want more take a look here http://nsis.sourceforge.net/Special_Builds
       !define SER_NUM '3442099166557410\
               		1001200230034004\
                        1234567899990000\
                        4554655699110411\
                        5555222277773333'

  Push $0
  Push $1
  Push $2
  Push $3
  Push $4

    StrCpy $1 0
    StrCpy $2 16
    StrCpy $3 16
    StrCpy $4 1
    StrCpy ${Result} ''

    messagebox mb_ok 'You typed this serial: ${Serial}'

    StrCpy $0 ${SER_NUM} $2 $1

loopbegin:
          StrCmp $0 '' failed
          messagebox mb_ok 'Num. $4 Serial from our list is this: $0'
          StrCmp $0 ${Serial} success
          StrCpy $0 ${SER_NUM} $3 $2
          IntOp $2 $2 + $3
          Intop $4 $4 + 1
          goto loopbegin

success:
        StrCpy ${Result} 'success'
        messagebox mb_ok 'Verification result is: ${Result}'
        goto macroend

failed:
       StrCpy ${Result} 'failed'
       messagebox mb_ok 'Verification result is: ${Result}'

macroend:
  Pop $4
  Pop $3
  Pop $2
  Pop $1
  Pop $0
!macroend

!define ResetControlText '!insertmacro ResetControlText'
!macro ResetControlText Result Ini Field Value
       readinistr ${Result} '${Ini}' '${Field}' '${Value}'
       SendMessage ${Result} ${WM_SETTEXT} "STR:" 0
!macroend

var Result

Name "My Application"
outfile 'test.exe'
showinstdetails show
licenseData '${NSISDIR}\License.txt'
LicenseBkColor 0xFFFFFF
BrandingText $(^Name)

page license
page custom CustomCreate CustomLeave
page instfiles

section -
;;;;;;;;;;;;;;
sectionend

function .onInit
         initpluginsdir
         gettempfilename $0
         rename $0 '$PLUGINSDIR\custom.ini'
         call WriteIni
functionend

function CustomCreate
         ClearErrors
         ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "RegisteredOwner"
         IfErrors is_NT
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'State' '$R1'
         ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "RegisteredOrganization"
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'State' '$R1'
         goto DrawPage
is_NT:
      ClearErrors
      ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "RegisteredOwner"
      WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'State' '$R1'
      ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "RegisteredOrganization"
      WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'State' '$R1'
DrawPage:
   push $1
         InstallOptions::InitDialog /nounload '$PLUGINSDIR\custom.ini'
   pop $1
         readinistr $R1 '$PLUGINSDIR\custom.ini' 'Field 5' 'HWND'
         System::Call "user32::SetFocus(i R1)i"
         InstallOptions::Show '$PLUGINSDIR\custom.ini'
   Pop $1
   Pop $1
functionend

function CustomLeave
   Push $8
   Push $7
   Push $6
   Push $5
   Push $4
   Push $3
   Push $2
   Push $1
   Push $0

        readinistr $1 '$PLUGINSDIR\custom.ini' 'Field 2' 'State'
        strcmp $1 '' 0 +3
        messagebox mb_ok|mb_iconexclamation 'plz enter user name'
        abort

        readinistr $1 '$PLUGINSDIR\custom.ini' 'Field 3' 'State'
        strcmp $1 '' 0 +3
        messagebox mb_ok|mb_iconexclamation 'plz enter company name'
        abort

    readinistr $5 '$PLUGINSDIR\custom.ini' 'Field 5' 'State'
    readinistr $6 '$PLUGINSDIR\custom.ini' 'Field 6' 'State'
    readinistr $7 '$PLUGINSDIR\custom.ini' 'Field 7' 'State'
    readinistr $8 '$PLUGINSDIR\custom.ini' 'Field 8' 'State'

    ${VerifySerialNuber} '$5$6$7$8' '$Result'

    StrCmp $Result 'success' proceed

    ${ResetControlText} $4 '$PLUGINSDIR\custom.ini' 'Field 8' 'HWND'
    ${ResetControlText} $4 '$PLUGINSDIR\custom.ini' 'Field 7' 'HWND'
    ${ResetControlText} $4 '$PLUGINSDIR\custom.ini' 'Field 6' 'HWND'
    ${ResetControlText} $4 '$PLUGINSDIR\custom.ini' 'Field 5' 'HWND'
     System::Call "user32::SetFocus(i r4)i"

     MessageBox MB_OK|MB_ICONSTOP 'Wrong Serial Number'
     Abort

proceed:
        readinistr $2 '$PLUGINSDIR\custom.ini' 'Field 2' 'State'
        readinistr $3 '$PLUGINSDIR\custom.ini' 'Field 3' 'State'
        messagebox mb_yesno|mb_iconinformation \
        "You have entered $\r$\n$\r$\n\
        User Name: $2$\r$\n\
        Company Name: $3$\r$\n\
        Serial Number: $5 - $6 - $7 - $8$\r$\n$\r$\n\
        Do you want to add these informations to the registry?" idno end
        WriteRegStr HKCU "SOFTWARE\$(^name)" 'User Name' '$2'
        WriteRegStr HKCU "SOFTWARE\$(^name)" 'Company Name' '$3'
        WriteRegStr HKCU "SOFTWARE\$(^name)" 'Serial Number' '$5 - $6 - $7 - $8'
        messagebox mb_yesno|mb_iconinformation \
        "Informations successfully added to the registry.$\r$\n$\r$\n\
        Do you wish to read them now?" idno end
        ReadRegStr $0  HKCU "SOFTWARE\$(^name)" 'User Name'
        ReadREgStr $1  HKCU "SOFTWARE\$(^name)" 'Company Name'
        ReadREgStr $2  HKCU "SOFTWARE\$(^name)" 'Serial Number'
        messagebox mb_yesno|mb_iconinformation \
        "This is what we got from the registry.$\r$\n$\r$\n\
        $$0 == $0$\r$\n\
        $$1 == $1$\r$\n\
        $$2 == $2$\r$\n$\r$\n\
        Do you wish to Delete these registry records now?" idno end

        StrCpy $0 0
        loop:
             EnumRegValue $1 HKCU "SOFTWARE\$(^name)" $0
             StrCmp $1 "" done
             IntOp $0 $0 + 1

             ReadRegStr $2 HKCU "SOFTWARE\$(^name)" $1

             MessageBox mb_yesno|mb_iconquestion "Value Name: $1 $\r$\n\
             Value Data: $2$\n$\nClear value data?" idno loop ;+3
             WriteRegStr HKCU "SOFTWARE\$(^name)" "$1" ""
             ReadRegStr $2 HKCU "SOFTWARE\$(^name)" "$1"

             MessageBox mb_yesno|mb_iconquestion "Value Name: $1 $\r$\n\
             Delete value?" idno loop

             DeleteRegValue HKCU "SOFTWARE\$(^name)" "$1"
             IntOp $0 $0 - 1
             goto loop

        done:
             StrCpy $0 0
             EnumRegValue $1 HKCU "SOFTWARE\$(^name)" $0
             StrCmp $1 "" empty
             StrCpy $0 0
             StrCpy $3 ""

        start:
              EnumRegValue $1 HKCU "SOFTWARE\$(^name)" $0
              StrCmp $1 "" values
              IntOp $0 $0 + 1
              ReadRegStr $2 HKCU "SOFTWARE\$(^name)" $1
              StrCpy $3 "$3$1=$2$\r$\n" ${NSIS_MAX_STRLEN}
              goto start

        values:
               MessageBox mb_yesno|mb_iconexclamation "Remaining values:$\r$\n$3 $\r$\n\
               Delete registry key anyway?" idno end
               DeleteRegKey HKCU "SOFTWARE\$(^name)"
               goto end

        empty:
        MessageBox mb_yesno|mb_iconexclamation "Registry Key is empty$\r$\n\
        Delete the key now?" idno end
        DeleteRegKey HKCU "SOFTWARE\$(^name)"

end:
    Pop $0
    Pop $1
    Pop $2
    Pop $3
    Pop $4
    Pop $5
    Pop $6
    Pop $7
    Pop $8
functionend


   #################################################################################
   #         This function builds the custom.ini at runtime rather than to         #
   #         add it as file at compile time and then extract it at runtime.        #
   #################################################################################

Function WriteIni
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Settings' 'NumFields' '8'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Type' 'GroupBox'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Left' '20'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Top' '10'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Right' '-21'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Bottom' '-18'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Text' 'User Details'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Type' 'Text'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Left' '60'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Top' '26'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Right' '-61'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Bottom' '40'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'State' 'user name here'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Type' 'Text'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Left' '60'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Top' '50'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Right' '-61'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Bottom' '64'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'State' 'company name here'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Type' 'Label'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Left' '58'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Top' '76'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Right' '-25'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Bottom' '88'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Text' \
         'plz enter your serial number in the boxes below.'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Type' 'Password'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Left' '80'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Top' '88'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Right' '104'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Bottom' '100'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'State' ''
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'MaxLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'MinLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Flags' 'GROUP|ONLY_NUMBERS'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'ValidateText' \
         'Serial number syntax error.\r\n Type 4 digits (0 - 9) in first field.'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Type' 'Password'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Left' '108'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Top' '88'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Right' '132'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Bottom' '100'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'State' ''
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'MaxLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'MinLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Flags' 'ONLY_NUMBERS'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'ValidateText' \
         'Serial number syntax error.\r\n Type 4 digits (0 - 9) in second field.'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Type' 'Password'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Left' '136'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Top' '88'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Right' '160'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Bottom' '100'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'State' ''
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'MaxLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'MinLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Flags' 'ONLY_NUMBERS'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'ValidateText' \
         'Serial number syntax error.\r\n Type 4 digits (0 - 9) in third field.'

         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Type' 'Password'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Left' '164'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Top' '88'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Right' '188'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Bottom' '100'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'State' ''
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'MaxLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'MinLen' '4'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Flags' 'ONLY_NUMBERS'
         WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'ValidateText' \
         'Serial number syntax error.\r\n Type 4 digits (0 - 9) in fourth field.'
Functionend