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): 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 ​

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: SystemFilesModule → SasPatchingModule → DesktopModule → GSConfiguratorModule (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.exe → gfndesktop.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.