PDA

View Full Version : NSIS 1.1z up -- oops, I'm out of letters


justin
28th March 2001, 19:55
OK I put 1.1z up on http://www.firehose.net/free/nsis/
(which apparently will finally get pushed to nullsoft.com).

Since I'm out of letters, I'm going to make the next version (which will soley fix bugs, no new features) 1.2.0. Yay.

For fun, here's a list of everything (in reverse-chronological order) that I've done to NSIS in the last month. The end result is a lot more functionality, and a lot less overhead (the current exe header size is 32kb, whereas it used to be about 40kb).



Moved licensedata into string table out of datablock
Removed NSIS_CONFIG_CREATESHORTCUT config option (it really didn't add much)
Additional exehead size optimizations (making it use global variables more instead of passing them around and copying them).
Made DeleteOnReboot code check for duplicates in wininit.ini on win9x.
Enlarged resources a bit to make more room for shit (dynamic sized resources would be nice, hmm)
Made install info+string table etc in datablock.
Made uninstall info that is written to uninstaller compressed now.
This makes for slightly smaller installers, typically.
Made install types and section names stored in string table (less overhead, less stupid static string length limitations)
Raised the maximum number of install types to 8 from 4 and made it a keen #define (who cares?)
Added DeleteFileOnReboot function to util.c
Added /ONREBOOT switch to Delete instruction
Made uninstaller delete itself after reboot
Updated CRC checking code for size and speed (no more seeking)
Updated integrity checks to check for correct length (even when CRC checking is off)
Made minimum post-header length of 516 bytes when CRC is enabled (in order to simplify the exehead).
Made cancel selected when the install is aborted.
Fixed a few potential bugs in libc
Made OLE/COM initialization better (no more open and close and open and close)
Reduced size even more (zlib table optimizations and such! - decompression is slower now though, but the header is 35840 bytes with all features on)
Removed NSIS_CONFIG_COPYFILES config option (it's small anyway)
Made installation logging off by default (default header size is 31744 bytes, yay!)
Updated uninstall system to not litter up your temporary directory with tons of nsu* files (it now only creates 26 possible files, and cleans up unused ones on uninstall)
Reduced size of header by 1k (40960 bytes now with all features turned on)
Cleaned up a lot of code/errors/etc in exehead
Cleaned up error/warning handling in compiler
Added !error and !warning
Added DeleteINISec and DeleteINIStr commands
Added jump:X mode to FindWindow
Made Nop instruction also work as Jump, added Jump command.
Made section adding more strict (you have to create all sections, none by default to make it less prone to bugs)
Removed a lot of section related bugs.
Added Abort command.
Added SetDetailsView.
Added FindWindowByTitle (uses FindWindow but with small diffs)
Fixed bad DeleteRegKey bug that was introduced in 1.1o.
Fixed a few component selector bugs. Seems to be fine now.
Added SectionDivider command and divider sections and all that jazz.
Added $\r and $\n variables (for carriage return and newline, respectively)
Made install.log write \r\n instead of \n.
Optimized header size more (it is still the same size, even though stuff was added)
Added optional /r switch for RMDir (removes recursive directories and deletes all files (read-only or not) from them.
Made Delete delete read-only files.
Massive changes to the way strings are handled. Strings are no longer in the data block, but instead in their own string table which is compressed with the header and stored in memory by the installer stub. This is a) faster, and b) allows us to compress the strings. Also, the static strings that the installer needs are no longer stored directly, instead "pointers" to them in the string table are stored (meaning many of the static length restrictions are gone). Doing this also simplifies much of exec.c, making the installer smaller. TODO: make all of the user messages configurable (maybe). Overall these changes produce installers that are about 1-2k smaller.
optimized datablock_optimize
Changed the format of the output statistics.
Broke stuff (see above)
Added IfFileExists instruction for branching based on file/directory presence (takes wildcards, too)
Changed ExecuteEntry so that branching instructions (such as MessageBox and IfFileExists) can go back if necessary (oops - negative ones were broken before.)
Made add_data_compress and GetCompressedDataFromDataBlock use a slightly more efficient form (1 byte per block is saved, maximum file size is now 2gb instead of 4gb)
Created BIGTEST.NSI which tests/demonstrates nearly all of the functionality of NSIS.
Added Nop instruction
Made it possible to put comments at the end of the line (using ; or # to deliminate it) .. if you need a parameter to start with ; or #, use quotes.
Fixed GetCompressedDataFromDataBlockToMemory() (this was causing licenses to be truncated).
Made MessageBox and FindWindow strings able to use variables
Made last two parameters of MessageBox optional
Cleaned up some resources (maintained 41.5k header size even though we added some instructions etc)
Made it so that if the first section starts with - (or is ""), it is not shown in the section list.
Made it so that sections beginning with a - are treated like empty sections (and are required, and not shown).
Made SectionIn command additive. i.e. SectionIn 1\nSectionIn 2 adds the section to types 1 and 2.
Made CreateShortCut more configurable (hotkey and showmode).
Made integer parser take hexadecimal and octal numbers in addition to decimal.
Added new examples (example1.nsi, example2.nsi, waplugin.nsi, and viewhtml.nsi)
Reduced size of header 1.5k by removing unused portions of zlib.
Improved the InstlalDirRegKey logic to handle quotes in the strings better.
Removed winamp hack checking (use InstallDirRegKey to find the Winamp directory, in addition to $PROGRAMFILES\Winamp) ex: InstallDirRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString"
Got rid of shell.cpp, rewrote CreateShortCut in C (using lpVtbl) and included it in util.c, and inlined Shell_Free in ui.c
Removed time clipping on the Sleep command.
Made compiler give warnings for certain instances that should not be fatal but should be fixed (i.e. combining LicenseData and SilentInstall)
Made the install info header compressable (typically saves a few kb)
Made the uninstall data compressable (typically saves ~1kb)
Prettied up the output of statistics
Made the space required/available displays show KB, MB, or GB.
Made both exehead and compiler use the same zlib directory.
made nsisconf.nsi included if available (lets you configure defaults)
added PackEXEHeader command to let you use UPX or Petite or any other packer on the header.
removed one extra resource from exehead to shrink installer slightly.
changed compression system to do one big deflate (should be slightly more efficient)
added SetDatablockOptimize command and made it off by default (SLOW! :)
made compiler print more info (compression bytes saved, etc)
fixed silentinstall uninstall bug


Love,

Justin

c2R
29th March 2001, 00:30
Thanks Justin. Thats a lot of work for just one month's worth!

What I do in programs I write for work is to use a numbering system without letters - thus getting around the problem of only 26 bugfix releases... :)

Regards.

Thor
29th March 2001, 14:47
Cool beans Justin ! Keep it up! :D

Question :
you used to have this little list of todo's for "future 1.1 version" ... It's no longer there now ...
Have all those features (like DLL versions checking) been added ? Or are you still planning to do that for 1.2 releases ?

PabUK
29th March 2001, 22:43
Love the constant updating!

RookieKiwi
31st March 2001, 11:24
Greetings from New Zealand!

I just love the new installer, great work Justin!

Has anybody else had problems running on Win98SE?
It installs fine, then exits with a "illegal operation" error.

I tried to activate logging via the shift key, but this no longer works. Am I missing something?

It all works fine when I compile with version 1.1j. Only problem is, 1.1j doesn't have the nice new "ifnewer" overwrite option. :-)

Anybody got any ideas?

TIA

Andrew

PabUK
31st March 2001, 11:55
I have a problem like this too. Since a few version back the installer crashes on Win ME at the end, so I had to switch back to 1.1s. Maybe there is something wrong with out install scripts?

RookieKiwi
1st April 2001, 00:27
After a bit more investigation, the "illegal operation" only occurs if the RegDLL command is used in the script. It works fine on Win2K Pro, but not on Win9x or ME.

I've just confirmed that version 1.2beta also has this problem. I'll try some earlier versions and see if I can find when the problem was introduced.

PabUK
1st April 2001, 00:42
If you find a fix or workaround let me know so I can upgrade to these newer versions!

RookieKiwi
1st April 2001, 06:10
This seems to work fine for me...

IfFileExists "$SYSDIR\RegSvr32.exe" 0 2
ExecWait '"$SYSDIR\RegSvr32.exe /s $SYSDIR\vsStr7.ocx"'
Sleep 500

Since the $SYSDIR is where RegSvr32 is located it works on NT/2000 and Win9x. The /s is for silent registration with no popups.

Cheers

Andrew

PabUK
1st April 2001, 12:58
Thanks i'll try that out! Any feedback from Justin on this issue yet?

RookieKiwi
2nd April 2001, 06:33
Confirming the RegDLL/Win9x problem is now fixed with version 1.2!

Thanks Justin, you're a champ!

PabUK
2nd April 2001, 12:40
Just to confirm that it has fixed the problem for me too!

Thanks a lot Justin!