Skip to content

GCIS Plugin System

This page now owns the GCIS host and plugin-system reverse-engineering notes from the 2026-05-19 Asgard snapshot. Individual plugin pages live in this Plugins category rather than under /reverse-engineering/ duplicates.

2026-05-19 application notes

NvContainerGcis.exe

What this program actually does

NvContainerGcis.exe is the Windows service host for GCIS (Grid Cloud Init Security) on a GeForce NOW gameseat. It implements NVIDIA NvContainer v1.45, loads seven mandatory security plugins from services/GCIS/plugins/, and orchestrates their lifecycle: secure load → initialize → start → stop → unload. It does not implement seat security policy itself; it is the process supervisor that keeps all GCIS plugins running in one SYSTEM service (GCIS).

If any mandatory plugin fails during Starting, the container tears down all plugins and exits — observed exit code 14109 in this snapshot.


Architecture / control flow (recovered symbols)

main / ServiceHost
  └─ nvc::ServiceHost / NvcServiceHost
        └─ nvc::HostWin32 (dynamic plugin load/unload disabled on seat)
              └─ nvc::PluginManager
                    ├─ RegistryStorage (per-plugin config during load)
                    ├─ Secure plugin load (NvcPluginLoadHel)
                    └─ State machine: Unloaded → Initializing → Initialized → Starting → Started
                          │ fail (mandatory) → Stopping → Stopped → Uninitializing → Unloaded → container exit
                          └─ MessageQueue (plugin notifications)

RTTI classes (strings): ServiceHost, PluginConfig, RegistryStorage, MessageQueue, DirectoryListenerWin32, DefaultContainerConfig, HostWin32.

Export: NvPluginGetInfo is used by plugins, not this EXE. This EXE exports NvOptimusEnablement (Optimus-related; seat usage not verified).

Build path string: C:\dvs\p4\build\sw\gcomp\rel\src\NvContainer\...\NvContainer.pdb


External interfaces

InterfaceRole
Windows Service GCISInstalled/stopped via services/GCIS/Uninstall.bat (net stop GCIS, sc delete GCIS)
Plugin directory%AG_HOME%\services\GCIS\plugins\ — loads ElmPlugin, GciPlugin, GcpPlugin, GssmPlugin, LkmPlugin, UadMLPlugin, UadPlugin
RegistryRegistryStorage created for each plugin load (config source not in workspace)
Logs%AG_LOGS%\GCIS\NvContainerGcis.log
Message busIndirect — plugins use GSConfigClient; host forwards system messages to plugins
DACL adjustmentOn start: Created new DACL with added privileges 0x00100000 for child process

No direct network/RPC surface in this binary — all external I/O is via loaded plugins.


Plugin lifecycle API (inferred from strings + logs)

Function / componentBehavior
NvcPluginManager::LoadSecure-load DLL, query NvPluginGetInfo, mark mandatory
Initiate transition to InitializingAsync plugin init; notification code 1 = success
Initiate transition to StartingPluginStart task in each plugin
Notification 2 from pluginFailure during Starting (observed for all GCIS plugins)
NvcPluginUnloadStatsPer-plugin stop/uninit timing telemetry
Base host: mandatory plugin %s has failed. ExitFatal path
AllowDynamicPluginLoad / AllowDynamicPluginUnloadDisabled on gameseat (Dynamic loading of plugins is disabled)

Runtime timeline (from logs/GCIS/NvContainerGcis.log)

Time (local)Event
19:04:51.902Container main v1.45, telemetry API init
19:04:51.906Load plugins from C:\Asgard\services\GCIS\plugins
19:04:51.906–52.264Secure-load all 7 mandatory plugins (versions 1.0.0.0 / 2.0.0.0)
19:04:52.264–52.882All plugins reach Initialized (notification 1)
19:04:52.882Container initialized; service reports Running
19:04:52.882Parallel transition to Starting for all plugins
19:04:53.028–53.052All mandatory plugins fail Starting (notification 2)
19:04:53.053–53.084Unload/stop each plugin; Failed to complete transition to Started
19:04:53.084Container exit; service Stopped, exit code 14109

Root cause (from plugin logs): each plugin’s PluginStart fetches GcisConfigData from GSConfigurator → OBJECT_NOT_FOUND → container abort.


Failure modes (error strings)

StringMeaning
Failed to load plugins. ExitingPlugin directory load failure
Failed to complete transition to StartedOne or more mandatory plugins failed Starting
Async state transition failure is detected for %s pluginPlugin reported failure asynchronously
Base host: mandatory plugin %s has failed. ExitFatal mandatory plugin failure
Failed to initialize RegistryStorage with statusRegistry config access failure
Plugin count exceeded maximum allowed %uToo many plugins configured

Relationships

ComponentInteraction
GCIS plugins (7 DLLs)Loaded/managed by this host
NvContainerGSP.exeSibling container; hosts GSConfigurator (config authority)
GSConfiguratorPluginPlugins fetch GcisConfigData, ZoneConfig, SeatConfig via message bus
mb-repeaterForwards GciPluginSysmon / ProcessEventMessage broadcasts
GciSchCo-uninstalled with GCIS per Uninstall.bat

Not verified

  • Exact GCIS acronym expansion.
  • Service install registry keys / SCM configuration (not in workspace).
  • Meaning of exit code 14109.
  • Whether NvOptimusEnablement export is invoked on the gameseat.
  • Container JSON/XML config file location (only RegistryStorage referenced in logs).

Evidence

  • strings / objdump -p on services/GCIS/NvContainerGcis.exe
  • logs/GCIS/NvContainerGcis.log, NvContainerGcis.log_backup1
  • services/GCIS/Uninstall.bat
  • Plugin logs under logs/GCIS/*Plugin*.log

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