From c98a0d37d989de6edfe870c301918f28e622f8fd Mon Sep 17 00:00:00 2001 From: Simone Date: Wed, 29 Apr 2026 14:04:59 +0200 Subject: [PATCH] chore: initial commit (extracted from Launchers monorepo) Plugin: nsShellExecAsUser v1.0.0 Architectures: x86-ansi, x86-unicode, amd64-unicode License: zlib --- .editorconfig | 24 + .gitattributes | 52 ++ .github/ISSUE_TEMPLATE/bug_report.yml | 76 +++ .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/feature_request.yml | 32 + .github/PULL_REQUEST_TEMPLATE.md | 31 + .github/workflows/build.yml | 63 ++ .github/workflows/release.yml | 99 +++ .gitignore | 63 ++ CHANGELOG.md | 19 + CONTRIBUTING.md | 137 ++++ LICENSE | 21 + README.md | 100 +++ SECURITY.md | 40 ++ VERSION | 1 + build_plugin.py | 158 +++++ dist/amd64-unicode/ShellExecAsUser.dll | Bin 0 -> 113152 bytes dist/x86-ansi/ShellExecAsUser.dll | Bin 0 -> 93184 bytes dist/x86-unicode/ShellExecAsUser.dll | Bin 0 -> 92672 bytes docs/ShellExecAsUser.txt | 20 + examples/example.nsi | 19 + src/ShellExecAsUser.cpp | 272 ++++++++ src/ShellExecAsUser.sln | 32 + src/ShellExecAsUser.vcxproj | 394 ++++++++++++ src/ShellExecAsUser.vcxproj.filters | 12 + src/VistaTools.cxx | 713 +++++++++++++++++++++ src/api.h | 83 +++ src/nsis_tchar.h | 229 +++++++ src/pluginapi.cpp | 296 +++++++++ src/pluginapi.h | 115 ++++ 30 files changed, 3109 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 VERSION create mode 100644 build_plugin.py create mode 100644 dist/amd64-unicode/ShellExecAsUser.dll create mode 100644 dist/x86-ansi/ShellExecAsUser.dll create mode 100644 dist/x86-unicode/ShellExecAsUser.dll create mode 100644 docs/ShellExecAsUser.txt create mode 100644 examples/example.nsi create mode 100644 src/ShellExecAsUser.cpp create mode 100644 src/ShellExecAsUser.sln create mode 100644 src/ShellExecAsUser.vcxproj create mode 100644 src/ShellExecAsUser.vcxproj.filters create mode 100644 src/VistaTools.cxx create mode 100644 src/api.h create mode 100644 src/nsis_tchar.h create mode 100644 src/pluginapi.cpp create mode 100644 src/pluginapi.h diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..55629c5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.{yml,yaml,json}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.{cmd,bat,ps1}] +end_of_line = crlf + +[*.{nsi,nsh,sln,vcxproj,filters}] +end_of_line = crlf + +[Makefile] +indent_style = tab diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..20b175b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,52 @@ +# Normalizzazione line endings +* text=auto eol=lf + +# File di codice +*.c text eol=lf +*.cpp text eol=lf +*.h text eol=lf +*.hpp text eol=lf +*.def text eol=lf +*.py text eol=lf +*.ps1 text eol=lf +*.cmd text eol=crlf +*.bat text eol=crlf + +# NSIS +*.nsi text eol=crlf +*.nsh text eol=crlf + +# Markdown / docs / config +*.md text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.json text eol=lf +*.txt text eol=lf +*.xml text eol=lf + +# Visual Studio (CRLF richiesto) +*.sln text eol=crlf +*.vcxproj text eol=crlf merge=union +*.filters text eol=crlf merge=union +*.rc binary +*.rc2 binary + +# Binari +*.dll binary +*.exe binary +*.lib binary +*.obj binary +*.pdb binary +*.zip binary +*.7z binary +*.png binary +*.ico binary +*.gif binary +*.jpg binary +*.jpeg binary +*.bmp binary +*.pdf binary + +# Linguistic detection (GitHub Linguist / Gitea analogo) +*.nsi linguist-language=NSIS +*.nsh linguist-language=NSIS diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..7599f2a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,76 @@ +name: Bug Report +description: Segnala un bug riproducibile +title: "[Bug]: " +labels: ["bug", "triage"] +body: + - type: markdown + attributes: + value: | + Grazie per la segnalazione. Compila i campi sotto per aiutarci a riprodurre il problema. + + - type: input + id: plugin-version + attributes: + label: Versione plugin + description: Contenuto del file VERSION o tag della release scaricata + placeholder: "1.6.0" + validations: + required: true + + - type: dropdown + id: architecture + attributes: + label: Architettura DLL usata + options: + - x86-ansi + - x86-unicode + - amd64-unicode + - non so / multiple + validations: + required: true + + - type: input + id: nsis-version + attributes: + label: Versione NSIS + placeholder: "3.10" + validations: + required: true + + - type: input + id: os + attributes: + label: Sistema operativo + placeholder: "Windows 11 23H2 x64" + validations: + required: true + + - type: textarea + id: repro + attributes: + label: Passi per riprodurre + description: Script .nsi minimale che riproduce il problema + render: nsis + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Comportamento atteso + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Comportamento osservato + description: Includi messaggi di errore esatti, output del log NSIS, screenshot + validations: + required: true + + - type: textarea + id: additional + attributes: + label: Note aggiuntive + description: Qualunque altra informazione utile (workaround tentati, ecc.) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..10d50a4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Domande generali + url: https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/issues?type=question + about: Per domande di utilizzo che non sono bug, apri una issue con label "question" + - name: Security + url: https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/security/advisories/new + about: Segnala vulnerabilità di security in privato (non aprire issue pubbliche) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..fae6d8d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,32 @@ +name: Feature Request +description: Suggerisci una nuova funzionalità o miglioramento +title: "[Feature]: " +labels: ["enhancement"] +body: + - type: textarea + id: problem + attributes: + label: Problema / Caso d'uso + description: Quale problema vorresti risolvere? Quale workflow vuoi abilitare? + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposta + description: Come dovrebbe funzionare? Includi esempio di API/uso negli script NSIS se possibile. + render: nsis + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternative considerate + description: Altri approcci che hai valutato e perché sono stati scartati + + - type: textarea + id: additional + attributes: + label: Note aggiuntive diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..3758b50 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Descrizione + + + +## Tipo di Modifica + +- [ ] Bug fix (modifica non breaking che risolve un problema) +- [ ] Feature (modifica non breaking che aggiunge funzionalità) +- [ ] Breaking change (fix o feature che rompe la compatibilità) +- [ ] Documentazione +- [ ] Build / CI + +## Architetture Testate + +- [ ] `x86-ansi` +- [ ] `x86-unicode` +- [ ] `amd64-unicode` + +## Checklist + +- [ ] Build completa senza warning: `python build_plugin.py` +- [ ] CHANGELOG.md aggiornato (sezione `[Unreleased]`) +- [ ] README / docs aggiornati se l'API è cambiata +- [ ] Esempi aggiornati se l'API è cambiata +- [ ] Conventional Commits rispettato +- [ ] Nessun file in `dist/` o `__pycache__/` committato +- [ ] Self-review completata + +## Note Aggiuntive + + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a521284 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,63 @@ +# Build (GitHub) — pipeline CI primaria +# +# Strategia hosting: +# - Repo primario su Gitea (push iniziale) +# - Push mirror automatico Gitea -> GitHub +# - GitHub esegue TUTTA la CI (Gitea non esegue Actions) +# +# Trigger: +# - push su main (incluso quello propagato dal mirror Gitea) +# - PR aperte su GitHub +# - run manuale via UI + +name: Build + +on: + push: + branches: [main] + paths-ignore: + - '**.md' + - 'docs/**' + - 'examples/**' + pull_request: + branches: [main] + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + config: [x86-ansi, x86-unicode, x64-unicode] + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v2 + + - name: Read VERSION + id: version + shell: pwsh + run: | + $v = (Get-Content VERSION -Raw).Trim() + "version=$v" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + + - name: Build ${{ matrix.config }} + run: python build_plugin.py --config ${{ matrix.config }} --verbose + + - name: Upload DLL + uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }}-${{ steps.version.outputs.version }}-${{ matrix.config }} + path: dist/** + if-no-files-found: error + retention-days: 30 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e4cf67d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,99 @@ +# Release (GitHub) — pipeline release primaria +# +# Triggerata quando un tag v* viene propagato dal mirror Gitea. +# Costruisce gli artifact per tutte le architetture e crea la GitHub Release. + +name: Release + +on: + push: + tags: ['v*'] + workflow_dispatch: + inputs: + tag: + description: 'Tag versione (es. v1.7.0)' + required: true + +permissions: + contents: write + +jobs: + build: + runs-on: windows-latest + strategy: + fail-fast: true + matrix: + config: [x86-ansi, x86-unicode, x64-unicode] + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - uses: microsoft/setup-msbuild@v2 + + - name: Build ${{ matrix.config }} + run: python build_plugin.py --config ${{ matrix.config }} + + - name: Determine version & arch + id: meta + shell: pwsh + run: | + $tag = "${{ github.ref_name }}" + if ([string]::IsNullOrEmpty($tag) -or $tag -eq "main") { $tag = "${{ inputs.tag }}" } + $v = $tag -replace '^v','' + $map = @{ 'x86-ansi' = 'x86-ansi'; 'x86-unicode' = 'x86-unicode'; 'x64-unicode' = 'amd64-unicode' } + $dir = $map['${{ matrix.config }}'] + echo "version=$v" >> $env:GITHUB_OUTPUT + echo "tag=$tag" >> $env:GITHUB_OUTPUT + echo "dir=$dir" >> $env:GITHUB_OUTPUT + + - name: Package + shell: pwsh + run: | + $name = "${{ github.event.repository.name }}-${{ steps.meta.outputs.version }}-${{ steps.meta.outputs.dir }}" + $stage = "stage/$name" + New-Item -ItemType Directory -Force -Path $stage | Out-Null + Copy-Item "dist/${{ steps.meta.outputs.dir }}/*" $stage -Recurse + Copy-Item README.md, LICENSE, VERSION, CHANGELOG.md $stage + if (Test-Path "include") { Copy-Item "include" $stage -Recurse } + if (Test-Path "examples") { Copy-Item "examples" $stage -Recurse } + Compress-Archive -Path "$stage/*" -DestinationPath "$name.zip" -Force + + - uses: actions/upload-artifact@v4 + with: + name: pkg-${{ matrix.config }} + path: '*.zip' + + publish: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + with: + path: artifacts + merge-multiple: true + + - name: SHA256SUMS + run: | + cd artifacts + sha256sum *.zip > SHA256SUMS.txt + cat SHA256SUMS.txt + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: | + artifacts/*.zip + artifacts/SHA256SUMS.txt + generate_release_notes: true + body: | + **Repository primario**: vedi link Gitea nel README. + + Il mirror GitHub è generato automaticamente dal repo Gitea (sorgente di verità). + Per issue e PR aprire ticket sul repository primario Gitea. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c3a730 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Build output (src/ subdirs only — dist/ is tracked, contains pre-built DLLs) +bin/ +obj/ +Build/ +build/ + +# Visual Studio +*.user +*.suo +*.ncb +*.sdf +.vs/ +ipch/ +*.VC.db +*.VC.VC.opendb +*.opendb +*.aps +*.tlog +*.idb +*.pdb +*.ilk +*.exp +*.lib +*.obj + +# Python +__pycache__/ +*.pyc +*.pyo +.pytest_cache/ +*.egg-info/ +.venv/ +venv/ + +# Editor / IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +Thumbs.db +desktop.ini +.DS_Store + +# NSIS +*.nsh.bak + +# Logs +*.log +.logs/ + +# Sensitive +.env +.env.local +*.pem +*.key + +# Migration/automation scripts (temporary, contain tokens — never commit) +tools/t*.py +tools/check_*.py +tools/legacy/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f0cbdfd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog + +Tutte le modifiche rilevanti a questo progetto sono documentate in questo file. + +Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.0.0/), +e il progetto aderisce al [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [1.0.0] — 2026-04-29 + +### Added +- Prima release come repository indipendente +- Build script unificato (`build_plugin.py`) con CLI canonica +- CI/CD via GitHub Actions (mirror automatico Gitea → GitHub) +- Documentazione completa (README, CONTRIBUTING, SECURITY) + +[Unreleased]: https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/compare/v1.0.0...HEAD +[1.0.0]: https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/releases/tag/v1.0.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..04031b0 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,137 @@ +# Contribuire a nsShellExecAsUser + +Grazie per il tuo interesse a contribuire! + +> Repository primario: [https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser](https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser) +> Mirror GitHub: [https://github.com/systempal/nsis-plugin-nsshellexecasuser](https://github.com/systempal/nsis-plugin-nsshellexecasuser) (read-only — apri PR su Gitea) + +## Prerequisiti + +| Strumento | Versione | Note | +|-----------|----------|------| +| Visual Studio | 2022 / 2026 | Workload: Desktop development with C++ (toolset v143/v145) | +| Python | 3.7+ | Per `build_plugin.py` | +| Git | 2.30+ | Con supporto submoduli se applicabile | + +## Quick Start + +```powershell +git clone https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser.git +cd nsis-plugin-nsshellexecasuser +python build_plugin.py +``` + +Output in `dist/{x86-ansi,x86-unicode,amd64-unicode}/`. + +## Workflow Sviluppo + +### 1. Branch + +```powershell +git checkout -b feat/nome-feature # nuova feature +git checkout -b fix/descrizione-bug # bugfix +git checkout -b docs/aggiornamento # solo doc +git checkout -b chore/manutenzione # build, dipendenze +``` + +### 2. Commit + +Segui [Conventional Commits](https://www.conventionalcommits.org/it/v1.0.0/): + +``` +feat: aggiunge supporto per formato XYZ +fix: corregge crash su Windows 11 ARM +docs: aggiorna esempio di utilizzo +chore: aggiorna toolset MSVC +refactor: estrae logica parsing in funzione separata +test: aggiunge test per edge case +build: aggiorna script di build +ci: aggiorna workflow GitHub Actions +``` + +Breaking changes: + +``` +feat!: rinomina API Foo() in Bar() + +BREAKING CHANGE: Foo() rinominata in Bar(); aggiornare tutti i chiamanti. +``` + +### 3. Pull Request + +PR aperte verso il branch `main` su Gitea. Verifica: + +- [ ] Build completa senza warning per tutte le architetture: `python build_plugin.py` +- [ ] Esempi aggiornati se cambia l'API +- [ ] `CHANGELOG.md` aggiornato (sezione `[Unreleased]`) +- [ ] Documentazione aggiornata (README, docs/API.md se esiste) +- [ ] Conventional Commits rispettato +- [ ] Nessun file in `dist/` o `__pycache__/` committato + +## Build Script + +``` +python build_plugin.py [opzioni] +``` + +| Opzione | Default | Descrizione | +|---------|---------|-------------| +| `--config` | `all` | Architettura: `x86-ansi`, `x86-unicode`, `x64-unicode`, `all` | +| `--toolset` | `auto` | Visual Studio: `2022`, `2026`, `auto` (rileva il più recente) | +| `--jobs` | numero CPU | Thread paralleli per la build | +| `--clean` | false | Pulisce `dist/` prima di compilare | +| `--install-dir` | none | Copia DLL anche in `/{arch}/` (es. NSIS plugin folder) | +| `--verbose` | false | Output dettagliato (mostra comandi MSBuild) | + +Exit codes: +- `0` — Successo +- `1` — Errore di build +- `2` — Prerequisiti mancanti +- `3` — Argomenti invalidi + +## Release Workflow + +Le release sono automatiche via tag Git: + +```powershell +# 1. Aggiorna VERSION e CHANGELOG.md +echo "1.7.0" > VERSION +# (modifica CHANGELOG.md spostando entry da [Unreleased] a [1.7.0]) + +# 2. Commit +git add VERSION CHANGELOG.md +git commit -m "chore(release): v1.7.0" + +# 3. Tag annotato +git tag -a v1.7.0 -m "Release v1.7.0" + +# 4. Push +git push origin main +git push origin v1.7.0 +``` + +Il workflow `.github/workflows/release.yml` compilerà tutte le architetture +e creerà la release su Gitea con gli artifact ZIP allegati. Il mirror GitHub +riceverà automaticamente il tag. + +## Code Style + +- C/C++: stile coerente con il file modificato +- Python: PEP 8 (4 spazi indent, line length flessibile) +- Header file: `#include` ordinati: stdlib → Win32 → progetto +- Encoding: UTF-8 senza BOM (eccetto `.rc` che richiede UTF-16 LE) +- Line endings: LF in repo (`.gitattributes` normalizza) + +## Reporting Bug + +Apri una [issue](https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/issues/new) usando il template "Bug Report". +Includi: +- Versione plugin e architettura DLL usata +- Versione NSIS +- Sistema operativo +- Script `.nsi` minimale che riproduce il problema +- Output / errore esatto + +## Domande + +Per domande generali, apri una [issue](https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/issues) con label `question`. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bc3fdc5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +zlib License + +Copyright (c) 2026 Simone + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5f27968 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# nsShellExecAsUser NSIS Plugin + +**Versione personale modificata** + +--- + +## Descrizione Originale + +**ShellExecAsUser plug-in** + +Execute the specified program using ShellExecute. +Useful when the installer process is running with elevated privileges (UAC) but you want to launch an application as the standard logged-in user (e.g., launching the application after installation). + +## Features + +- Launches applications as the current desktop user +- Bypasses UAC elevation if the installer is running as Administrator +- Supports standard ShellExecute verbs (open, runas, print, etc.) +- Supports window show modes (SW_SHOWNORMAL, SW_HIDE, etc.) +- Win95/98/ME/NT/2000/XP/Vista/7/8/10/11 support +- NSIS UNICODE support + +## Usage + +```nsis +ShellExecAsUser::ShellExecAsUser "action" "command" "parameters" "show_mode" +``` + +**Parameters:** + +1. `action` - The verb to use (e.g., "open", "runas", "print"). Can be empty `""` for default action. +2. `command` - Path to the executable or file to open. +3. `parameters` - Command line arguments. +4. `show_mode` - Window display mode. + +**Supported Show Modes:** + +- `SW_SHOWDEFAULT` +- `SW_SHOWNORMAL` (default) +- `SW_SHOWMAXIMIZED` +- `SW_SHOWMINIMIZED` +- `SW_HIDE` + +**Working Directory:** + +The plugin uses the current NSIS output directory (`$OUTDIR`) as the working directory for the launched process. + +## Example + +```nsis +Section "Launch Application" + SetOutPath "$INSTDIR" + ShellExecAsUser::ShellExecAsUser "open" "$INSTDIR\MyApp.exe" "" "SW_SHOWNORMAL" +SectionEnd +``` + +To launch a URL in the default browser as the user: +```nsis +ShellExecAsUser::ShellExecAsUser "open" "https://example.com" "" "SW_SHOWNORMAL" +``` + +## Include file + +There is no wrapper macros file for this plugin. Call the plugin directly as shown in the usage section. + +--- + +## ⚠️ Differenze nella versione personale + +### Architetture supportate + +Il progetto supporta le configurazioni già presenti nell'originale: +- **amd64-unicode** (x64) +- **x86-ansi** +- **x86-unicode** + +### Progetto Visual Studio + +Il progetto è stato aggiornato e riorganizzato: +- `Contrib/ShellExecAsUser/ShellExecAsUser.sln` - Solution VS2022 +- `Contrib/ShellExecAsUser/ShellExecAsUser.vcxproj` - Progetto VS2022 aggiornato + +### File aggiunti + +- `build_plugin.py` - Script Python per compilare il plugin per tutte le architetture supportate. +- `nsis/` - Header NSIS inclusi per facilitare la compilazione. + +### Modifiche al Codice + +- **Rimozione Warning Deprecazione**: Sostituita la chiamata deprecata `GetVersionEx` in `VistaTools.cxx` con la moderna API `VerifyVersionInfo` per evitare warning C4996 durante la compilazione con i toolset moderni. +- **Aggiornamento Build**: Configurazione aggiornata per utilizzare il toolset **v143** (Visual Studio 2022). + +### Compilazione + +```cmd +cd nsShellExecAsUser +python build_plugin.py +``` + +I DLL vengono copiati in `plugins/{platform}/ShellExecAsUser.dll`. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..c1a4100 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,40 @@ +# Security Policy + +## Versioni Supportate + +Solo l'ultima versione minor riceve fix di security. + +| Versione | Supporto | +|----------|----------| +| Latest minor (es. 1.0.0) | ✅ | +| Versioni precedenti | ❌ | + +## Reporting di una Vulnerabilità + +**Non aprire issue pubbliche per vulnerabilità di security.** + +Per segnalare una vulnerabilità: + +1. **Preferito**: usa la funzione [Security Advisory privato](https://gitea.emulab.it/Simone/nsis-plugin-nsshellexecasuser/security/advisories/new) di Gitea +2. **Alternativa**: invia email a `security@example.com` (sostituire con email reale prima del primo release) + +Includi: +- Descrizione della vulnerabilità +- Passi per riprodurla +- Versione/i affette +- Possibile mitigazione (se nota) + +## Tempo di Risposta + +- Acknowledgment iniziale: entro 7 giorni +- Valutazione: entro 14 giorni +- Patch (se confermata): tempistiche dipendono dalla severità + +## Hardening + +Questo plugin gira con i permessi del processo NSIS chiamante (tipicamente +l'utente che esegue l'installer). Non richiede privilegi elevati per la +compilazione né per l'esecuzione, salvo dove esplicitamente documentato. + +DLL distribuite tramite Releases sono compilate da CI GitHub Actions con +toolchain pinnata. Verificare hash SHA256 pubblicati nelle release. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..3eefcb9 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.0 diff --git a/build_plugin.py b/build_plugin.py new file mode 100644 index 0000000..8174b54 --- /dev/null +++ b/build_plugin.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +""" +Build script canonico per il plugin ShellExecAsUser. + +CLI standard: vedi `python build_plugin.py --help` +""" +from __future__ import annotations + +import argparse +import io +import os +import shutil +import subprocess +import sys +from pathlib import Path + +# Ensure UTF-8 output on Windows (avoids cp1252 UnicodeEncodeError) +if sys.stdout.encoding and sys.stdout.encoding.lower() != "utf-8": + sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace") + +ROOT = Path(__file__).resolve().parent +SRC_DIR = ROOT / "src" +DIST_DIR = ROOT / "dist" +VERSION_FILE = ROOT / "VERSION" + +# Mapping CLI config -> (MSBuild Configuration, MSBuild Platform, dist subdir) +CONFIGS = { + "x86-ansi": ("Release", "Win32", "x86-ansi"), + "x86-unicode": ("Release Unicode", "Win32", "x86-unicode"), + "x64-unicode": ("Release Unicode", "x64", "amd64-unicode"), +} + +VCXPROJ = SRC_DIR / "ShellExecAsUser.vcxproj" +DLL_NAME = "ShellExecAsUser.dll" + + +def read_version() -> str: + # utf-8-sig strips BOM (\ufeff) automatically + return VERSION_FILE.read_text(encoding="utf-8-sig").strip() + + +def find_msbuild(toolset: str) -> Path: + """Localizza MSBuild via vswhere; toolset='2022', '2026', o 'auto'. + + In auto mode, tries 2022 before 2026 because most vcxproj files use + PlatformToolset v143 (VS2022) which may not be available in VS2026 build tools. + """ + pf86 = os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)") + vswhere = Path(pf86) / "Microsoft Visual Studio" / "Installer" / "vswhere.exe" + if not vswhere.exists(): + sys.exit(2) + + def _query(version_range: str | None) -> list[str]: + args = [str(vswhere), "-latest", "-products", "*", + "-requires", "Microsoft.Component.MSBuild", + "-find", r"MSBuild\**\Bin\MSBuild.exe"] + if version_range: + args += ["-version", version_range] + result = subprocess.run(args, capture_output=True, text=True) + return [ln.strip() for ln in result.stdout.splitlines() if ln.strip()] + + if toolset == "2022": + paths = _query("[17.0,18.0)") + elif toolset == "2026": + paths = _query("[18.0,19.0)") + else: # auto: prefer 2022 (v143) over 2026 (v145) + paths = _query("[17.0,18.0)") or _query("[18.0,19.0)") or _query(None) + + if not paths: + sys.exit(2) + return Path(paths[0]) + + +def build_one(msbuild: Path, config: str, platform: str, jobs: int, verbose: bool) -> bool: + cmd = [ + str(msbuild), str(VCXPROJ), + f"/p:Configuration={config}", + f"/p:Platform={platform}", + f"/m:{jobs}", + "/nologo", + "/v:" + ("normal" if verbose else "minimal"), + ] + print(f"[build] {config} | {platform}") + return subprocess.run(cmd).returncode == 0 + + +def collect_dll(config: str, platform: str, dist_subdir: str) -> Path | None: + """Trova la DLL prodotta dal vcxproj e la copia in dist//.""" + plat_dir = "" if platform == "Win32" else platform + "/" + candidates = list(SRC_DIR.glob(f"**/{plat_dir}{config}/{DLL_NAME}")) + candidates += list(ROOT.glob(f"**/{plat_dir}{config}/{DLL_NAME}")) + if not candidates: + return None + src = candidates[0] + dst_dir = DIST_DIR / dist_subdir + dst_dir.mkdir(parents=True, exist_ok=True) + dst = dst_dir / DLL_NAME + shutil.copy2(src, dst) + return dst + + +def main() -> int: + parser = argparse.ArgumentParser(description=f"Build ShellExecAsUser plugin") + parser.add_argument("--config", default="all", + choices=list(CONFIGS.keys()) + ["all"]) + parser.add_argument("--toolset", default="auto", choices=["2022", "2026", "auto"]) + parser.add_argument("--jobs", type=int, default=os.cpu_count() or 4) + parser.add_argument("--clean", action="store_true") + parser.add_argument("--install-dir", type=Path, default=None) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--version", action="store_true", + help="Mostra versione e termina") + args = parser.parse_args() + + if args.version: + print(read_version()) + return 0 + + if not VCXPROJ.exists(): + print(f"ERROR: {VCXPROJ} not found", file=sys.stderr) + return 3 + + if args.clean and DIST_DIR.exists(): + shutil.rmtree(DIST_DIR) + + msbuild = find_msbuild(args.toolset) + print(f"[info] MSBuild: {msbuild}") + print(f"[info] Version: {read_version()}") + + targets = list(CONFIGS.keys()) if args.config == "all" else [args.config] + failed = [] + for cfg_name in targets: + config, platform, subdir = CONFIGS[cfg_name] + if not build_one(msbuild, config, platform, args.jobs, args.verbose): + failed.append(cfg_name) + continue + dst = collect_dll(config, platform, subdir) + if dst is None: + print(f"ERROR: DLL not found for {cfg_name}", file=sys.stderr) + failed.append(cfg_name) + else: + print(f"[ok] {dst}") + if args.install_dir: + install_path = args.install_dir / subdir + install_path.mkdir(parents=True, exist_ok=True) + shutil.copy2(dst, install_path / DLL_NAME) + print(f"[install] {install_path / DLL_NAME}") + + if failed: + print(f"FAILED: {failed}", file=sys.stderr) + return 1 + print("[done] all targets built successfully") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/dist/amd64-unicode/ShellExecAsUser.dll b/dist/amd64-unicode/ShellExecAsUser.dll new file mode 100644 index 0000000000000000000000000000000000000000..87671cdf9c36e70d6311b36012bdbf56b55c0269 GIT binary patch literal 113152 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 W4YPW}RS>H+(2!R=WS5vSLybGbcK5v| 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 F{{ivKUE%-$ literal 0 HcmV?d00001 diff --git a/dist/x86-ansi/ShellExecAsUser.dll b/dist/x86-ansi/ShellExecAsUser.dll new file mode 100644 index 0000000000000000000000000000000000000000..c8229f1aa13919207d8b31c1e21eadb10ecf9498 GIT binary patch literal 93184 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 literal 0 HcmV?d00001 diff --git a/dist/x86-unicode/ShellExecAsUser.dll b/dist/x86-unicode/ShellExecAsUser.dll new file mode 100644 index 0000000000000000000000000000000000000000..bfcc94b879cf978f84d42f9ab52c28cd55dd1333 GIT binary patch literal 92672 zcmd?Se_&L_)i-`O*(4X(unTN3V3Z(H(I7?_gt&kSut`(`8)7zWZ30zD*Yy{LdjX#s zNP4rHoAFkj7F*j#pBIWguU36aTYm(9ZU{|+Qi$TCX~7y>suMTWAZZdb=DwdZcQ*v= z)3<+o|NEl3ckcW+b7tnuIcLtCnJxX+PAOTEBs>00Q<9qTrhf(E`OhDjHc6T|Cc z^W%O$v)Q)d_cLz^-LW})^ttsUcRb4`|f+! zZnln^SLycW(Vp#QVznS44WQ zi0{7niuy;z_gsCR=Hb(GJ!>?-lS`i|Q}ROkQHLcdRv zR@hRd%iXK)NaX33l4ee@O`IcjA?8sl_KKN!yYSa1zFi`mBuS}O^5|QNqO+)z@h?d# zzy}IZxzV@v87;F(YY>~c+9vI$K9p|x2l+N_-gG;XM4zBY6VAIT$6WPG3tb zrTHOzgl&HQx@nq+1D=6E02O7SY$U3>&5YRyIbZ6lKO&)IBHnm+to-ZuhCP@jJpt_rvcuS$Z^FP9=`^$&4h`b78|z~ z@NTU-V3+*dPbd(=y|Y0_dkWUsT%Osg2}B3&b<8St2uem;;XN!me&{sKj@ z`6a-zJ#qqJVhj3f-3Wz~)`XM&m6dvg-l{(-!DtjA?i4-*HLcxhTDC^M8W>B{7OoJRA**nA~VX^@rp#1g@&)c-8W=qu^Yaj zc3;2s;WpJ_GXs;CvdNy~`Bg*CU9BQ=9@W=+t5r>{EU62%#eR&tq+Cs77@7c%V9sBG z7&GHhbYIvs=To|wk&TjxFhTJ|twHXU&g(NH;zqMQra#oU%;pN)D?`~|pwd(NYZPy0 zM8z;U8)twK7>{HkN`H->tHU-=)Of^2!5TdRp=BD6(31&(=)BcT_M2skKn;;!iE+t7 zs{R^1{h_B&S;&Q&%ohlnnQ?!-o=wQgB9zH^BpXltHF~c0Ga0a0gg%T%awsaa4KVcA zD9q%_cvX#)sk}jv`fGFWj2v<{Or$uQ@d$md4n2xuWhOfNzVWPGk5FVRm5DcSZFn1_ zqQ5p9vBo3xWJCsKSx9R936hvWk@^zMx0%cq2!%$WCFx68gc31~siN(20_xdsLTqe0 zwP)-%HGJ$hbl#LuT?pxyJ=BMZJ)06EN7 zPc-cE<8z^(f9V!;A0K&R5@!4PN23YZBB3TfO&MQltjJl;Z~h9S{@`68b!WbdVehe*6bBF(F_qcj

V_vg5j=|F}$ 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 +#include +#include +#include +#include +#include +//#include +#include "pluginapi.h" // nsis plugin +#include +//#pragma comment(linker,"/merge:.rdata=.text") + +//VistaTools +#define NO_DLL_IMPORTS 1 +#define DONTWANT_RunNonElevated 1 +#define IMPLEMENT_VISTA_TOOLS +#include "VistaTools.cxx" +////////////////////////////////////// + +//missing in old sdk, had to replace shlwapi.lib as well +//LWSTDAPI IUnknown_QueryService(__in IUnknown* punk, __in REFGUID guidService, __in REFIID riid, __deref_out void ** ppvOut); + + +HINSTANCE g_hInstance; +HWND g_hwndParent; +HWND g_hwnd; +HANDLE g_hThread; + +typedef struct _ExecShellParams { + TCHAR action[50]; + TCHAR command[_MAX_PATH]; + TCHAR params[1024]; + TCHAR directory[_MAX_PATH]; + int iShow; +} ExecShellParams; + +UINT_PTR NSISPluginCallback(enum NSPIM Event) +{ + switch(Event) + { + case NSPIM_UNLOAD: + if (g_hThread) { + //OutputDebugString("ExecShellAsUser: NSPIM_UNLOAD wait..."); + ::PostMessage(g_hwnd, WM_USER+11, 0, 0); + ::WaitForSingleObject(g_hThread, INFINITE); + ::CloseHandle(g_hThread); + //OutputDebugString("ExecShellAsUser: NSPIM_UNLOAD"); + } + break; + } + return NULL; +} + +//http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/ +static CComQIPtr retrieveDesktop() +{ + CComPtr psw; + HRESULT hr = psw.CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_LOCAL_SERVER); + if (SUCCEEDED(hr)) + { + HWND hwnd; + CComPtr pdisp; + VARIANT vEmpty; + vEmpty.vt = VT_EMPTY; + if (S_OK == (hr = psw->FindWindowSW(&vEmpty, &vEmpty, 0x8/*SWC_DESKTOP*/, (long*)&hwnd, SWFO_NEEDDISPATCH, &pdisp))) + { + CComPtr psb; + + hr = IUnknown_QueryService(pdisp, SID_STopLevelBrowser, __uuidof(IShellBrowser), (void**) &psb); //IID_PPV_ARGS(&psb) + if (SUCCEEDED(hr)) + { + CComPtr psv; + hr = psb->QueryActiveShellView(&psv); + + CComPtr pdispBackground; + HRESULT hr = psv->GetItemObject(SVGIO_BACKGROUND, __uuidof(IDispatch), (void**) &pdispBackground); + if (SUCCEEDED(hr)) + { + if (CComQIPtr psfvd = pdispBackground) + { + CComPtr pdisp; + hr = psfvd->get_Application(&pdisp); + if (SUCCEEDED(hr)) + { + return CComQIPtr(pdisp); + } + } + } + } + } else { + TCHAR buf[100]; + wsprintf(buf, _T("ShellExecAsUser: FindWindowSW failed: %x"), hr); + OutputDebugString(buf); + } + } + return CComQIPtr(); +} + +static int getShowMode(const TCHAR* s) +{ + if (s[0] == 0) return SW_SHOWNORMAL; + const TCHAR* strModes[] = { _T("SW_SHOWDEFAULT"), _T("SW_SHOWNORMAL"), _T("SW_SHOWMAXIMIZED"), _T("SW_SHOWMINIMIZED"), _T("SW_HIDE") }; + int modes[] = { SW_SHOWDEFAULT, SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_HIDE }; + for (int i=0; icommand); + CComVariant vAction, vParams, vDir; + if (params->action[0] != 0) vAction = params->action; + if (params->params[0] != 0) vParams = params->params; + if (params->directory[0] != 0) vDir = params->directory; + CComVariant vShow; + if (params->iShow != -1) vShow = params->iShow; +//#pragma push_macro("ShellExecute") +//#undef ShellExecute + HRESULT hr = psd->ShellExecute(command, vParams, vDir, vAction, vShow); +//#pragma pop_macro("ShellExecute") + return hr == S_OK; +} + +static LRESULT WndProc(HWND hWnd, UINT uMsg,WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_CREATE: + { + void* param = ((LPCREATESTRUCT)lParam)->lpCreateParams; + ::SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)param); + break; + } + case WM_USER+10: + { + ExecShellParams* p = (ExecShellParams*)lParam; + IShellDispatch2* pSD = (IShellDispatch2*)::GetWindowLongPtr(hWnd, GWLP_USERDATA); + runCommand(pSD, p); + delete p; + break; + } + case WM_USER+11: + DestroyWindow(hWnd); + break; + case WM_DESTROY: + { + PostQuitMessage(0); + break; + } + default: + return ::DefWindowProc(hWnd,uMsg,wParam,lParam); + }; + return 0; +} + +HWND CreateMessageWindow(void* data) +{ + WNDCLASSEX wincl; + ZeroMemory(&wincl, sizeof(WNDCLASSEX)); + wincl.hInstance = g_hInstance; + wincl.lpszClassName = _T("NSIS_DESKTOP_LAUNCH_CLASS"); + wincl.lpfnWndProc = (WNDPROC)WndProc; + wincl.cbSize = sizeof (WNDCLASSEX); + + ATOM atom = RegisterClassEx (&wincl); + + return CreateWindowEx( + 0, + MAKEINTATOM(atom), + _T(""), + 0, + 0, + 0, + 0, + 0, + HWND_MESSAGE, + NULL, + wincl.hInstance, + data); + +} + +static unsigned __stdcall WorkerThreadProc(void* pParam) +{ + HANDLE hRunEvent = (HANDLE) pParam; + ::CoInitialize(NULL); + { + CComPtr pSD = retrieveDesktop(); + OutputDebugString(pSD.p ? _T("ExecShellAsUser: got desktop") : _T("ExecShellAsUser: failed to retrieve desktop!")); + if (pSD.p) g_hwnd = CreateMessageWindow(pSD.p); + SetEvent(hRunEvent); + + if (g_hwnd) { + MSG msg; + while ( GetMessage(&msg, NULL, 0, 0) > 0 ) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + ::CoUninitialize(); + OutputDebugString(_T("ExecShellAsUser: thread finished")); + return 0; +} + +#define EMPTY_TO_NULL(s) (s[0] == 0 ? NULL : s) + +extern "C" +void __declspec(dllexport) ShellExecAsUser(HWND hwndParent, int string_size, + TCHAR *variables, stack_t **stacktop, + extra_parameters *extra) +{ + static int initDone=0; + + g_hwndParent=hwndParent; + + EXDLL_INIT(); + if (initDone == 0) { + initDone=1; + extra->RegisterPluginCallback(g_hInstance, NSISPluginCallback); + if (IsVista() && IsElevated(NULL) == S_OK) { + //note: COM calls to shell interfaces have to be executed on another thread, + //otherwise I got RPC_E_CANTCALLOUT_ININPUTSYNCCALL error. + HANDLE hRunEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); //manual reset + g_hThread = (HANDLE)_beginthreadex( NULL, 0, WorkerThreadProc, hRunEvent, 0, NULL); + if (g_hThread) ::WaitForSingleObject(hRunEvent, INFINITE); + CloseHandle(hRunEvent); + OutputDebugString(_T("ExecShellAsUser: elevated process detected")); + } else { + OutputDebugString(_T("ExecShellAsUser: process is not elevated, will fallback to ShellExecute")); + } + } + + // action command [parameters] [SW_SHOWDEFAULT | SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE] + ExecShellParams execShellParams; + ExecShellParams* params = g_hwnd ? new ExecShellParams : &execShellParams; + TCHAR show[50]; + popstring(params->action); + popstring(params->command); + popstring(params->params); + popstring(show); + params->iShow = getShowMode(show); + TCHAR* dir = getuservariable(INST_OUTDIR); + + if (g_hwnd) { + if (dir) lstrcpyn(params->directory, dir, sizeof(params->directory)/sizeof(params->directory[0])); + ::PostMessage(g_hwnd, WM_USER+10, 0, (LPARAM)params); + } else { + ::ShellExecute(NULL, EMPTY_TO_NULL(params->action), params->command, EMPTY_TO_NULL(params->params), dir, params->iShow); + } +} + +BOOL APIENTRY DllMain( HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + if(ul_reason_for_call==DLL_PROCESS_ATTACH) + { + g_hInstance = (HINSTANCE) hModule; + } else if (ul_reason_for_call==DLL_PROCESS_DETACH) { + OutputDebugString(_T("ExecShellAsUser: DLL_PROCESS_DETACH")); + } + return TRUE; +} + diff --git a/src/ShellExecAsUser.sln b/src/ShellExecAsUser.sln new file mode 100644 index 0000000..9fde0fe --- /dev/null +++ b/src/ShellExecAsUser.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShellExecAsUser", "ShellExecAsUser.vcxproj", "{8384A5B1-BFFE-254C-4F8D-3C865339D9ED}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseUnicode|Win32 = ReleaseUnicode|Win32 + ReleaseUnicode|x64 = ReleaseUnicode|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Debug|Win32.ActiveCfg = Debug|Win32 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Debug|Win32.Build.0 = Debug|Win32 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Debug|x64.ActiveCfg = Debug|x64 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Debug|x64.Build.0 = Debug|x64 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Release|Win32.ActiveCfg = Release|Win32 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Release|Win32.Build.0 = Release|Win32 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Release|x64.ActiveCfg = Release|x64 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.Release|x64.Build.0 = Release|x64 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.ReleaseUnicode|Win32.ActiveCfg = ReleaseUnicode|Win32 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.ReleaseUnicode|Win32.Build.0 = ReleaseUnicode|Win32 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.ReleaseUnicode|x64.ActiveCfg = ReleaseUnicode|x64 + {8384A5B1-BFFE-254C-4F8D-3C865339D9ED}.ReleaseUnicode|x64.Build.0 = ReleaseUnicode|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/ShellExecAsUser.vcxproj b/src/ShellExecAsUser.vcxproj new file mode 100644 index 0000000..2312d0c --- /dev/null +++ b/src/ShellExecAsUser.vcxproj @@ -0,0 +1,394 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + ReleaseUnicode + Win32 + + + ReleaseUnicode + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + true + + + DynamicLibrary + false + MultiByte + true + + + DynamicLibrary + false + Unicode + true + + + DynamicLibrary + false + Unicode + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)..\..\Plugins\x86-ansi\ + $(SolutionDir)Intermediate\$(Configuration)\$(PlatformShortName)\ + false + + + $(SolutionDir)..\..\Plugins\amd64-ansi\ + $(SolutionDir)Intermediate\$(Configuration)\$(PlatformShortName)\ + false + + + false + $(SolutionDir)Intermediate\$(Configuration)\$(PlatformShortName)\ + $(SolutionDir)..\..\Plugins\x86-unicode\ + + + false + $(SolutionDir)Intermediate\$(Configuration)\$(PlatformShortName)\ + $(SolutionDir)..\..\Plugins\amd64-unicode\ + + + $(SolutionDir)..\..\Plugins\x86-ansi-debug\ + $(SolutionDir)Intermediate\$(Configuration)\$(PlatformShortName)\ + true + + + $(SolutionDir)..\..\Plugins\amd64-ansi-debug\ + $(SolutionDir)Intermediate\$(Configuration)\$(PlatformShortName)\ + true + + + + MultiThreaded + true + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;_USRDLL;SHELLEXECASUSER_EXPORTS;%(PreprocessorDefinitions) + + + nsis + true + false + $(IntDir)\$(TargetName).pch + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release\ShellExecAsUser.tlb + true + Win32 + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\ShellExecAsUser.bsc + + + true + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + %(AdditionalDependencies) + + + libc.lib + UseLinkTimeCodeGeneration + true + true + + + + + MultiThreaded + true + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;_USRDLL;SHELLEXECASUSER_EXPORTS;%(PreprocessorDefinitions) + + + nsis + true + false + $(IntDir)\$(TargetName).pch + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release\ShellExecAsUser.tlb + true + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\ShellExecAsUser.bsc + + + true + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + %(AdditionalDependencies) + + + libc.lib + UseLinkTimeCodeGeneration + true + true + + + + + MultiThreaded + true + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;_USRDLL;SHELLEXECASUSER_EXPORTS;%(PreprocessorDefinitions) + + + nsis + true + false + $(IntDir)\$(TargetName).pch + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release\ShellExecAsUser.tlb + true + Win32 + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\ShellExecAsUser.bsc + + + true + true + Windows + %(AdditionalDependencies) + + + libc.lib + UseLinkTimeCodeGeneration + $(OutDir)$(TargetName)$(TargetExt) + + + + + MultiThreaded + true + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;_USRDLL;SHELLEXECASUSER_EXPORTS;%(PreprocessorDefinitions) + + + nsis + true + false + $(IntDir)\$(TargetName).pch + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release\ShellExecAsUser.tlb + true + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\ShellExecAsUser.bsc + + + true + true + Windows + %(AdditionalDependencies) + + + libc.lib + UseLinkTimeCodeGeneration + $(OutDir)$(TargetName)$(TargetExt) + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + true + EditAndContinue + WIN32;_DEBUG;_WINDOWS;_USRDLL;SHELLEXECASUSER_EXPORTS;%(PreprocessorDefinitions) + + + EnableFastChecks + $(IntDir)\$(TargetName).pch + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug\ShellExecAsUser.tlb + true + Win32 + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\ShellExecAsUser.bsc + + + true + true + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + shlwapi.lib;%(AdditionalDependencies) + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + ProgramDatabase + WIN32;_DEBUG;_WINDOWS;_USRDLL;SHELLEXECASUSER_EXPORTS;%(PreprocessorDefinitions) + + + EnableFastChecks + $(IntDir)\$(TargetName).pch + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug\ShellExecAsUser.tlb + true + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\ShellExecAsUser.bsc + + + true + true + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + shlwapi.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ShellExecAsUser.vcxproj.filters b/src/ShellExecAsUser.vcxproj.filters new file mode 100644 index 0000000..b15542f --- /dev/null +++ b/src/ShellExecAsUser.vcxproj.filters @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/VistaTools.cxx b/src/VistaTools.cxx new file mode 100644 index 0000000..0e510b9 --- /dev/null +++ b/src/VistaTools.cxx @@ -0,0 +1,713 @@ +/////////////////////////////// +/* VistaTools.cxx - version 2.1 + +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Copyright (C) 2008. WinAbility Software Corporation. All rights reserved. + +Author: Andrei Belogortseff [ http://www.softblog.com ] + +TERMS OF USE: You are free to use this file in any way you like, +for both the commercial and non-commercial purposes, royalty-free, +AS LONG AS you agree with the warranty disclaimer above, +EXCEPT that you may not remove or modify this or any of the +preceeding paragraphs. If you make any changes, please document +them in the MODIFICATIONS section below. If the changes are of general +interest, please let us know and we will consider incorporating them in +this file, as well. + +If you use this file in your own project, an acknowledgment will be appreciated, +although it's not required. + +SUMMARY: + +This file contains several Vista-specific functions helpful when dealing with the +"elevation" features of Windows Vista. See the descriptions of the functions below +for information on what each function does and how to use it. + +This file contains the Win32 stuff only, it can be used with or without other frameworks, +such as MFC, ATL, etc. + +HOW TO USE THIS FILE: + +Make sure you have the latest Windows SDK (see msdn.microsoft.com for more information) +or this file may not compile! + +This is a "combo" file that contains both the declarations (usually placed in the .h files) +as well as the definitions (usually placed in the .cpp files) of the functions. + +To get the declarations only, include it as you would any .h file, for example: + +#include "VistaTools.cxx" + +To get both the declarations and definitions, define IMPLEMENT_VISTA_TOOLS before including the file: + +#define IMPLEMENT_VISTA_TOOLS +#include "VistaTools.cxx" + +(The above should be done once and only once per project). + +To use the function RunNonElevated, this file must be compiled into a DLL. +In such a case, define DLL_EXPORTS when compiling the DLL, +and do not define DLL_EXPORTS when compiling the projects linking to the DLL. + +If you don't need to use RunNonElevated, then this file may be a part of an EXE +project. In such a case, define DONTWANT_RunNonElevated and NO_DLL_IMPORTS to make +this file compile properly. + +NOTE: The file VistaTools.cxx can be included in the VisualStudio projects, but it should be +excluded from the build process (because its contents is compiled when it is included +in another .cpp file with IMPLEMENT_VISTA_TOOLS defined, as shown above.) + +MODIFICATIONS: + v.1.0 (2006-Dec-16) created by Andrei Belogortseff. + + v.2.0 (2007-Feb-20) deprecated RunAsStdUser(); + implemented RunNonElevated() to replace RunAsStdUser(); + added function declarations for use in a DLL project + + v.2.1 (2008-Feb-24) removed RunAsStdUser(); +*/ + +#if ( NTDDI_VERSION < NTDDI_LONGHORN ) +# error NTDDI_VERSION must be defined as NTDDI_LONGHORN or later +#endif + +#if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK) + +typedef enum _TOKEN_ELEVATION_TYPE { + TokenElevationTypeDefault = 1, + TokenElevationTypeFull, + TokenElevationTypeLimited, +} TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE; + +typedef struct _TOKEN_ELEVATION { + DWORD TokenIsElevated; +} TOKEN_ELEVATION, *PTOKEN_ELEVATION; + +enum _TOKEN_INFORMATION_CLASS___VISTA { + TokenElevationType = (TokenOrigin+1), + TokenLinkedToken, + TokenElevation, + TokenHasRestrictions, + TokenAccessInformation, + TokenVirtualizationAllowed, + TokenVirtualizationEnabled, + TokenIntegrityLevel, + TokenUIAccess, + TokenMandatoryPolicy, + TokenLogonSid, +}; + +#endif + +////////////////////////////////////////////////////////////////// +// if ASSERT was not defined already, let's define our own version, +// to use the CRT assert() + +#ifndef ASSERT +# ifdef _DEBUG +# include +# define ASSERT(x) assert( x ) +# define ASSERT_HERE assert( FALSE ) +# else// _DEBUG +# define ASSERT(x) +# define ASSERT_HERE +# endif//_DEBUG +#endif//ASSERT + +/////////////////////////////////////////////////////////////////// +// a handy macro to get the number of characters (not bytes!) +// a string buffer can hold + +#ifndef _tsizeof +# define _tsizeof( s ) (sizeof(s)/sizeof(s[0])) +#endif//_tsizeof + +/////////////////////////////////////////////////////////////// +// macros to handle the functions implemented in a DLL properly + +#ifdef DLL_EXPORTS +# define DLL_API __declspec(dllexport) +#else +# ifndef NO_DLL_IMPORTS +# define DLL_API __declspec(dllimport) +# else +# define DLL_API +# endif +#endif + +BOOL DLL_API +IsVista(); + +/* +Use IsVista() to determine whether the current process is running under Windows Vista or +(or a later version of Windows, whatever it will be) + +Return Values: + If the function succeeds, and the current version of Windows is Vista or later, + the return value is TRUE. + If the function fails, or if the current version of Windows is older than Vista + (that is, if it is Windows XP, Windows 2000, Windows Server 2003, Windows 98, etc.) + the return value is FALSE. +*/ + +#ifndef WIN64 + +BOOL DLL_API +IsWow64(); + +/* +Use IsWow64() to determine whether the current 32-bit process is running under 64-bit Windows +(Vista or XP) + +Return Values: + If the function succeeds, and the current version of Windows is x64, + the return value is TRUE. + If the function fails, or if the current version of Windows is 32-bit, + the return value is FALSE. + +While this function is not Vista specific (it works under XP as well), +we include it here to be able to prevent execution of the 32-bit code under 64-bit Windows, +when required. +*/ + +#endif//WIN64 + + +HRESULT DLL_API +GetElevationType( __out TOKEN_ELEVATION_TYPE * ptet ); + +/* +Use GetElevationType() to determine the elevation type of the current process. + +Parameters: + +ptet + [out] Pointer to a variable that receives the elevation type of the current process. + + The possible values are: + + TokenElevationTypeDefault - User is not using a "split" token. + This value indicates that either UAC is disabled, or the process is started + by a standard user (not a member of the Administrators group). + + The following two values can be returned only if both the UAC is enabled and + the user is a member of the Administrator's group (that is, the user has a "split" token): + + TokenElevationTypeFull - the process is running elevated. + + TokenElevationTypeLimited - the process is not running elevated. + +Return Values: + If the function succeeds, the return value is S_OK. + If the function fails, the return value is E_FAIL. To get extended error information, + call GetLastError(). +*/ + +HRESULT DLL_API +IsElevated( __out_opt BOOL * pbElevated = NULL ); + +/* +Use IsElevated() to determine whether the current process is elevated or not. + +Parameters: + +pbElevated + [out] [optional] Pointer to a BOOL variable that, if non-NULL, receives the result. + + The possible values are: + + TRUE - the current process is elevated. + This value indicates that either UAC is enabled, and the process was elevated by + the administrator, or that UAC is disabled and the process was started by a user + who is a member of the Administrators group. + + FALSE - the current process is not elevated (limited). + This value indicates that either UAC is enabled, and the process was started normally, + without the elevation, or that UAC is disabled and the process was started by a standard user. + +Return Values + If the function succeeds, and the current process is elevated, the return value is S_OK. + If the function succeeds, and the current process is not elevated, the return value is S_FALSE. + If the function fails, the return value is E_FAIL. To get extended error information, + call GetLastError(). +*/ + +BOOL DLL_API +RunElevated( + __in HWND hwnd, + __in LPCTSTR pszPath, + __in_opt LPCTSTR pszParameters = NULL, + __in_opt LPCTSTR pszDirectory = NULL ); + +/* +Use RunElevated() to start an elevated process. This function calls ShellExecEx() with the verb "runas" +to start the elevated process. + +Parameters: + +hwnd + [in] Window handle to any message boxes that the system might produce while executing this function. + +pszPath + [in] Address of a null-terminated string that specifies the name of the executable file that + should be used to start the process. + +pszParameters + [in] [optional] Address of a null-terminated string that contains the command-line parameters for the process. + If NULL, no parameters are passed to the process. + +pszDirectory + [in] [optional] Address of a null-terminated string that specifies the name of the working directory. + If NULL, the current directory is used as the working directory. . + +Return Values + If the function succeeds, the return value is TRUE. + If the function fails, the return value is FALSE. To get extended error information, + call GetLastError(). + +NOTE: This function will start a process elevated no matter which attribute (asInvoker, +highestAvailable, or requireAdministrator) is specified in its manifest, and even if +there is no such attribute at all. +*/ + +#ifndef DONTWANT_RunNonElevated + +#ifdef NO_DLL_IMPORTS +# error RunNonElevated must be used in a DLL project! +#endif//NO_DLL_IMPORTS + + +BOOL DLL_API +RunNonElevated( + __in HWND hwnd, + __in LPCTSTR pszPath, + __in_opt LPCTSTR pszParameters = NULL, + __in_opt LPCTSTR pszDirectory = NULL ); + +/* +Use RunNonElevated() to start a non-elevated process. If the current process is not elevated, +it calls ShellExecuteEx() to start the new process. If the current process is elevated, +it injects itself into the (non-elevated) shell process, and starts a non-elevated process from there. + +Parameters: + +hwnd + [in] Window handle to any message boxes that the system might produce while executing this function. + +pszPath + [in] Address of a null-terminated string that specifies the executable file that + should be used to start the process. + +pszParameters + [in] [optional] Address of a null-terminated string that contains the command-line parameters for + the process. If NULL, no parameters are passed to the process. + +pszDirectory + [in] [optional] Address of a null-terminated string that specifies the name of the working directory. + If NULL, the current directory is used as the working directory. . + +Return Values + If the function succeeds, the return value is TRUE. + If the function fails, the return value is FALSE. To get extended error information, + call GetLastError(). + +NOTE: For this function to work, the application must be marked with the asInvoker or +highestAvailable attributes in its manifest. If the executable to be started is marked +as requireAdministrator, it will be started elevated! +*/ +#endif //DONTWANT_RunNonElevated + +////////////////////////////////////////////////////////// +// MyShellExec is just a wrapper around a call to ShellExecuteEx, +// to be able to specify the verb easily. + +BOOL DLL_API +MyShellExec( HWND hwnd, + LPCTSTR pszVerb, + LPCTSTR pszPath, + LPCTSTR pszParameters = NULL, + int nShow = SW_SHOWNORMAL); + + +#ifdef IMPLEMENT_VISTA_TOOLS + +////////////////////////////////////////////////////////// +// MyShellExec is just a wrapper around a call to ShellExecuteEx, +// to be able to specify the verb easily. + +/* +BOOL +MyShellExec( HWND hwnd, + LPCTSTR pszVerb, + LPCTSTR pszPath, + LPCTSTR pszParameters, // = NULL, + int nShow) +{ + SHELLEXECUTEINFO shex; + + memset( &shex, 0, sizeof( shex) ); + + shex.cbSize = sizeof( SHELLEXECUTEINFO ); + shex.fMask = 0; + shex.hwnd = hwnd; + shex.lpVerb = pszVerb; + shex.lpFile = pszPath; + shex.lpParameters = pszParameters; + shex.lpDirectory = NULL; + shex.nShow = nShow; + + return ::ShellExecuteEx( &shex ); +} +*/ + +BOOL IsVista() +{ + OSVERSIONINFOEX osver; + DWORDLONG dwlConditionMask = 0; + int op = VER_GREATER_EQUAL; + + ZeroMemory(&osver, sizeof(OSVERSIONINFOEX)); + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + osver.dwMajorVersion = 6; + osver.dwMinorVersion = 0; + osver.dwPlatformId = VER_PLATFORM_WIN32_NT; + + VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op); + VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op); + VER_SET_CONDITION(dwlConditionMask, VER_PLATFORMID, VER_EQUAL); + + return VerifyVersionInfo(&osver, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, dwlConditionMask); +} + +#ifndef WIN64 // we need this when compiling 32-bit code only + +typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess,PBOOL Wow64Process); + +LPFN_ISWOW64PROCESS fnIsWow64Process = + (LPFN_ISWOW64PROCESS)::GetProcAddress( ::GetModuleHandle(_T("kernel32")),"IsWow64Process"); + +BOOL +IsWow64() +{ + BOOL bIsWow64 = FALSE; + + if (NULL != fnIsWow64Process) + { + if ( !fnIsWow64Process( ::GetCurrentProcess(),&bIsWow64) ) + { + ASSERT_HERE; + } + } + + return bIsWow64; +} + +#endif//WIN64 + +HRESULT +GetElevationType( __out TOKEN_ELEVATION_TYPE * ptet ) +{ + ASSERT( IsVista() ); + ASSERT( ptet ); + + HRESULT hResult = E_FAIL; // assume an error occured + HANDLE hToken = NULL; + + if ( !::OpenProcessToken( + ::GetCurrentProcess(), + TOKEN_QUERY, + &hToken ) ) + { + ASSERT_HERE; + return hResult; + } + + DWORD dwReturnLength = 0; + + if ( !::GetTokenInformation( + hToken, + (_TOKEN_INFORMATION_CLASS)TokenElevationType, + ptet, + sizeof( *ptet ), + &dwReturnLength ) ) + { + ASSERT_HERE; + } + else + { + ASSERT( dwReturnLength == sizeof( *ptet ) ); + hResult = S_OK; + } + + ::CloseHandle( hToken ); + + return hResult; +} + +HRESULT +IsElevated( __out_opt BOOL * pbElevated ) //= NULL ) +{ + ASSERT( IsVista() ); + + HRESULT hResult = E_FAIL; // assume an error occured + HANDLE hToken = NULL; + + if ( !::OpenProcessToken( + ::GetCurrentProcess(), + TOKEN_QUERY, + &hToken ) ) + { + ASSERT_HERE; + return hResult; + } + + TOKEN_ELEVATION te = { 0 }; + DWORD dwReturnLength = 0; + + if ( !::GetTokenInformation( + hToken, + (_TOKEN_INFORMATION_CLASS)TokenElevation, + &te, + sizeof( te ), + &dwReturnLength ) ) + { + ASSERT_HERE; + } + else + { + ASSERT( dwReturnLength == sizeof( te ) ); + + hResult = te.TokenIsElevated ? S_OK : S_FALSE; + + if ( pbElevated) + *pbElevated = (te.TokenIsElevated != 0); + } + + ::CloseHandle( hToken ); + + return hResult; +} + +//////////////////////////////// +// RunElevated simply calls ShellExecuteEx with the verb "runas" to start the elevated process. +// I wish there was a just as easy way to start a non-elevated process, as well. +/* +BOOL +RunElevated( + __in HWND hwnd, + __in LPCTSTR pszPath, + __in_opt LPCTSTR pszParameters, // = NULL, + __in_opt LPCTSTR pszDirectory ) // = NULL ); +{ + return MyShellExec( hwnd, _T("runas"), pszPath, pszParameters ); +} +*/ + +#ifndef DONTWANT_RunNonElevated +/////////////////////////////////////// +// RunNonElevated() implementation + +/////////////////////////////////////////////////// +// The shared data, to be able to share +// data between ours and the shell proceses + +#pragma section( "ve_shared", read, write, shared ) + +__declspec(allocate("ve_shared")) + HHOOK hHook = NULL; + +__declspec(allocate("ve_shared")) + UINT uVistaElevatorMsg = 0; + +__declspec(allocate("ve_shared")) + BOOL bSuccess = FALSE; + +__declspec(allocate("ve_shared")) + TCHAR szVE_Path[ MAX_PATH ] = _T(""); + +__declspec(allocate("ve_shared")) + TCHAR szVE_Parameters[ MAX_PATH ] = _T(""); + +__declspec(allocate("ve_shared")) + TCHAR szVE_Directory[ MAX_PATH ] = _T(""); + +//////////////////////////////////e +// the hook callback procedure, it is called in the context of th shell proces + +LRESULT CALLBACK +VistaEelevator_HookProc_MsgRet( int code, WPARAM wParam, LPARAM lParam ) +{ + if ( code >= 0 && lParam ) + { + CWPRETSTRUCT * pwrs = (CWPRETSTRUCT *)lParam; + + if (pwrs->message == uVistaElevatorMsg ) + { + bSuccess = ::MyShellExec( + pwrs->hwnd, + NULL, + szVE_Path, + szVE_Parameters, + szVE_Directory ); + } + } + + return ::CallNextHookEx( hHook, code, wParam, lParam ); +} + +BOOL +RunNonElevated( + __in HWND hwnd, + __in LPCTSTR pszPath, + __in_opt LPCTSTR pszParameters, // = NULL, + __in_opt LPCTSTR pszDirectory ) // = NULL ); +{ + ASSERT( pszPath && *pszPath ); // other args are optional + + ASSERT( IsVista() ); + ASSERT( pszPath ); + + if ( S_FALSE == IsElevated() ) + { + // if the current process is not elevated, we can use ShellExecuteAs directly! + + return MyShellExec( hwnd, + NULL, + pszPath, + pszParameters, + pszDirectory ); + } + + #ifndef WIN64 + + // If 32-bit code is executing under x64 version of Windows, it will not work, because + // the shell is a 64-bit process, and to hook it successfully this code needs to be 64-bit as well + + if ( IsWow64() ) + { + ASSERT_HERE; + return FALSE; + } + + #endif//WIN64 + + + ////////////////////////////////////////////// + // + // How this code works: + // + // To start a non-elevated process, we need to inject our code into a non-elevated + // process already running on the target computer. Since Windows shell is non-elevated, + // and we can safely assume it to always run, (when was the last time you saw Windows + // running without its shell?), we will try to inject our code into the shell process. + // + // To inject the code, we will install a global hook, and send a message to + // a window created by the shell. This will cause our hook callback procedure to be executed + // in the context of the shell proces. + // + // Because this trick uses a global hook, the hook procedure must be in a DLL. + // + + ///////////////////// + // First, register a private message, to communicate with the (hooked) shell process + + if ( !uVistaElevatorMsg ) + uVistaElevatorMsg = ::RegisterWindowMessage( _T("VistaElevatorMsg") ); + + ////////////////////////////////////// + // Find the shell window (the desktop) + + HWND hwndShell = ::FindWindow( _T("Progman"), NULL); + + if ( !hwndShell ) + { + ASSERT_HERE; + return FALSE; + } + + ///////////////////////////////////////// + // Install a global hook, to inject our code into the shell proces + + HMODULE hModule = NULL; // we need to know hModule of the DLL to install a global hook + + if ( !::GetModuleHandleEx( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCTSTR)VistaEelevator_HookProc_MsgRet, + &hModule ) ) + { + ASSERT_HERE; + return FALSE; + } + + ASSERT( hModule ); + + hHook = ::SetWindowsHookEx( WH_CALLWNDPROCRET, // hook called after SendMessage() !!! + (HOOKPROC)VistaEelevator_HookProc_MsgRet, hModule, 0); + + if ( !hHook ) + { + ASSERT_HERE; + return FALSE; + } + + ////////////////////////////////// + // Prepare the parameters for launching the non-elevated process + // from the hook callback procedure (they are placed into the shared data section) + + if ( FAILED( StringCchCopy( + szVE_Path, + _tsizeof(szVE_Path), + pszPath ) ) ) + { + ASSERT_HERE; + return FALSE; + } + + if ( FAILED( StringCchCopy( + szVE_Parameters, + _tsizeof(szVE_Parameters), + pszParameters ? pszParameters : _T("") ) ) ) + { + ASSERT_HERE; + return FALSE; + } + + if ( FAILED( StringCchCopy( + szVE_Directory, + _tsizeof(szVE_Directory), + pszDirectory ? pszDirectory : _T("") ) ) ) + { + ASSERT_HERE; + return FALSE; + } + + ///////////////////////////////////////// + // Activate our hook callback procedure: + + bSuccess = FALSE; // assume failure + + ::SendMessage( hwndShell, uVistaElevatorMsg, 0, 0 ); + + //////////////////////////////////////////////////////// + // At this point our hook procedure has been executed! + + ///////////////////////////////////// + // The hook is no longer needed, remove it: + + ::UnhookWindowsHookEx( hHook ); + hHook = NULL; + + ////////////////////// + // All done! + + return bSuccess; +} +#endif //DONTWANT_RunNonElevated + + +#endif// IMPLEMENT_VISTA_TOOLS \ No newline at end of file diff --git a/src/api.h b/src/api.h new file mode 100644 index 0000000..85d41c4 --- /dev/null +++ b/src/api.h @@ -0,0 +1,83 @@ +/* + * apih + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2013 Nullsoft and Contributors + * + * Licensed under the zlib/libpng license (the "License"); + * you may not use this file except in compliance with the License. + * + * Licence details can be found in the file COPYING. + * + * This software is provided 'as-is', without any express or implied + * warranty. + */ + +#ifndef _NSIS_EXEHEAD_API_H_ +#define _NSIS_EXEHEAD_API_H_ + +// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version +// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) +// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} + +#define NSISPIAPIVER_1_0 0x00010000 +#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 + +// NSIS Plug-In Callback Messages +enum NSPIM +{ + NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup + NSPIM_GUIUNLOAD, // Called after .onGUIEnd +}; + +// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() +// Return NULL for unknown messages +// Should always be __cdecl for future expansion possibilities +typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); + +// extra_parameters data structures containing other interesting stuff +// but the stack, variables and HWND passed on to plug-ins. +typedef struct +{ + int autoclose; + int all_user_var; + int exec_error; + int abort; + int exec_reboot; // NSIS_SUPPORT_REBOOT + int reboot_called; // NSIS_SUPPORT_REBOOT + int XXX_cur_insttype; // depreacted + int plugin_api_version; // see NSISPIAPIVER_CURR + // used to be XXX_insttype_changed + int silent; // NSIS_CONFIG_SILENT_SUPPORT + int instdir_error; + int rtl; + int errlvl; + int alter_reg_view; + int status_update; +} exec_flags_t; + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +typedef struct { + exec_flags_t *exec_flags; + int (NSISCALL *ExecuteCodeSegment)(int, HWND); + void (NSISCALL *validate_filename)(TCHAR *); + int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors +} extra_parameters; + +// Definitions for page showing plug-ins +// See Ui.c to understand better how they're used + +// sent to the outer window to tell it to go to the next inner window +#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) + +// custom pages should send this message to let NSIS know they're ready +#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) + +// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning +#define NOTIFY_BYE_BYE 'x' + +#endif /* _PLUGIN_H_ */ diff --git a/src/nsis_tchar.h b/src/nsis_tchar.h new file mode 100644 index 0000000..210bab1 --- /dev/null +++ b/src/nsis_tchar.h @@ -0,0 +1,229 @@ +/* + * nsis_tchar.h + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2013 Nullsoft and Contributors + * + * This software is provided 'as-is', without any express or implied + * warranty. + * + * For Unicode support by Jim Park -- 08/30/2007 + */ + +// Jim Park: Only those we use are listed here. + +#pragma once + +#ifdef _UNICODE + +#ifndef _T +#define __T(x) L ## x +#define _T(x) __T(x) +#define _TEXT(x) __T(x) +#endif + +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +#if !defined(_NATIVE_WCHAR_T_DEFINED) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short TCHAR; +#else +typedef wchar_t TCHAR; +#endif +#endif + + +// program +#define _tenviron _wenviron +#define __targv __wargv + +// printfs +#define _ftprintf fwprintf +#define _sntprintf _snwprintf +#if (defined(_MSC_VER) && (_MSC_VER<=1310)) || defined(__MINGW32__) +# define _stprintf swprintf +#else +# define _stprintf _swprintf +#endif +#define _tprintf wprintf +#define _vftprintf vfwprintf +#define _vsntprintf _vsnwprintf +#if defined(_MSC_VER) && (_MSC_VER<=1310) +# define _vstprintf vswprintf +#else +# define _vstprintf _vswprintf +#endif + +// scanfs +#define _tscanf wscanf +#define _stscanf swscanf + +// string manipulations +#define _tcscat wcscat +#define _tcschr wcschr +#define _tcsclen wcslen +#define _tcscpy wcscpy +#define _tcsdup _wcsdup +#define _tcslen wcslen +#define _tcsnccpy wcsncpy +#define _tcsncpy wcsncpy +#define _tcsrchr wcsrchr +#define _tcsstr wcsstr +#define _tcstok wcstok + +// string comparisons +#define _tcscmp wcscmp +#define _tcsicmp _wcsicmp +#define _tcsncicmp _wcsnicmp +#define _tcsncmp wcsncmp +#define _tcsnicmp _wcsnicmp + +// upper / lower +#define _tcslwr _wcslwr +#define _tcsupr _wcsupr +#define _totlower towlower +#define _totupper towupper + +// conversions to numbers +#define _tcstoi64 _wcstoi64 +#define _tcstol wcstol +#define _tcstoul wcstoul +#define _tstof _wtof +#define _tstoi _wtoi +#define _tstoi64 _wtoi64 +#define _ttoi _wtoi +#define _ttoi64 _wtoi64 +#define _ttol _wtol + +// conversion from numbers to strings +#define _itot _itow +#define _ltot _ltow +#define _i64tot _i64tow +#define _ui64tot _ui64tow + +// file manipulations +#define _tfopen _wfopen +#define _topen _wopen +#define _tremove _wremove +#define _tunlink _wunlink + +// reading and writing to i/o +#define _fgettc fgetwc +#define _fgetts fgetws +#define _fputts fputws +#define _gettchar getwchar + +// directory +#define _tchdir _wchdir + +// environment +#define _tgetenv _wgetenv +#define _tsystem _wsystem + +// time +#define _tcsftime wcsftime + +#else // ANSI + +#ifndef _T +#define _T(x) x +#define _TEXT(x) x +#endif + +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +typedef char TCHAR; +#endif + +// program +#define _tenviron environ +#define __targv __argv + +// printfs +#define _ftprintf fprintf +#define _sntprintf _snprintf +#define _stprintf sprintf +#define _tprintf printf +#define _vftprintf vfprintf +#define _vsntprintf _vsnprintf +#define _vstprintf vsprintf + +// scanfs +#define _tscanf scanf +#define _stscanf sscanf + +// string manipulations +#define _tcscat strcat +#define _tcschr strchr +#define _tcsclen strlen +#define _tcscnlen strnlen +#define _tcscpy strcpy +#define _tcsdup _strdup +#define _tcslen strlen +#define _tcsnccpy strncpy +#define _tcsrchr strrchr +#define _tcsstr strstr +#define _tcstok strtok + +// string comparisons +#define _tcscmp strcmp +#define _tcsicmp _stricmp +#define _tcsncmp strncmp +#define _tcsncicmp _strnicmp +#define _tcsnicmp _strnicmp + +// upper / lower +#define _tcslwr _strlwr +#define _tcsupr _strupr + +#define _totupper toupper +#define _totlower tolower + +// conversions to numbers +#define _tcstol strtol +#define _tcstoul strtoul +#define _tstof atof +#define _tstoi atoi +#define _tstoi64 _atoi64 +#define _tstoi64 _atoi64 +#define _ttoi atoi +#define _ttoi64 _atoi64 +#define _ttol atol + +// conversion from numbers to strings +#define _i64tot _i64toa +#define _itot _itoa +#define _ltot _ltoa +#define _ui64tot _ui64toa + +// file manipulations +#define _tfopen fopen +#define _topen _open +#define _tremove remove +#define _tunlink _unlink + +// reading and writing to i/o +#define _fgettc fgetc +#define _fgetts fgets +#define _fputts fputs +#define _gettchar getchar + +// directory +#define _tchdir _chdir + +// environment +#define _tgetenv getenv +#define _tsystem system + +// time +#define _tcsftime strftime + +#endif + +// is functions (the same in Unicode / ANSI) +#define _istgraph isgraph +#define _istascii __isascii + +#define __TFILE__ _T(__FILE__) +#define __TDATE__ _T(__DATE__) +#define __TTIME__ _T(__TIME__) diff --git a/src/pluginapi.cpp b/src/pluginapi.cpp new file mode 100644 index 0000000..0fd25db --- /dev/null +++ b/src/pluginapi.cpp @@ -0,0 +1,296 @@ +//#include "StdAfx.h" + +#include +#include +#include "pluginapi.h" + +#ifdef _countof +#define COUNTOF _countof +#else +#define COUNTOF(a) (sizeof(a)/sizeof(a[0])) +#endif + +unsigned int g_stringsize; +stack_t **g_stacktop; +TCHAR *g_variables; + +// utility functions (not required but often useful) + +int NSISCALL popstring(TCHAR *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + if (str) lstrcpy(str,th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +int NSISCALL popstringn(TCHAR *str, int maxlen) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + if (str) lstrcpyn(str,th->text,maxlen?maxlen:g_stringsize); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +void NSISCALL pushstring(const TCHAR *str) +{ + stack_t *th; + if (!g_stacktop) return; + th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR))); + lstrcpyn(th->text,str,g_stringsize); + th->next=*g_stacktop; + *g_stacktop=th; +} + +TCHAR* NSISCALL getuservariable(const int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) return NULL; + return g_variables+varnum*g_stringsize; +} + +void NSISCALL setuservariable(const int varnum, const TCHAR *var) +{ + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + lstrcpy(g_variables + varnum*g_stringsize, var); +} + +#ifdef _UNICODE +int NSISCALL PopStringA(char* ansiStr) +{ + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); + int rval = popstring(wideStr); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); + GlobalFree((HGLOBAL)wideStr); + return rval; +} + +int NSISCALL PopStringNA(char* ansiStr, int maxlen) +{ + int realLen = maxlen ? maxlen : g_stringsize; + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, realLen*sizeof(wchar_t)); + int rval = popstringn(wideStr, realLen); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL); + GlobalFree((HGLOBAL)wideStr); + return rval; +} + +void NSISCALL PushStringA(const char* ansiStr) +{ + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); + pushstring(wideStr); + GlobalFree((HGLOBAL)wideStr); + return; +} + +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr) +{ + lstrcpyW(wideStr, getuservariable(varnum)); +} + +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr) +{ + wchar_t* wideStr = getuservariable(varnum); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); +} + +void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr) +{ + if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST) + { + wchar_t* wideStr = g_variables + varnum * g_stringsize; + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); + } +} + +#else +// ANSI defs +int NSISCALL PopStringW(wchar_t* wideStr) +{ + char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); + int rval = popstring(ansiStr); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); + GlobalFree((HGLOBAL)ansiStr); + return rval; +} + +int NSISCALL PopStringNW(wchar_t* wideStr, int maxlen) +{ + int realLen = maxlen ? maxlen : g_stringsize; + char* ansiStr = (char*) GlobalAlloc(GPTR, realLen); + int rval = popstringn(ansiStr, realLen); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen); + GlobalFree((HGLOBAL)ansiStr); + return rval; +} + +void NSISCALL PushStringW(wchar_t* wideStr) +{ + char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); + pushstring(ansiStr); + GlobalFree((HGLOBAL)ansiStr); +} + +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr) +{ + char* ansiStr = getuservariable(varnum); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); +} + +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr) +{ + lstrcpyA(ansiStr, getuservariable(varnum)); +} + +void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr) +{ + if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST) + { + char* ansiStr = g_variables + varnum * g_stringsize; + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); + } +} +#endif + +// playing with integers + +INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s) +{ + INT_PTR v=0; + if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) + { + s++; + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('9')) c-=_T('0'); + else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; + else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; + else break; + v<<=4; + v+=c; + } + } + else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) + { + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('7')) c-=_T('0'); + else break; + v<<=3; + v+=c; + } + } + else + { + int sign=0; + if (*s == _T('-')) sign++; else s--; + for (;;) + { + int c=*(++s) - _T('0'); + if (c < 0 || c > 9) break; + v*=10; + v+=c; + } + if (sign) v = -v; + } + + return v; +} + +unsigned int NSISCALL myatou(const TCHAR *s) +{ + unsigned int v=0; + + for (;;) + { + unsigned int c=*s++; + if (c >= _T('0') && c <= _T('9')) c-=_T('0'); + else break; + v*=10; + v+=c; + } + return v; +} + +int NSISCALL myatoi_or(const TCHAR *s) +{ + int v=0; + if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) + { + s++; + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('9')) c-=_T('0'); + else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; + else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; + else break; + v<<=4; + v+=c; + } + } + else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) + { + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('7')) c-=_T('0'); + else break; + v<<=3; + v+=c; + } + } + else + { + int sign=0; + if (*s == _T('-')) sign++; else s--; + for (;;) + { + int c=*(++s) - _T('0'); + if (c < 0 || c > 9) break; + v*=10; + v+=c; + } + if (sign) v = -v; + } + + // Support for simple ORed expressions + if (*s == _T('|')) + { + v |= myatoi_or(s+1); + } + + return v; +} + +INT_PTR NSISCALL popintptr() +{ + TCHAR buf[128]; + if (popstringn(buf,COUNTOF(buf))) + return 0; + return nsishelper_str_to_ptr(buf); +} + +int NSISCALL popint_or() +{ + TCHAR buf[128]; + if (popstringn(buf,COUNTOF(buf))) + return 0; + return myatoi_or(buf); +} + +void NSISCALL pushintptr(INT_PTR value) +{ + TCHAR buffer[30]; + wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value); + pushstring(buffer); +} diff --git a/src/pluginapi.h b/src/pluginapi.h new file mode 100644 index 0000000..f607b11 --- /dev/null +++ b/src/pluginapi.h @@ -0,0 +1,115 @@ +#ifndef ___NSIS_PLUGIN__H___ +#define ___NSIS_PLUGIN__H___ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "api.h" +#ifdef _UNICODE +#ifndef _T +#define __T(x) L ## x +#define _T(x) __T(x) +#define _TEXT(x) __T(x) +#endif +#else +#ifndef _T +#define _T(x) x +#define _TEXT(x) x +#endif +#endif + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +typedef struct _stack_t { + struct _stack_t *next; + TCHAR text[1]; // this should be the length of string_size +} stack_t; + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + +extern unsigned int g_stringsize; +extern stack_t **g_stacktop; +extern TCHAR *g_variables; + +void NSISCALL pushstring(const TCHAR *str); +void NSISCALL pushintptr(INT_PTR value); +#define pushint(v) pushintptr((INT_PTR)(v)) +int NSISCALL popstring(TCHAR *str); // 0 on success, 1 on empty stack +int NSISCALL popstringn(TCHAR *str, int maxlen); // with length limit, pass 0 for g_stringsize +INT_PTR NSISCALL popintptr(); +#define popint() ( (int) popintptr() ) +int NSISCALL popint_or(); // with support for or'ing (2|4|8) +INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s); +#define myatoi(s) ( (int) nsishelper_str_to_ptr(s) ) // converts a string to an integer +unsigned int NSISCALL myatou(const TCHAR *s); // converts a string to an unsigned integer, decimal only +int NSISCALL myatoi_or(const TCHAR *s); // with support for or'ing (2|4|8) +TCHAR* NSISCALL getuservariable(const int varnum); +void NSISCALL setuservariable(const int varnum, const TCHAR *var); + +#ifdef _UNICODE +#define PopStringW(x) popstring(x) +#define PushStringW(x) pushstring(x) +#define SetUserVariableW(x,y) setuservariable(x,y) + +int NSISCALL PopStringA(char* ansiStr); +void NSISCALL PushStringA(const char* ansiStr); +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr); +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr); +void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr); + +#else +// ANSI defs + +#define PopStringA(x) popstring(x) +#define PushStringA(x) pushstring(x) +#define SetUserVariableA(x,y) setuservariable(x,y) + +int NSISCALL PopStringW(wchar_t* wideStr); +void NSISCALL PushStringW(wchar_t* wideStr); +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr); +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr); +void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif//!___NSIS_PLUGIN__H___