Skip to content

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 export

Plugin state machine (log strings): InitializingInitializedStartingStartedStoppingStoppedUninitialized → 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

InterfaceRole
Windows Service SmithyControllerInstalled smithy package [1/4]
Plugin directoryC:\Asgard\services\SmithyV2\SmithyController\
RegistryRegistryStorage per plugin load
LogsC:\Asgard\logs\SmithyV2\SmithyController\NvContainerSmithyController.log
Crash dumpsSmithyControllerCrashDumpConfig.reg applied at install
Hidden windowNvContainerWindowClass%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)

CategoryAPIs
ProcessCreateProcessW, CreateProcessA, Process32FirstW/NextW
Plugin watchFindFirstChangeNotificationW, FindNextChangeNotification
FilesystemCreateDirectoryW, CreateSymbolicLinkW, CreateHardLinkW
MonitoringCreateToolhelp32Snapshot, CreateTimerQueueTimer
SecurityDACL adjustment (Created new DACL with added privileges 0x00100000)
HardeningVectored exception handlers, VirtualProtect

Deep extract: 117 Win32 APIs, 53 nvc:😗 types. PE32+ GUI x64, MSVC 14.39, signed.


Runtime timeline (captured seat)

Time (UTC)EventSource
18:43:08.156Container main v1.45; telemetry initNvContainerSmithyController.log
18:43:08.161Load plugins from SmithyController dirsame
18:43:08.288Secure-load SmithyControllerPlugin.dll (107 ms)same
18:43:08.516Container initialized; service Runningsame
18:43:08.531Plugin Started; init 225,687 µs totalsame
18:48:42.848Plugin notification 3 ("done") → mandatory unloadsame
18:48:42.897Service Stopped; plugin unloadedsame

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)

StringMeaning
Failed to load plugins. ExitingPlugin directory load failure
Base host: mandatory plugin %s has failed. ExitFatal mandatory plugin failure
Failed to complete transition to StartedPlugin failed Starting phase
Plugin count exceeded maximum allowed %uToo many plugins
Container is in suspended state. Skipping plugin initializationSuspend/resume path

(Not observed on captured seat — plugin lifecycle succeeded.)


Relationships

ComponentInteraction
SmithyControllerPlugin.dllSole mandatory plugin; session orchestration
NvContainerGcis.exeSibling NvContainer host (GCIS plugins)
NvContainerGSP.exeSibling host for GSConfigurator
Smithy V2 package[1/4] controller, [3/4] NoOp, [4/4] SmithyCLI

Not verified

  • Full NvContainer plugin ABI beyond NvPluginGetInfo.
  • ServiceConfigThread polling interval and timeout values.
  • Meaning of plugin notification code 3 ("done") at ABI level.
  • Whether NvOptimusEnablement export is invoked on the gameseat.

Evidence

  • Radare2 + strings on NvContainerSmithyController.exe
  • logs/SmithyV2/SmithyController/NvContainerSmithyController.log
  • logs/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 deletion

Uses 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

SurfaceDetails
Bus identitySMITHY:SmithyController, SMITHY:SmithyUecReporter
SSLM peerGfnSdkService:SSLM
Subscribe triggerPandora:SeatReady peer join → SSLM subscription
Handled notificationssession setup start, pre-session trust window end
Protobuf typesNVIDIA.Bifrost.Common.Error, SessionResultCode, SslmApi, GSConfiguratorCommunication
Observed peersGCIS (7 plugins), GfnGuard, Morph, NGS, PIPS, GSConfigurator, CtMT, mb-repeater, StutterShark
Ignored typesGeneric, GsServiceApi, GsTelemetryMessage, SeatConfigurationMessage, GCISInitializationMessage
SmithyCLI spawn peersSMITHY: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

InterfaceRole
NvContainer hostLoaded by NvContainerSmithyController.exe
MessageBusNvMessageBus.dll via getMessageBusInterfaceWithConfig
GSConfiguratorConfig fetch via GSConfigClient
SSLMSession lifecycle notifications/responses
TASTelemetry Aggregator Service connector
Process spawnCreateProcessW for SmithyCLI and modifier tools

PE metadata

FieldValue
SHA-2567d5c1fbeb0f506ba33f39bf2afeae5e1e07589e7f895f1864566301ed1cf21f2
Size7,577,712 bytes
FormatPE32+ DLL x64, canary enabled, signed
ExportNvPluginGetInfo @ 0x180062e70
Compiled2026-04-22

Deep extract: 196 Win32 APIs, 333 C++ RTTI types.


Runtime timeline (captured seat)

Time (UTC)EventSource
18:43:08.405Plugin init; seat type [REDACTED_BASE_ENV]; SSLM sub cancelled (pre-SeatReady)SmithyControllerPlugin.log
18:43:08.515TAS session initiatedsame
18:43:08.531PluginStart; BusHandler subscribes; 38+ peers observedsame
18:43:22.361Pandora:SeatReady → SSLM subscribedsame
18:48:22.418I2P session detected → launch SmithyCLI i2p.jsonsame
18:48:23.387Respond to session setup start (code 0)same
18:48:42.757Pre-session trust window end → delete CLI binary + profilessame
18:48:42.849SSLM unsubscribe; plugin stop; notification 3 to hostsame + container log

Host correlation: NvContainer receives notification 3 → unloads plugin → stops SmithyController service @ 18:48:42.897.


Failure modes

String / conditionMeaning
Failed to create MessageBus observerNvMessageBus.dll missing
TAS not found on MessageBus before exitTAS peer timeout
SmithyController_SmithyV2CliTimedOutCLI exceeded 15000 ms
SmithyController_FailedToDeleteArtifactPost-SOPS cleanup failure
SSLM subscription attempt was cancelledEarly init before SeatReady (expected)

Relationships

ComponentInteraction
NvContainerSmithyController.exePlugin host / service wrapper
smithy.exe (SmithyCLI)Hardening executor spawned per session
GfnSdkService:SSLMSession lifecycle authority
GCIS pluginsObserved on bus; modifiers spawned during boot hardening
PandoraPandora: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.log
  • logs/SmithyV2/SmithyController/NvContainerSmithyController.log
  • logs/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

InterfaceRole
Process executionInvoked as target binary in SmithyV2 JSON profiles
Uninstalltools/SmithyV2/uninstall_noop.bat
InstallSmithy package [3/4] copies from noop/bin/NoOp.exe

No CLI args, stdout output, or Windows service registration.


PE metadata

FieldValue
SHA-25625f1cc4aa0481fa636da848ea9db2399dc76ad78ed456582a44c325dd22fae21
Size21,104 bytes
FormatPE32+ console x64, signed, compiled 2025-07-12
SubsystemWindows CUI
Code section~0xC00 bytes (mostly CRT)
Exportsnone

Runtime timeline

Time (UTC)EventSource
18:43:15[3/4] Installing NoOplogs/startup/smithySoftwareInstall.log
18:43:15Copy to SmithyV2\Noop\; uninstall script deployedsame
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

PropertyV2 (services/SmithyV2/Noop/)V1 (tools/Smithy/Smithy/)
Size21 KB121 KB
RoleProfile placeholderOpenWith.exe replacement
Overwrites system filesNo (in this snapshot)Yes — C:\Windows\*\OpenWith.exe
SEH frameMinimal CRT onlyFull unwind/SEH

Failure modes

None meaningful — stub always exits 0 if process can start.


Relationships

ComponentInteraction
Smithy V2 profilesJSON entries reference NoOp as module process target (profiles deleted post-session)
SmithyControllerPlugin.dllOrchestrates SmithyCLI; NoOp is separate install artifact
V1 Smithy packageInstalls 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: SystemFilesModuleSasPatchingModuleDesktopModuleGSConfiguratorModule (skipped).


CLI interface

smithy.exe [-s on|off] [-p <profile>]
FlagBehavior
-s onEnable shell hardening mode
-p default[REDACTED_BASE_ENV] GFN desktop profile (replaces explorer with gfndesktop)
-p openExplorer 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, replace OpenWith.exe with NoOp stub
  • Attempt explorer.exegfndesktop.exe swap
  • Configure WerSvc, create kiosk scheduled task
  • Backup originals to C:\Asgard\IETemp\{32,64}\

Windows API surface

From deep extract + PyInstaller bootloader:

CategoryAPIs
Process spawnCreateProcessW — wraps icacls, takeown, taskkill, schtasks, net, sc
FilesystemCreateDirectoryW, CreateSymbolicLinkW, GetFileAttributesExW, GetFinalPathNameByHandleW
EnvironmentGetEnvironmentVariableW, SetEnvironmentVariableW, SetDllDirectoryW
TokenOpenProcessToken, GetTokenInformation
PyInstaller loopCreateWindowExW, RegisterClassW, GetWindowLongPtrW, SetWindowLongPtrW, SetConsoleCtrlHandler

Embedded: python311.dll, PyImport_ExecCodeModule, [PYI-%d:ERROR] strings. Size: 7,996,784 bytes.


Install timeline

Time (UTC)EventSource
18:43:07Smithy VHDX mounted at O:\startup.log [12/14]
18:43:07–15O:\deploy\install.bat (8.0s)smithySoftwareInstall.log
18:43:09[2/4] Installing Smithy V1 → runs smithy.exesame
18:43:09Zone [REDACTED_ZONE], production seatSmithy.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_ExecCodeModule in bootloader section.
  • Module names are plain strings: smithy_modules.gfn_desktop, etc.
  • All external ops via CreateProcessW wrapping CLI tools — trace argument construction there.

What is NOT verified

  • Full -s/-p option set beyond default and open.
  • Whether smithy_mb registers 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.log
  • tools/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.exe
  • C:\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 stub
  • services/SmithyV2/Noop/NoOp.exe — 21 KB immediate-exit placeholder

Windows API surface

CategoryAPIs
SEH/unwindRtlCaptureContext, RtlVirtualUnwind, UnhandledExceptionFilter, IsDebuggerPresent
CRTCorExitProcess, 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)EventSource
18:43:09Backed up to IETemp\{32,64}\Noop.exeSmithy.log
18:43:09Overwrite of x64 and WoW64 OpenWith.exesmithySoftwareInstall.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

InterfaceRole
Process executionInvoked as target binary in SmithyV2 JSON profiles
Uninstalltools/SmithyV2/uninstall_noop.bat
InstallSmithy package [3/4] copies from noop/bin/NoOp.exe

No CLI args, stdout output, or Windows service registration.


PE metadata

FieldValue
SHA-25625f1cc4aa0481fa636da848ea9db2399dc76ad78ed456582a44c325dd22fae21
Size21,104 bytes
FormatPE32+ console x64, signed, compiled 2025-07-12
SubsystemWindows CUI
Code section~0xC00 bytes (mostly CRT)
Exportsnone

Runtime timeline

Time (UTC)EventSource
18:43:15[3/4] Installing NoOplogs/startup/smithySoftwareInstall.log
18:43:15Copy to SmithyV2\Noop\; uninstall script deployedsame
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

PropertyV2 (services/SmithyV2/Noop/)V1 (tools/Smithy/Smithy/)
Size21 KB121 KB
RoleProfile placeholderOpenWith.exe replacement
Overwrites system filesNo (in this snapshot)Yes — C:\Windows\*\OpenWith.exe
SEH frameMinimal CRT onlyFull unwind/SEH

Failure modes

None meaningful — stub always exits 0 if process can start.


Relationships

ComponentInteraction
Smithy V2 profilesJSON entries reference NoOp as module process target (profiles deleted post-session)
SmithyControllerPlugin.dllOrchestrates SmithyCLI; NoOp is separate install artifact
V1 Smithy packageInstalls 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)

admindesk.top — Reversed & documented from Asgard rig backups and GCIS plugin binaries.