nsParser NSIS Plugin
Native C plugin for NSIS to extract values from large files, bypassing the NSIS_MAX_STRLEN limit (1 KB).
Problem Solved
NSIS's built-in string functions are limited to NSIS_MAX_STRLEN (typically 1024 bytes). When reading configuration files, JSON, or INI files larger than this limit, the string is silently truncated.
nsParser solves this by reading only the specific value requested, without loading the entire file into a string.
Build
Prerequisites
- Visual Studio 2022 (with "Desktop development with C++" workload)
- Python 3.x
Build script
python build_plugin.py
Build options
python build_plugin.py --configs x86-unicode # Single architecture (x86-ansi|x86-unicode|x64-unicode|all)
python build_plugin.py --vs-version 2026 # Specific toolset (auto|2022|2026)
python build_plugin.py --clean # Clean dist/ before build
python build_plugin.py --rebuild # Force full rebuild
python build_plugin.py --verbosity detailed # Extended MSBuild output
python build_plugin.py --install-dir "C:\NSIS\Plugins" # Copy to additional NSIS directory
python build_plugin.py --list # List available configurations
Usage in NSIS
!addplugindir "plugins\x86-unicode"
Section
nsParser::Extract "C:\config.ini" "key" $0
DetailPrint "Value: $0"
SectionEnd
API
nsParser::Extract
nsParser::Extract "FilePath" "Key" $OutputVar
Parameters:
| Parameter | Description |
|---|---|
FilePath |
Full path to the file to parse |
Key |
Key to search for (e.g. version, path) |
$OutputVar |
Variable to receive the extracted value |
Search logic:
The plugin searches for the pattern Key=Value or Key = Value in the file. If found, returns the value trimmed of leading/trailing whitespace. If not found, returns an empty string.
Buffer:
The value is extracted with a buffer of 32768 bytes, well beyond the NSIS_MAX_STRLEN limit. This allows reading long paths and embedded JSON strings.
Advantages
- No dependency on the NSIS string size limit
- Reads only the requested value (efficient on large files)
- Handles
key=valueandkey = valueformats - Thread-safe (no global state)
- Small binary size
Technical Implementation
The plugin is written in C and uses a direct file reader via ReadFile (Win32). The algorithm:
- Opens the file with
CreateFile(read-only, shared) - Reads the file in 8192-byte blocks
- Scans each block for the pattern
Key=orKey = - Extracts the value up to the first newline (
\nor\r\n) - Trims leading/trailing whitespace
- Returns the result via the NSIS stack
Visual Studio configurations
| Configuration | Architecture | Output |
|---|---|---|
| Release-x86-ansi | x86 ANSI | plugins/x86-ansi/nsParser.dll |
| Release-x86-unicode | x86 Unicode | plugins/x86-unicode/nsParser.dll |
| Release-amd64-unicode | x64 Unicode | plugins/amd64-unicode/nsParser.dll |
File Structure
nsParser/
build_plugin.py # Unified build script
src/
nsParser.c # Plugin source code
nsParser.vcxproj # VS2022 project (x86-ansi, x86-unicode, amd64-unicode)
nsParser.sln # VS2022 solution
dist/
x86-ansi/
x86-unicode/
amd64-unicode/
See README_IT.md for the Italian version.