Smithy
Smithy v2 container/plugin and Smithy tool notes are consolidated here from the 2026-05-19 snapshot.
2026-05-19 application notes
NvContainerSmithyController.exe
Repository path: services/SmithyV2/SmithyController/NvContainerSmithyController.exe
Deployed path: C:\Asgard\services\SmithyV2\SmithyController\
What this program actually does
NvContainerSmithyController.exe is the NVIDIA NvContainer v1.45 service host that loads SmithyControllerPlugin.dll as its sole mandatory plugin. It runs as Windows SCM service SmithyController, managing the standard NvContainer plugin lifecycle: secure load → initialize → start → wait for plugin "done" → stop → unload → service exit.
It does not execute seat hardening directly — all SSLM/session logic lives in the plugin DLL.
Architecture (nvc:😗 RTTI + r2 strings)
NvContainerSmithyController.exe (SCM service, GUI subsystem, PID 2488)
└─ NvcServiceHost / NvcHostWin32 / NvcPluginManager
├─ DirectoryEnumerator — loads *.dll from install dir (not subdirs)
├─ RegistryStorage + JsonFileStorage (per-plugin config)
├─ MessageQueue (inter-plugin / system notifications)
├─ NvcPluginLoadHel (secure DLL load)
├─ ServiceConfigThread (config polling with timeout)
└─ SmithyControllerPlugin.dll (mandatory, version 1)
└─ NvPluginGetInfo exportPlugin state machine (log strings): Initializing → Initialized → Starting → Started → Stopping → Stopped → Uninitialized → unloaded.
Build path: C:\dvs\p4\build\sw\gcomp\rel\src\NvContainer\_out\x86_64\release\container\NvContainer.pdb
Export: NvOptimusEnablement (sole export — Optimus-related; seat usage not verified).
External interfaces
| Interface | Role |
|---|---|
Windows Service SmithyController | Installed smithy package [1/4] |
| Plugin directory | C:\Asgard\services\SmithyV2\SmithyController\ |
| Registry | RegistryStorage per plugin load |
| Logs | C:\Asgard\logs\SmithyV2\SmithyController\NvContainerSmithyController.log |
| Crash dumps | SmithyControllerCrashDumpConfig.reg applied at install |
| Hidden window | NvContainerWindowClass%08X (Win32 host message pump) |
Dynamic plugin load/unload: disabled on gameseat (Dynamic loading of plugins is disabled).
No direct network/RPC — all external I/O via loaded plugin.
Windows API surface (sample)
| Category | APIs |
|---|---|
| Process | CreateProcessW, CreateProcessA, Process32FirstW/NextW |
| Plugin watch | FindFirstChangeNotificationW, FindNextChangeNotification |
| Filesystem | CreateDirectoryW, CreateSymbolicLinkW, CreateHardLinkW |
| Monitoring | CreateToolhelp32Snapshot, CreateTimerQueueTimer |
| Security | DACL adjustment (Created new DACL with added privileges 0x00100000) |
| Hardening | Vectored exception handlers, VirtualProtect |
Deep extract: 117 Win32 APIs, 53 nvc:😗 types. PE32+ GUI x64, MSVC 14.39, signed.
Runtime timeline (captured seat)
| Time (UTC) | Event | Source |
|---|---|---|
| 18:43:08.156 | Container main v1.45; telemetry init | NvContainerSmithyController.log |
| 18:43:08.161 | Load plugins from SmithyController dir | same |
| 18:43:08.288 | Secure-load SmithyControllerPlugin.dll (107 ms) | same |
| 18:43:08.516 | Container initialized; service Running | same |
| 18:43:08.531 | Plugin Started; init 225,687 µs total | same |
| 18:48:42.848 | Plugin notification 3 ("done") → mandatory unload | same |
| 18:48:42.897 | Service Stopped; plugin unloaded | same |
Install: smithySoftwareInstall.log — service created, crash dump config, log dir [1/4].
Pandora: Smithy package installed during seat software setup; service active at boot, not during Pandora install itself.
Failure modes (error strings)
| String | Meaning |
|---|---|
Failed to load plugins. Exiting | Plugin directory load failure |
Base host: mandatory plugin %s has failed. Exit | Fatal mandatory plugin failure |
Failed to complete transition to Started | Plugin failed Starting phase |
Plugin count exceeded maximum allowed %u | Too many plugins |
Container is in suspended state. Skipping plugin initialization | Suspend/resume path |
(Not observed on captured seat — plugin lifecycle succeeded.)
Relationships
| Component | Interaction |
|---|---|
SmithyControllerPlugin.dll | Sole mandatory plugin; session orchestration |
NvContainerGcis.exe | Sibling NvContainer host (GCIS plugins) |
NvContainerGSP.exe | Sibling host for GSConfigurator |
| Smithy V2 package | [1/4] controller, [3/4] NoOp, [4/4] SmithyCLI |
Not verified
- Full NvContainer plugin ABI beyond
NvPluginGetInfo. ServiceConfigThreadpolling interval and timeout values.- Meaning of plugin notification code
3("done") at ABI level. - Whether
NvOptimusEnablementexport is invoked on the gameseat.
Evidence
- Radare2 + strings on
NvContainerSmithyController.exe logs/SmithyV2/SmithyController/NvContainerSmithyController.loglogs/startup/smithySoftwareInstall.log
SmithyControllerPlugin.dll
Repository path: services/SmithyV2/SmithyController/SmithyControllerPlugin.dll
Deployed path: C:\Asgard\services\SmithyV2\SmithyController\SmithyControllerPlugin.dll
What this program actually does
SmithyControllerPlugin.dll is the Smithy V2 session orchestrator NvContainer plugin. It subscribes to SSLM (Session Lifecycle Manager) via MessageBus, detects I2P vs production sessions, launches SmithyCLI (smithy.exe) with profile-specific JSON, handles pre-session trust window end (session activation / SOPS hardening), deletes ephemeral CLI artifacts from disk, and reports telemetry via TAS/UEC.
Size: 7,577,712 bytes. PE32+ DLL x64, MSVC 14.35, signed. Sole export: NvPluginGetInfo.
Architecture (RTTI + log tags)
SmithyControllerPlugin.dll (NvContainer plugin)
├─ BusHandler — MessageBus observer (BusObserverEx.h)
├─ SCSslm — SSLM subscribe/unsubscribe/request/response
├─ SCEnvUtils — seat type: Production / I2P detection
├─ SmithyTasConnect — TAS telemetry session (Connector.cpp)
├─ SmithyUecReporter — UEC error reporting (SMITHY:SmithyUecReporter)
├─ SystemUtils — CreateProcessW launcher for SmithyCLI
├─ GSConfigClient — GSConfigurator config fetch via MessageBus
├─ DeferredTaskQueue — PluginInitialization / PluginStart / PluginStop
└─ SCPlugin — session activation → artifact deletionUses Poco C++ + Google protobuf v5.29.3 + Abseil + NvMessageBus.dll.
Build path: C:\builds\gfn\security\os-hardening\smithy-controller\out\x64-windows-release\SmithyControllerPlugin\SmithyControllerPlugin.pdb
MessageBus / SSLM surface
| Surface | Details |
|---|---|
| Bus identity | SMITHY:SmithyController, SMITHY:SmithyUecReporter |
| SSLM peer | GfnSdkService:SSLM |
| Subscribe trigger | Pandora:SeatReady peer join → SSLM subscription |
| Handled notifications | session setup start, pre-session trust window end |
| Protobuf types | NVIDIA.Bifrost.Common.Error, SessionResultCode, SslmApi, GSConfiguratorCommunication |
| Observed peers | GCIS (7 plugins), GfnGuard, Morph, NGS, PIPS, GSConfigurator, CtMT, mb-repeater, StutterShark |
| Ignored types | Generic, GsServiceApi, GsTelemetryMessage, SeatConfigurationMessage, GCISInitializationMessage |
| SmithyCLI spawn peers | SMITHY:ElmPluginModifier, GssmPluginModifier, UadPluginModifier, UadMLPluginModifier |
UEC events (strings): SmithyController_I2pSessionDetected, SmithyController_SmithyV2CliLaunchFailed, SmithyController_SmithyV2CliTimedOut, SmithyController_FailedToHandleSessionActivation, SmithyController_RequiredSslmNotificationsNotReceived, SmithyController_SslmSubscriptionRequestRejected.
SmithyCLI launch (observed)
c:/asgard/services/SmithyV2/SmithyCLI/smithy.exe
--profile c:/asgard/services/SmithyV2/SmithyCLI/profiles/i2p.json
--history c:/asgard/conf/SmithyV2/SmithyCLI/seat_history.json
--log-path c:/asgard/logs/SmithyV2/SmithyCLI/i2p.log
(timeout: 15000 ms)Profiles installed: restrict.json, relax.json, i2p.json, imagegen.json, xbox.json, sample.json. Boot install selects restrict.json when seat profile ≠ open/relaxed.
Post-session activation: deletes smithy.exe, all profile JSONs, and CLI logs from disk (SOPS artifact cleanup).
External interfaces
| Interface | Role |
|---|---|
| NvContainer host | Loaded by NvContainerSmithyController.exe |
| MessageBus | NvMessageBus.dll via getMessageBusInterfaceWithConfig |
| GSConfigurator | Config fetch via GSConfigClient |
| SSLM | Session lifecycle notifications/responses |
| TAS | Telemetry Aggregator Service connector |
| Process spawn | CreateProcessW for SmithyCLI and modifier tools |
PE metadata
| Field | Value |
|---|---|
| SHA-256 | 7d5c1fbeb0f506ba33f39bf2afeae5e1e07589e7f895f1864566301ed1cf21f2 |
| Size | 7,577,712 bytes |
| Format | PE32+ DLL x64, canary enabled, signed |
| Export | NvPluginGetInfo @ 0x180062e70 |
| Compiled | 2026-04-22 |
Deep extract: 196 Win32 APIs, 333 C++ RTTI types.
Runtime timeline (captured seat)
| Time (UTC) | Event | Source |
|---|---|---|
| 18:43:08.405 | Plugin init; seat type [REDACTED_BASE_ENV]; SSLM sub cancelled (pre-SeatReady) | SmithyControllerPlugin.log |
| 18:43:08.515 | TAS session initiated | same |
| 18:43:08.531 | PluginStart; BusHandler subscribes; 38+ peers observed | same |
| 18:43:22.361 | Pandora:SeatReady → SSLM subscribed | same |
| 18:48:22.418 | I2P session detected → launch SmithyCLI i2p.json | same |
| 18:48:23.387 | Respond to session setup start (code 0) | same |
| 18:48:42.757 | Pre-session trust window end → delete CLI binary + profiles | same |
| 18:48:42.849 | SSLM unsubscribe; plugin stop; notification 3 to host | same + container log |
Host correlation: NvContainer receives notification 3 → unloads plugin → stops SmithyController service @ 18:48:42.897.
Failure modes
| String / condition | Meaning |
|---|---|
Failed to create MessageBus observer | NvMessageBus.dll missing |
TAS not found on MessageBus before exit | TAS peer timeout |
SmithyController_SmithyV2CliTimedOut | CLI exceeded 15000 ms |
SmithyController_FailedToDeleteArtifact | Post-SOPS cleanup failure |
SSLM subscription attempt was cancelled | Early init before SeatReady (expected) |
Relationships
| Component | Interaction |
|---|---|
NvContainerSmithyController.exe | Plugin host / service wrapper |
smithy.exe (SmithyCLI) | Hardening executor spawned per session |
GfnSdkService:SSLM | Session lifecycle authority |
| GCIS plugins | Observed on bus; modifiers spawned during boot hardening |
| Pandora | Pandora:SeatReady triggers SSLM subscription |
Not verified
- SmithyV2 profile JSON schemas (profiles deleted post-session; not in workspace).
- Full SSLM notification set beyond captured I2P session.
- Production-session SmithyCLI launch path (only I2P observed in logs).
Evidence
- Radare2 on
SmithyControllerPlugin.dll logs/SmithyV2/SmithyController/1779216188403/SmithyControllerPlugin.loglogs/SmithyV2/SmithyController/NvContainerSmithyController.loglogs/startup/smithySoftwareInstall.log
NoOp.exe (SmithyV2)
Repository path: services/SmithyV2/Noop/NoOp.exe
Deployed path: C:\Asgard\services\SmithyV2\Noop\NoOp.exe
What this program actually does
NoOp.exe under services/SmithyV2/Noop/ is a minimal signed stub executable (~21 KB, MSVC 2025) used as a placeholder process target in Smithy V2 profile JSON module chains when a real tool is not required. Entry point runs CRT initialization and exits immediately — main is 3 bytes (essentially xor eax,eax; ret).
Installed as smithy package step [3/4] Installing NoOp. Distinct from Smithy V1 tools/Smithy/NoOp.exe (121 KB, full SEH frame, copied over OpenWith.exe during V1 hardening).
Architecture / control flow
entry0 @ 0x140001264
└─ CRT init (_initterm, SEH registration)
└─ main @ 0x140001000 (3 bytes) → exit(0)Imports: VCRUNTIME140 + api-ms-win-crt-* + 6 KERNEL32 stubs (PID/TID/time/QPC/SEH only).
No networking, filesystem, registry, or process creation.
External interfaces
| Interface | Role |
|---|---|
| Process execution | Invoked as target binary in SmithyV2 JSON profiles |
| Uninstall | tools/SmithyV2/uninstall_noop.bat |
| Install | Smithy package [3/4] copies from noop/bin/NoOp.exe |
No CLI args, stdout output, or Windows service registration.
PE metadata
| Field | Value |
|---|---|
| SHA-256 | 25f1cc4aa0481fa636da848ea9db2399dc76ad78ed456582a44c325dd22fae21 |
| Size | 21,104 bytes |
| Format | PE32+ console x64, signed, compiled 2025-07-12 |
| Subsystem | Windows CUI |
| Code section | ~0xC00 bytes (mostly CRT) |
| Exports | none |
Runtime timeline
| Time (UTC) | Event | Source |
|---|---|---|
| 18:43:15 | [3/4] Installing NoOp | logs/startup/smithySoftwareInstall.log |
| 18:43:15 | Copy to SmithyV2\Noop\; uninstall script deployed | same |
| — | No runtime execution observed in captured logs | — |
Pandora: No direct invocation. Smithy V1 install also copies a different NoOp to tools/Smithy/Smithy/ (V1 path).
Smithy V1 vs V2 NoOp
| Property | V2 (services/SmithyV2/Noop/) | V1 (tools/Smithy/Smithy/) |
|---|---|---|
| Size | 21 KB | 121 KB |
| Role | Profile placeholder | OpenWith.exe replacement |
| Overwrites system files | No (in this snapshot) | Yes — C:\Windows\*\OpenWith.exe |
| SEH frame | Minimal CRT only | Full unwind/SEH |
Failure modes
None meaningful — stub always exits 0 if process can start.
Relationships
| Component | Interaction |
|---|---|
| Smithy V2 profiles | JSON entries reference NoOp as module process target (profiles deleted post-session) |
SmithyControllerPlugin.dll | Orchestrates SmithyCLI; NoOp is separate install artifact |
| V1 Smithy package | Installs different NoOp binary to tools/Smithy/ |
Not verified
- Which SmithyV2 profile JSON entries reference this exact binary path.
- Whether V2 NoOp is ever copied over system files (V1 does for OpenWith).
- Exit code if launched under restrictive ACL (expected 0).
Evidence
- Radare2 on
services/SmithyV2/Noop/NoOp.exe logs/startup/smithySoftwareInstall.log([3/4] Installing NoOp)
smithy.exe (Smithy V1)
What this program actually does
smithy.exe is the Smithy V1 seat hardening orchestrator — a PyInstaller-packaged Python 3.11 application run once at install. It executes a modular pipeline to configure the GFN kiosk desktop, patch SAS scripts, replace system binaries with stubs, apply ACLs, and optionally interact with GSConfigurator.
Deployed to C:\Asgard\Tools\Smithy\smithy.exe. It is not Smithy V2 (SmithyCLI under services/SmithyV2/) — that is session-triggered by SmithyControllerPlugin.dll.
Architecture (embedded Python modules)
smithy.exe (PyInstaller bootloader + python311.dll)
└─ smithy_modules.system_files — backup/restore system files
└─ smithy_modules.sas_patching — SAS script ACLs, kiosk log permissions
└─ smithy_modules.gfn_desktop — explorer/OpenWith replacement, WerSvc
└─ smithy_modules.gsconfigurator — GSConfigurator (skipped if not installed)
└─ smithy_modules.utils.{smithy_logger, smithy_utils}
└─ smithy_mb — MessageBus client (Python)
└─ google.protobuf + bGCISServiceApiDef_pb2.py
└─ Hidden USER32 message loop (PyInstaller one-file pattern)Install log module order: SystemFilesModule → SasPatchingModule → DesktopModule → GSConfiguratorModule (skipped).
CLI interface
smithy.exe [-s on|off] [-p <profile>]| Flag | Behavior |
|---|---|
-s on | Enable shell hardening mode |
-p default | [REDACTED_BASE_ENV] GFN desktop profile (replaces explorer with gfndesktop) |
-p open | Explorer shell profile |
Artifact schema (smithy_artifact.json): { "version": "0.0.0.1", "profile": "default" }
Result schema (smithy_result.log): { "outcome": "0x0", "profile": "default" }
Key desktop actions (from smithySoftwareInstall.log / Smithy.log):
- Kill
explorer.exe, replaceOpenWith.exewith NoOp stub - Attempt
explorer.exe→gfndesktop.exeswap - Configure WerSvc, create kiosk scheduled task
- Backup originals to
C:\Asgard\IETemp\{32,64}\
Windows API surface
From deep extract + PyInstaller bootloader:
| Category | APIs |
|---|---|
| Process spawn | CreateProcessW — wraps icacls, takeown, taskkill, schtasks, net, sc |
| Filesystem | CreateDirectoryW, CreateSymbolicLinkW, GetFileAttributesExW, GetFinalPathNameByHandleW |
| Environment | GetEnvironmentVariableW, SetEnvironmentVariableW, SetDllDirectoryW |
| Token | OpenProcessToken, GetTokenInformation |
| PyInstaller loop | CreateWindowExW, RegisterClassW, GetWindowLongPtrW, SetWindowLongPtrW, SetConsoleCtrlHandler |
Embedded: python311.dll, PyImport_ExecCodeModule, [PYI-%d:ERROR] strings. Size: 7,996,784 bytes.
Install timeline
| Time (UTC) | Event | Source |
|---|---|---|
| 18:43:07 | Smithy VHDX mounted at O:\ | startup.log [12/14] |
| 18:43:07–15 | O:\deploy\install.bat (8.0s) | smithySoftwareInstall.log |
| 18:43:09 | [2/4] Installing Smithy V1 → runs smithy.exe | same |
| 18:43:09 | Zone [REDACTED_ZONE], production seat | Smithy.log |
Pandora: No direct run_cmd of smithy.exe in startup.log — install.bat invokes it.
Disassembly hints
- PyInstaller extraction under
%TEMP%— use pyinstxtractor on embedded archive. - Search for
PyImport_ExecCodeModulein bootloader section. - Module names are plain strings:
smithy_modules.gfn_desktop, etc. - All external ops via
CreateProcessWwrapping CLI tools — trace argument construction there.
What is NOT verified
- Full
-s/-poption set beyonddefaultandopen. - Whether
smithy_mbregisters as a named MessageBus peer (module present; no bus peer log for V1). - Exact ACL rules applied by
SasPatchingModule.
Evidence
logs/startup/smithySoftwareInstall.log,logs/startup/startup.logtools/Smithy/smithy.md(workspace cross-ref)
NoOp.exe (Smithy V1 tools)
What this program actually does
NoOp.exe under tools/Smithy/ is a system file replacement stub used by Smithy V1 DesktopModule. Smithy backs it up to C:\Asgard\IETemp\{32,64}\Noop.exe and deploys it over:
C:\Windows\system32\OpenWith.exeC:\Windows\SysWOW64\OpenWith.exe
This neuters the "Open With" dialog in kiosk mode. The binary is a valid PE that accepts calls gracefully (full SEH frame) rather than crashing.
Also copied to C:\Asgard\Tools\Smithy\Smithy\Noop.exe during install.
Not the same as:
tools/Noop.exe— .NET Bifrost/GameAgent stubservices/SmithyV2/Noop/NoOp.exe— 21 KB immediate-exit placeholder
Windows API surface
| Category | APIs |
|---|---|
| SEH/unwind | RtlCaptureContext, RtlVirtualUnwind, UnhandledExceptionFilter, IsDebuggerPresent |
| CRT | CorExitProcess, ExitProcess, GetModuleHandleW |
Size: 121,456 bytes. PE32+ CUI x64, MSVC 14.35, 7 sections.
Deep extract (Smithy/Smithy/Noop.exe): KERNEL32-only, 21 KB variant exists separately.
Install / runtime timeline
| Time (UTC) | Event | Source |
|---|---|---|
| 18:43:09 | Backed up to IETemp\{32,64}\Noop.exe | Smithy.log |
| 18:43:09 | Overwrite of x64 and WoW64 OpenWith.exe | smithySoftwareInstall.log |
Pandora: Indirect via smithy V1 run during [2/4] Installing Smithy V1.
Disassembly hints
- Full SEH frame (
RtlCaptureContext/RtlVirtualUnwind) — intentional crash-safe stub. - Compare with SmithyV2 NoOp (0xC00 code, no SEH) for size/behavior delta.
- V1 path: trace from Smithy Python
DesktopModule→ file copy to OpenWith paths.
What is NOT verified
- Exact export table (if any) — likely none; stub may only implement minimal PE entry.
- Whether OpenWith replacement survives Smithy V2 session artifact deletion.
Evidence
logs/startup/smithySoftwareInstall.log, Smithy.log
NoOp.exe (SmithyV2)
Repository path: services/SmithyV2/Noop/NoOp.exe
Deployed path: C:\Asgard\services\SmithyV2\Noop\NoOp.exe
What this program actually does
NoOp.exe under services/SmithyV2/Noop/ is a minimal signed stub executable (~21 KB, MSVC 2025) used as a placeholder process target in Smithy V2 profile JSON module chains when a real tool is not required. Entry point runs CRT initialization and exits immediately — main is 3 bytes (essentially xor eax,eax; ret).
Installed as smithy package step [3/4] Installing NoOp. Distinct from Smithy V1 tools/Smithy/NoOp.exe (121 KB, full SEH frame, copied over OpenWith.exe during V1 hardening).
Architecture / control flow
entry0 @ 0x140001264
└─ CRT init (_initterm, SEH registration)
└─ main @ 0x140001000 (3 bytes) → exit(0)Imports: VCRUNTIME140 + api-ms-win-crt-* + 6 KERNEL32 stubs (PID/TID/time/QPC/SEH only).
No networking, filesystem, registry, or process creation.
External interfaces
| Interface | Role |
|---|---|
| Process execution | Invoked as target binary in SmithyV2 JSON profiles |
| Uninstall | tools/SmithyV2/uninstall_noop.bat |
| Install | Smithy package [3/4] copies from noop/bin/NoOp.exe |
No CLI args, stdout output, or Windows service registration.
PE metadata
| Field | Value |
|---|---|
| SHA-256 | 25f1cc4aa0481fa636da848ea9db2399dc76ad78ed456582a44c325dd22fae21 |
| Size | 21,104 bytes |
| Format | PE32+ console x64, signed, compiled 2025-07-12 |
| Subsystem | Windows CUI |
| Code section | ~0xC00 bytes (mostly CRT) |
| Exports | none |
Runtime timeline
| Time (UTC) | Event | Source |
|---|---|---|
| 18:43:15 | [3/4] Installing NoOp | logs/startup/smithySoftwareInstall.log |
| 18:43:15 | Copy to SmithyV2\Noop\; uninstall script deployed | same |
| — | No runtime execution observed in captured logs | — |
Pandora: No direct invocation. Smithy V1 install also copies a different NoOp to tools/Smithy/Smithy/ (V1 path).
Smithy V1 vs V2 NoOp
| Property | V2 (services/SmithyV2/Noop/) | V1 (tools/Smithy/Smithy/) |
|---|---|---|
| Size | 21 KB | 121 KB |
| Role | Profile placeholder | OpenWith.exe replacement |
| Overwrites system files | No (in this snapshot) | Yes — C:\Windows\*\OpenWith.exe |
| SEH frame | Minimal CRT only | Full unwind/SEH |
Failure modes
None meaningful — stub always exits 0 if process can start.
Relationships
| Component | Interaction |
|---|---|
| Smithy V2 profiles | JSON entries reference NoOp as module process target (profiles deleted post-session) |
SmithyControllerPlugin.dll | Orchestrates SmithyCLI; NoOp is separate install artifact |
| V1 Smithy package | Installs different NoOp binary to tools/Smithy/ |
Not verified
- Which SmithyV2 profile JSON entries reference this exact binary path.
- Whether V2 NoOp is ever copied over system files (V1 does for OpenWith).
- Exit code if launched under restrictive ACL (expected 0).
Evidence
- Radare2 on
services/SmithyV2/Noop/NoOp.exe logs/startup/smithySoftwareInstall.log([3/4] Installing NoOp)