summaryrefslogtreecommitdiffstats
path: root/install-win32/ExtractAuxFile.nsi
diff options
context:
space:
mode:
Diffstat (limited to 'install-win32/ExtractAuxFile.nsi')
-rw-r--r--install-win32/ExtractAuxFile.nsi117
1 files changed, 117 insertions, 0 deletions
diff --git a/install-win32/ExtractAuxFile.nsi b/install-win32/ExtractAuxFile.nsi
new file mode 100644
index 0000000..ffb7b34
--- /dev/null
+++ b/install-win32/ExtractAuxFile.nsi
@@ -0,0 +1,117 @@
+; ExtractAuxFile
+; Copies a text file appended to the end of the installer EXE
+; to a caller-specified output file.
+; Inputs:
+; output_filename (string) -- the output filename
+; Outputs:
+; status (int) -- 0 on success, > 0 on failure
+
+Function ExtractAuxFile
+ Exch $R1 ; output filename argument
+ ; locals
+ Push $R0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+
+ ClearErrors
+
+ ; $R0 = installer filename
+ System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
+
+ ; $1 = open (installer_exe) for read
+ FileOpen $1 $R0 r
+ IfErrors openin_err
+
+ ; seek to EOF - 8 (start of 8-byte trailer)
+ ; $3 = seekpos
+ IntOp $2 0 - 8
+ FileSeek $1 $2 END $3
+
+ ; $4 = -(content_length(auxfile) + 8)
+ ; seek position from end of file to beginning of content
+ FileReadByte $1 $4
+ FileReadByte $1 $5
+ IfErrors readlen_err
+ IntOp $5 $5 << 8
+ IntOp $4 $4 + $5
+ IntOp $4 $4 + 8
+ IntOp $4 0 - $4
+
+ ; verify magic sequence 0xae, 0xb7, 0x03, 0x69, 0x42, 0x11
+ FileReadByte $1 $5
+ IntCmp $5 0xae 0 magic_err magic_err
+ FileReadByte $1 $5
+ IntCmp $5 0xb7 0 magic_err magic_err
+ FileReadByte $1 $5
+ IntCmp $5 0x03 0 magic_err magic_err
+ FileReadByte $1 $5
+ IntCmp $5 0x69 0 magic_err magic_err
+ FileReadByte $1 $5
+ IntCmp $5 0x42 0 magic_err magic_err
+ FileReadByte $1 $5
+ IntCmp $5 0x11 0 magic_err magic_err
+ IfErrors magic_err
+
+ ; seek to start of auxfile data
+ FileSeek $1 $4 END
+
+ ; $2 = open (output_filename) for write
+ FileOpen $2 $R1 w
+ IfErrors openout_err
+
+loop:
+ ; check if we are finished
+ FileSeek $1 0 CUR $5
+ IntCmp $5 $3 success 0 overshot_err
+
+ ; copy next line from .exe to output file
+ FileRead $1 $5
+ IfErrors read_err
+ FileWrite $2 $5
+ IfErrors write_err
+ goto loop
+
+success:
+ IntOp $R1 0 + 0
+ goto fin
+
+openin_err:
+ IntOp $R1 1 + 0
+ goto fin
+
+openout_err:
+ IntOp $R1 2 + 0
+ goto fin
+
+readlen_err:
+ IntOp $R1 3 + 0
+ goto fin
+
+overshot_err:
+ IntOp $R1 4 + 0
+ goto fin
+
+read_err:
+ IntOp $R1 5 + 0
+ goto fin
+
+write_err:
+ IntOp $R1 6 + 0
+ goto fin
+
+magic_err:
+ IntOp $R1 7 + 0
+ goto fin
+
+fin:
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $R0
+ Exch $R1
+FunctionEnd