Skip to content

NDC and GSP

GSP, GSConfigurator, MessageBus, NDC, PipsController, and NDC plugin notes are consolidated here from the 2026-05-19 snapshot.

2026-05-19 application notes

NvContainerGSP.exe

What this program actually does

NvContainerGSP.exe is the GameSeat Platform (GSP) NvContainer host process on an Asgard/GFN gameseat. It runs as a Windows service, loads mandatory plugins from %AG_HOME%\services\GSP\plugins, and provides the local configuration authority (GSConfigurator) and cross-session message bus broadcast infrastructure that all other seat services depend on.

Container version: v1.49. Unlike GCIS, GSP succeeded and remained running throughout the captured session.


Architecture / control flow

NvContainerGSP.exe (ServiceHost / HostWin32)
  ├─ NvcPluginManager — mandatory plugin lifecycle
  ├─ NvMessageBusBroadcast.dll — no Start transition (Initialized → Started immediately)
  │     └─ IMessageBusBroadcastServer, reads messagebus.conf
  └─ GSConfigurator/GSConfiguratorPlugin.dll
        ├─ ConfigManager — ZoneConfig, SeatConfig, GcisConfigData, ContentConfig, ...
        ├─ HandleGetConfiguration — MB RPC handler
        └─ TAS telemetry session

Core RTTI (nvc::): ServiceHost, HostWin32, PluginManager, RegistryStorage, DirectoryEnumerator, DefaultContainerConfig.

PE: x86-64, MSVC 14.39, no CLR. PDB: NvContainer.pdb from Perforce build tree.


External interfaces

Plugin directory scan
PathLoaded as
plugins/messagebus.confProcessed by DirectoryEnumerator (config for broadcast plugin)
plugins/NvMessageBusBroadcast.dllMandatory plugin v3.22.3719.8856
plugins/GSConfigurator/GSConfiguratorPlugin.dllMandatory plugin v2.0.0.0
Windows service
  • Reports Start-pendingRunning → stays Running
  • DACL adjustment with privilege 0x00100000 for process
  • Quit forbiddance: GSConfigurator sets quit disabled at session start (18:48:42)
Registry
  • RegistryStorage per plugin load (same pattern as GCIS)
Message Bus (indirect)
  • Does not embed MessageBus client itself; plugins connect to broadcast server started by NvMessageBusBroadcast

Runtime timeline

Time (UTC)EventSource
18:42:47.400Container main v1.49, telemetry initNvContainerGsp.log
18:42:47.474NvMessageBusBroadcast secure-loaded (62 ms)NvContainerGsp.log
18:42:47.530GSConfiguratorPlugin secure-loaded (32 ms)NvContainerGsp.log
18:42:47.534NvMessageBusBroadcast → Initialized (no explicit Start)NvContainerGsp.log
18:42:47.578GSConfiguratorPlugin InitializedNvContainerGsp.log
18:42:47.579Container Running; Starting GSConfiguratorPluginNvContainerGsp.log
18:42:47.596Both plugins Started; total load ~213 msNvContainerGsp.log
18:42:48–18:43:25NvMessageBusBroadcast receives system messages (peer joins)NvContainerGsp.log
18:43:01GSConfigurator serves GcisConfigData to first GCIS run (success)GSConfiguratorPluginCurrent.log
18:48:42.755GSConfigurator sets quit forbiddance true (active session)NvContainerGsp.log
19:04:52–19:04:53Second GCIS run: ZoneConfig/SeatConfig OK, GcisConfigData failsGSConfiguratorPluginCurrent.log

Failure modes

ConditionLog / behavior
Mandatory plugin init/start failureSame pattern as GCIS: mandatory plugin X has failed, container exit
Dynamic plugin load attemptedDynamic loading of plugins is disabled
Core failureCore failed → unload all plugins
Plugin config disabledPlugin %s is now disabled in config (string present; not seen in log)

GSP did not fail in this snapshot — failure mode documented from shared NvContainer strings and GCIS counterpart.


Not verified

  • GSP acronym expansion (not in binary strings).
  • Whether GSP container reloads config without restart.
  • Exact service name registered with SCM.
  • Relationship between GSP quit forbiddance and session manager teardown.

Evidence

  • strings / RTTI on services/GSP/NvContainerGSP.exe
  • logs/GSP/NvContainerGsp.log
  • logs/GSP/GSConfiguratorPluginCurrent.log
  • Comparison with logs/GCIS/NvContainerGcis.log (v1.45, exit 14109)

GSConfiguratorPlugin.dll

What this program actually does

GSConfiguratorPlugin.dll is the seat configuration server for GeForce NOW gameseats. It loads zone/seat/content config files at startup, exposes them via GetConfiguration RPC on the NVIDIA Message Bus (endpoint GSConfigurator), and serves as the single source of truth for GCIS plugins (GcisConfigData), AutoOnboarder (ContentConfig, SasConfigData), CLI tools, and other seat services.

Build: version 2.0 2026-05-12-d72d50d. DLL version 2.0.0.0.


Architecture / control flow

NvContainerGSP.exe
  └─ GSConfiguratorPlugin.dll
        ├─ GspPluginTaskQueue / GspDeferredTaskQ
        ├─ ConfigManager
        │     ├─ Load configs at PluginStart (profile '[REDACTED_PROFILE]', environment '[REDACTED_BASE_ENV]')
        │     ├─ GetConfiguration(config, property) → protobuf response
        │     └─ Access control / metrics (GSConfiguratorMetrics)
        ├─ HandleGetConfiguration — async via MessageProcessorQueue
        ├─ GSConfiguratorServiceAPI (protobuf)
        │     ├─ Request.GetConfiguration
        │     └─ Response.GetConfigurationResponse
        └─ GSConfiguratorTa — TAS telemetry session

Key RTTI: ConfigManager, GsConfiguratorPlugin, GSConfiguratorServiceAPI_Request_GetConfiguration, AttributesSchemaVersion1Validator, AccessDeniedEvent@GSConfiguratorMetrics.


External interfaces

GSConfigurator Service API (Message Bus RPC)
RPCRequestResponse
GetConfigurationconfig + optional property pathFull config blob or property subtree

Observed config keys in logs:

Config keyTypical consumer
ZoneConfigAll GCIS plugins, nvctmtsvc, CLI
SeatConfigAll GCIS plugins, seat identity
GcisConfigDataAll GCIS plugins at PluginStart (mandatory)
ContentConfigAutoOnboarder / content tools
SasConfigDataSAS onboarding
Message Bus
  • Endpoint: GSConfigurator
  • Peer naming: GSPrerequisites:GSConfigClient_<pid>_...
  • Logs caller PID, user, service list, executable path for each request
Files / paths
  • Config loaded from seat-local files (exact paths not in logs; ConfigManager: Successfully loaded configs)
  • Reference string: messagebus.conf path under NvContainer install dir

Runtime timeline

Time (UTC)EventSource
18:42:47.559Module GSConfigurator, TAS session initiatedGSConfiguratorPluginCurrent.log
18:42:47.587ConfigManager: Successfully loaded configsGSConfiguratorPluginCurrent.log
18:42:47.596Started on '[REDACTED_BASE_ENV]' Seat with profile '[REDACTED_PROFILE]'GSConfiguratorPluginCurrent.log
18:42:48.139GetConfiguration ZoneConfig from gsconfiguratorcli (OK)GSConfiguratorPluginCurrent.log
18:42:58.647GetConfiguration SeatConfig from nvctmtsvc (OK)GSConfiguratorPluginCurrent.log
18:43:01.777–18:43:01.913Seven GcisConfigData requests from GCIS PID 4940 — all OKGSConfiguratorPluginCurrent.log
19:04:52.326–19:04:52.785Second GCIS init: ZoneConfig + SeatConfig OK (14 requests)GSConfiguratorPluginCurrent.log
19:04:53.024–19:04:53.051Seven GcisConfigData requests — all fail: property not foundGSConfiguratorPluginCurrent.log
18:48:42.755Quit forbiddance set (session active)NvContainerGsp.log

Critical finding: GcisConfigData present at 18:43, absent at 19:04 — ConfigManager state changed between GCIS restarts; not a GSConfiguratorPlugin crash.


Failure modes

ConditionLog / error
Property not in configOBJECT_NOT_FOUND (0x80ec0006): Property 'GcisConfigData' not found at path 'GcisConfigData'
Config load failureConfigManager load errors (not seen — load succeeded)
Access deniedAccessDeniedEvent@GSConfiguratorMetrics (RTTI; not seen in log)
Terminated by CCSRC_TerminatedByContentController (string in binary)
Fail-safe configCreateFailSafeConfig API present for degraded mode

Not verified

  • On-disk config file paths and format (JSON/XML/protobuf).
  • Why GcisConfigData disappeared between 18:43 and 19:04 (session teardown side effect? config reload?).
  • Full list of config keys beyond those seen in logs.
  • GetConfiguration access control rules per caller service.

Evidence

  • strings / RTTI on services/GSP/plugins/GSConfigurator/GSConfiguratorPlugin.dll
  • logs/GSP/GSConfiguratorPluginCurrent.log
  • logs/GSP/NvContainerGsp.log
  • logs/GCIS/GciPluginCurrent.log, GciPluginOld.log (consumer side)

MessageBus.dll

What this program actually does

MessageBus.dll (x64) is the v3 NVIDIA Message Bus client library loaded by seat services and GCIS/GSP plugins at runtime. It connects to the NvMessageBusBroadcast pipe server, implements peer registration/JOIN protocol, serializes BusMessage protobuf packets, and delivers messages to BusObserver listeners in-process.

Deployed at services/GSP/Messagebus/x64/MessageBus.dll (7.5 MB). A separate x86 build exists for 32-bit clients. Plugins link against NvMessageBus.dll which wraps this core transport.


Architecture / control flow

Consumer process (plugin, service, CLI)
  └─ NvMessageBus.dll (facade)
        └─ MessageBus.dll
              ├─ MessageBusImpl — core client
              ├─ PipeEndpoint
              │     ├─ Connect / Accept to Broadcast process
              │     ├─ OnPipeRead → parse BusMessage protobuf
              │     └─ OnPipeWrite — outbound queue
              ├─ BusObserver / BusObserverInterface_v2/v3
              ├─ BusPeer — local peer identity (SystemName:ModuleName)
              └─ Poco networking + protobuf serialization

Key RTTI: BusMessage, BusMessage_Peer, BusMessage_Generic, BusObserver, BusPeer, Bus_Peer, MessageBusImpl, PipeEndpoint, Poco Application, Context, SSL types.


External interfaces

Connection to broadcast server
StepBehavior
Load configPath from {variables} in v3 schema; reads messagebus.conf
Connect pipePipeEndpoint::Connect on handle → broadcast process PID
JOINSends peer identity; receives JOIN broadcast from other peers
Message dispatchOnPipeRead: Locking observers before notifying via OnBusMessage
BusMessage types
TypePurpose
BusMessage.PeerPeer join/leave/status
BusMessage.GenericApplication RPC/notification payload
BusMessage.StatusError/ack status
BusMessage.EncryptedBusMessageEncrypted payload wrapper
BusMessage.EncryptionSetupSession key setup
Configuration schema (embedded JSON)
  • MessageBusPort, DefaultPeerConfig, Peers[], CrossSessionPeers
  • AllowCrossSessionCommunication: true default in seat config
Logging
  • MessageBus_*.log, MessageBus_*.log_backup rotation pattern

Runtime timeline

Time (UTC)EventEvidence
18:42:47.596GSP plugins started; broadcast server listeningNvContainerGsp.log
18:42:48+Multiple services connect (system message storm on broadcast plugin)NvContainerGsp.log
18:43:01.362GCIS GSConfigClient: Listener connected to message bus with 21 peersGciPluginOld.log
18:43:01.796GciPlugin Start fetch: bus grows to 29 peersGciPluginOld.log
19:04:52.419Second GCIS: SslmSubscriptionTracker sees 76→94 peersGciPluginCurrent.log

Peer count growth in logs confirms active MessageBus.dll clients across seat services.


Failure modes

Error stringMeaning
MessageBusImpl::post endpoint is NULLSend before connect
Cannot create an instance of MessageBusImplFactory/init failure
transportFactory cannot be nullTransport layer missing
OnPipeRead: received invalid protobuf packetDeserialize failure
PipeEndpoint Accept failed ... error %uPipe connect failure
Pipe Disconnect (%u) from BroadcasterServer-side disconnect

Not verified

  • Exact DLL load path resolution ({ProgramFiles} / {ProgramData} variables).
  • SSL/TLS usage for encrypted bus messages on localhost pipes.
  • v2 vs v3 client compatibility (BusObserverInterface_v2 present).

Evidence

  • strings / RTTI on services/GSP/Messagebus/x64/MessageBus.dll
  • services/GSP/Messagebus/x64/messagebus.conf
  • logs/GSP/NvContainerGsp.log
  • GCIS plugin logs (GSConfigClient peer connection lines)

NvMessageBus.dll

What this program actually does

NvMessageBus.dll (x64) is the public Message Bus client facade used by GCIS/GSP plugins and seat services. It wraps MessageBus.dll transport, exposes IMessageBus / IMessageBusListener interfaces (via MessageBusClient namespace), and provides the get_shared_message_bus_peer factory used throughout gsprerequisites (GSConfigClient, plugin stubs).

Deployed at services/GSP/Messagebus/x64/NvMessageBus.dll (3.5 MB). x86 build at Messagebus/x86/NvMessageBus.dll for WoW64 clients.


Architecture / control flow

Plugin / service (e.g. GciPlugin, GSConfigurator)
  └─ gsprerequisites::get_shared_message_bus_peer(address, config_path, listener)
        └─ NvMessageBus.dll
              ├─ IMessageBus / IMessageBusListener (MessageBusClient)
              ├─ IMessageBusConfig — config path + peer address
              ├─ MessageBusImpl (delegates to MessageBus.dll)
              └─ BusObserverInterface_v3 — callback dispatch

All seven GCIS plugins and GSConfiguratorPlugin import this stack (RTTI: UIMessageBus@MessageBusClient, UIMessageBusListener@MessageBusClient, UIBusMessage@MessageBusClient).


External interfaces

Factory API (inferred from logs + RTTI)
FunctionPurpose
get_shared_message_bus_peerCreate or reuse peer by address + config path
Peer naming{SystemName}:{ModuleName} e.g. GSPrerequisites:GSConfigClient_<pid>_...
Listener callbacksOnConnected, message delivery via IBusMessage
Configuration
  • Reads IMessageBusConfig — typically points to messagebus.conf
  • JSON schema embedded in MessageBus.dll (CrossSessionPeers, DefaultPeerConfig)
Protobuf integration
  • BusMessage@MessageBusClient wraps payload bytes
  • Plugins serialize domain protobuf into Generic bus messages

Runtime timeline

Time (UTC)EventSource
18:42:47.578GSConfigurator initializes MB listenerGSConfiguratorPluginCurrent.log
18:43:01.338GciPlugin: Creating new peer GSConfigClient_4940_...GciPluginOld.log
18:43:01.362Listener connected to message bus with 21 peersGciPluginOld.log
18:43:01.362GSConfigurator joined the bus. Fetching requested configsGciPluginOld.log
19:04:52.395Second run: new peer GSConfigClient_12224_..., 76 peersGciPluginCurrent.log
19:04:52.419GSConfigurator joined the bus — init fetch OKGciPluginCurrent.log
19:04:53.010Start fetch peer connects with 90 peers — GcisConfigData failsGciPluginCurrent.log

MB connectivity succeeded in both GCIS attempts; failure was GSConfigurator config content.


Failure modes

ConditionImpact
Broadcast server not runningWaiting for the connection with message bus (blocks until GSP up)
GSConfigurator not on busWaiting for GSConfigurator to join the message bus
Config path invalidIMessageBusConfig load failure (not seen)
Peer address collisionRe-use path: Re-using existing peer (normal)

Not verified

  • Exported symbol names beyond gsprerequisites wrappers.
  • Thread-safety model for shared peer reuse.
  • Whether x64 NvMessageBus.dll is loaded by GCIS from GSP Messagebus path or copied locally.

Evidence

  • strings / RTTI on services/GSP/Messagebus/x64/NvMessageBus.dll
  • All GCIS plugin logs (GSConfigClientUt lines)
  • logs/GSP/GSConfiguratorPluginCurrent.log
  • Cross-ref: MessageBus.dll transport doc in same folder

NvMessageBusBroadcast.dll

What this program actually does

This document covers the Messagebus deployment copy at services/GSP/Messagebus/x64/NvMessageBusBroadcast.dll. It is byte-identical (MD5 eb32aacdf75a7d03e19179639618870f) to the NvContainer plugin copy at services/GSP/plugins/NvMessageBusBroadcast.dll.

The DLL implements the cross-session Message Bus broadcast server — named-pipe hub that relays BusMessage protobuf traffic between SYSTEM-session services (GCIS, GSP, AutoOnboarder) and user-session streaming components (SSAU/AppSensor, NvStreamControl).

Version 3.22.3719.8856. Loaded at runtime by NvContainerGSP from the plugins path; this Messagebus copy is the canonical redistributable for other installers referencing {InstallPath}.


Architecture / control flow

NvMessageBusBroadcast.dll
  ├─ IMessageBusBroadcastServer — plugin/server entry
  ├─ FileMessageBusConfig → messagebus.conf (co-located in Messagebus/x64/)
  ├─ PipeServer (CreateNamedPipeW)
  │     └─ PipeServerConnection × N clients
  ├─ Session router
  │     ├─ ANY_SESSION broadcasts
  │     ├─ Target session filtering
  │     └─ CrossSessionPeers ACL from config
  └─ BusMessage protobuf codec

See also: plugin-path doc at services/GSP/plugins/NvMessageBusBroadcast.md (same binary, plugin lifecycle context).


External interfaces

Files
FileRole
Messagebus/x64/messagebus.confIdentical to plugins/messagebus.conf (6839 bytes)
MessageBusBroadcast.logServer-side log (string reference)
Named pipes
  • PipeServer / CreateNamedPipeW — multi-client accept loop
  • Clients: MessageBus.dll PipeEndpoint in each connecting process
Config highlights (messagebus.conf)
json
"DefaultPeerConfig": { "AllowCrossSessionCommunication": true }
"CrossSessionPeers": [
  { "SystemName": "SSAU", "ModuleName": "AppSensor" } 
  { "SystemName": "GCIS", "ModuleName": "UadPlugin" | "UadMLPlugin" }
]
RTTI interfaces

IMessageBusBroadcastServer, IMessageBusConfig, DefaultMessageBusConfig, FileMessageBusConfig, IMessageTransport, IPipeEndpointObserver.


Runtime timeline

Time (UTC)EventSource
18:42:47.404NvContainerGSP reads plugins/messagebus.conf before loadNvContainerGsp.log
18:42:47.474Broadcast plugin loaded from plugins/ path (uses same binary)NvContainerGsp.log
18:42:48–18:48:43Continuous peer JOIN system messagesNvContainerGsp.log
18:43:01GCIS plugins connect; peer count 21→29 on busGciPluginOld.log
19:04:52Second GCIS connect; peer count 76→94GciPluginCurrent.log

The Messagebus/x64 copy is not separately loaded in this snapshot — NvContainer uses plugins/ copy. Both paths exist for packaging.


Failure modes

Error stringMeaning
CreateNamedPipeW failedServer cannot start — all MB clients fail to connect
Failed to accept pipe connectionClient connect error
Peer is not allowed to send message to non-default sessionCross-session ACL violation
without SharedService role!Peer missing role for join notifications
OnPipeRead: received invalid protobuf packetWire format error
Failed to print session statisticsDiagnostics only

If broadcast server fails, all GSConfigClient peers block at Waiting for the connection with message bus.


Not verified

  • Why two deploy paths (plugins vs Messagebus/x64) if identical — likely installer vs dev layout.
  • Pipe naming convention and max concurrent clients.
  • Hot reload of messagebus.conf without container restart.

Evidence

  • services/GSP/Messagebus/x64/NvMessageBusBroadcast.dll (MD5 matches plugins copy)
  • services/GSP/Messagebus/x64/messagebus.conf
  • logs/GSP/NvContainerGsp.log
  • strings extraction (IMessageBusBroadcastServer, cross-session strings)

NvMessageBusBroadcast.dll

What this program actually does

NvMessageBusBroadcast.dll is an NvContainer mandatory plugin (not a standalone EXE) that implements the cross-session NVIDIA Message Bus broadcast server. It reads messagebus.conf, creates named-pipe endpoints, and relays BusMessage protobuf packets between peers in different Windows sessions (SYSTEM services vs user streaming session).

Loaded by NvContainerGSP.exe at plugins/NvMessageBusBroadcast.dll. Version 3.22.3719.8856. Identical binary also deployed at Messagebus/x64/NvMessageBusBroadcast.dll.


Architecture / control flow

NvContainerGSP.exe
  └─ NvMessageBusBroadcast.dll (plugin entry)
        ├─ IMessageBusBroadcastServer
        ├─ DefaultMessageBusConfig / FileMessageBusConfig
        │     └─ reads messagebus.conf (JSON schema)
        ├─ PipeServer
        │     ├─ CreateNamedPipeW — accept client connections
        │     └─ PipeServerConnection — per-client IO
        ├─ Message routing
        │     ├─ JOIN broadcast on peer connect
        │     ├─ Session-aware delivery (ANY_SESSION, target session)
        │     └─ CrossSessionPeers filter enforcement
        └─ Logging → MessageBusBroadcast.log

Key RTTI: IMessageBusBroadcastServer, IMessageBusConfig, DefaultMessageBusConfig, FileMessageBusConfig, PipeServer, PipeServerConnection, BusMessage_*.


External interfaces

Configuration file
  • messagebus.conf — JSON schema with:
    • MessageBusPort, DefaultPeerConfig.AllowCrossSessionCommunication
    • Peers[] with Address.SystemName/ModuleName and CrossSessionPeers[] ACLs
    • Example: SSAU AppSensor → GCIS UadPlugin/UadMLPlugin (SYSTEM user S-1-5-18)
Named pipes
ComponentAPIPurpose
PipeServerCreateNamedPipeWListen for MessageBus client connections
PipeServerConnectionOverlapped IOPer-connection read/write
Client libraryConnect to broadcast processPipe connected to Broadcast process %u
BusMessage protobuf types

BusMessage.Peer, BusMessage.Generic, BusMessage.Status, BusMessage.EncryptedBusMessage, BusMessage.EncryptionSetup.

Role enforcement
  • SharedService role required for cross-session join notifications
  • Peer is not allowed to send message to non-default session — ACL violation

Runtime timeline

Time (UTC)EventSource
18:42:47.404DirectoryEnumerator processes messagebus.confNvContainerGsp.log
18:42:47.474Secure-load NvMessageBusBroadcast (62 ms)NvContainerGsp.log
18:42:47.534Initialized → Started immediately (StartProcTime = 0)NvContainerGsp.log
18:42:48.189+Plugin NvMessageBusBroadcast received system message (peer join storm)NvContainerGsp.log
18:43:01Burst of system messages as GCIS plugins join busNvContainerGsp.log
18:48:23–18:48:43Heavy system message activity during session startNvContainerGsp.log
19:04:52System messages as second GCIS attempt joins (then fails)NvContainerGsp.log

Broadcast server remained healthy throughout — GCIS failure was config-side, not bus-side.


Failure modes

Error stringMeaning
CreateNamedPipeW failed: %uPipe server cannot bind
Failed to accept pipe connectionClient connect error
OnPipeRead: received invalid protobuf packetCorrupt bus message
Peer is not allowed to send message to non-default sessionCross-session ACL deny
without SharedService role! ... peer not receiving join notificationsMisconfigured peer role
Failed to destroy PipeServerConnection / PipeServerCleanup errors on shutdown

Not verified

  • Exact pipe name pattern (likely seat-specific or port-derived from MessageBusPort: 1).
  • Encryption setup handshake (BusMessage.EncryptionSetup) key exchange details.
  • Whether broadcast plugin hot-reloads messagebus.conf.

Evidence

  • strings / RTTI on services/GSP/plugins/NvMessageBusBroadcast.dll
  • services/GSP/plugins/messagebus.conf
  • logs/GSP/NvContainerGsp.log
  • MD5 match with services/GSP/Messagebus/x64/NvMessageBusBroadcast.dll

NvContainerNDC.exe

What it does

NvContainerNDC.exe is the Windows service host for NDC (NVIDIA Data Collector) on a GeForce NOW gameseat. It implements NVIDIA NvContainer v1.45, loads the optional _NdcPlugin.dll from services/NDC/plugins/, and manages plugin lifecycle: secure load → initialize → start → stop → unload.

Unlike sibling containers (e.g. GCIS), this host has dynamic plugin load/unload enabled and uses JsonFileStorage with _NdcPlugin.json (ModuleMap) instead of registry-only config. It does not implement capture policy itself; it is the process supervisor for the NDC plugin stack.


Architecture

Windows Service "NDC" (WIN32_OWN_PROCESS, PID 5608 in install log)
  └─ NvContainer main v1.45
        └─ nvc::ServiceHost / NvcServiceHost
              └─ nvc::HostWin32 (dynamic plugin load/unload ENABLED)
                    └─ nvc::PluginManager
                          ├─ JsonFileStorage (_NdcPlugin.json ModuleMap)
                          ├─ Secure plugin load (NvcPluginLoadHel)
                          ├─ DirectoryListenerWin32 (plugins/ hot-reload)
                          └─ State machine: Unloaded → Initializing → Initialized → Starting → Started

RTTI classes (deep extract): ServiceHost, HostWin32, PluginConfig, JsonFileStorage, MessageQueue, DirectoryListenerWin32, DefaultContainerConfig, DirectoryEnumerator.

Export: NvOptimusEnablement (sole export; Optimus-related; seat usage Not verified).

Build path (PDB string): C:\dvs\p4\build\sw\gcomp\rel\src\NvContainer\_out\x86_64\release\container\NvContainer.pdb


External interfaces

InterfaceRole
Windows Service NDCCreated by NDC installer (logs/startup/ndcSoftwareInstall.log); stopped/removed via services/NDC/Uninstall.bat
Plugin directory%AG_HOME%\services\NDC\plugins\ — loads _NdcPlugin.dll (optional)
ModuleMap JSONplugins/_NdcPlugin.json maps NvMessageBus.dll path for plugin runtime
NvContainerLS junctionUninstall.bat references %ProgramFiles%\NVIDIA Corporation\NvContainer\plugins\LocalSystem\NDC — install path Not verified in workspace
Logs%AG_LOGS%\NDC\NvContainerNDC.log
DACL adjustmentOn start: Created new DACL with added privileges 0x00100000 for child process (PID 5608)
Message busIndirect — _NdcPlugin uses NvMessageBus.dll from ModuleMap

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


API table

Function / componentBehavior
NvcPluginManager::LoadSecure-load DLL, query NvPluginGetInfo, mark optional/mandatory
Initiate transition to InitializingAsync plugin init; notification 1 = success
Initiate transition to StartingPluginStart task in plugin
NvcPluginLoadStatsPer-plugin load/init/start timing telemetry
DirectoryListenerWin32Watches plugins/ for add/remove (dynamic reload)
JsonFileStorageLoads _NdcPlugin.json ModuleMap before plugin secure-load
Base host: mandatory plugin %s has failed. ExitFatal path for mandatory plugins (not triggered — plugin is optional)
AllowDynamicPluginLoad / AllowDynamicPluginUnloadEnabled on NDC seat (Dynamic loading of plugins is enabled)

Runtime from logs

Install (logs/startup/ndcSoftwareInstall.log)
Time / eventDetail
Branch2026-4-29, commit 84989db54ca1897b315d85562b70f0dfd3edc824
Files copied_NdcPlugin.dll, PipsController.exe, NvContainerNDC.exe, NvMessageBus.dll
ServiceNDC created (WIN32_OWN_PROCESS), PID 5608, START_PENDING
Container boot (logs/NDC/NvContainerNDC.log)
Time (local)Event
18:43:07.732Container main v1.45, telemetry API init
18:43:07.733Dynamic plugin load/unload enabled
18:43:07.735DACL adjusted for PID 5608
18:43:07.735Load plugins from C:\Asgard\services\NDC\plugins
18:43:07.736JsonFileStorage loads _NdcPlugin.json
18:43:07.858Secure-load _NdcPlugin.dll 1.0.0.0 (~98 ms)
18:43:07.859Loaded optional plugin _NdcPlugin, version 1
18:43:07.859Directory listener on plugins\ started
18:43:07.886Plugin Initialized (notification 1)
18:43:07.886Service reports Running
18:43:08.758Plugin Started (StartProcTime ~872 ms total)
18:43:08.758Container started, state normal

Plugin map: single optional _NdcPlugin — Active, Started.


Failure modes

String / conditionMeaning
Failed to load plugins. ExitingPlugin directory load failure
Failed to complete transition to StartedPlugin failed Starting phase
Base host: mandatory plugin %s has failed. ExitFatal mandatory plugin failure
Async state transition failure is detected for %s pluginPlugin reported async failure
Plugin count exceeded maximum allowed %uToo many plugins configured
Exit due to dynamic plugin load failureHot-reload of plugin failed
Failed to allocate plugin entry for '%ls'Plugin registry entry allocation failure

Observed in snapshot: none — clean startup, service remained Running.


Evidence

SourcePath
Container loglogs/NDC/NvContainerNDC.log
Plugin loglogs/NDC/_NdcPluginCurrent.log
Install loglogs/startup/ndcSoftwareInstall.log
Uninstall scriptservices/NDC/Uninstall.bat
ModuleMapservices/NDC/plugins/_NdcPlugin.json
readpePE32+ AMD64, 8 sections, entry 0x69740, timestamp 2025-05-07

Radare2 summary

ItemValue
FormatPE32+ GUI x86-64, 1,342,496 bytes, signed
ExportNvOptimusEnablement (sole export)
Imports (notable)FindFirstChangeNotificationW, CreateProcessW, Process32FirstW/NextW, vectored exception handlers, VirtualProtect
StringsFull NvContainer plugin lifecycle messages; Container main v%s; dynamic load paths
Functionsentry0 only in filtered afl (no symbolized main)

Not verified

  • Exact NDC acronym expansion beyond log string "Nvidia Data Collector" (from _NdcPlugin log).
  • Service install registry keys / SCM start type / service account.
  • Whether NvContainerLS junction is created at install (referenced only in Uninstall.bat).
  • Post-session container shutdown behavior (log ends at Running).

NvMessageBus.dll

What it does

NvMessageBus.dll is the NVIDIA Message Bus client library bundled with the NDC stack at services/NDC/NvMessageBus.dll. It provides the in-process transport for NvContainer plugins and child processes (_NdcPlugin, PipsController.exe) to register as named peers, send/receive protobuf-framed BusMessage packets, and connect to the seat-wide bus fabric (ultimately bridged by GSP's NvMessageBusBroadcast and mb-repeater).

The NDC copy is referenced via _NdcPlugin.json ModuleMap; GSP installs separate copies under services/GSP/Messagebus/ with symlinks to %ProgramFiles%\NVIDIA Corporation\NvContainer\.


Architecture

getMessageBusInterface[WithConfig]() / getSharedMessageBusInterface[WithConfig]()
  └─ MessageBusImpl
        ├─ MessageBusInterface_v1 / v2 / v3 (RTTI)
        ├─ Config: FileMessageBusConfig / RegistryMessageBusConfig / DefaultMessageBusConfig
        ├─ Local transport: named pipes + IO completion ports
        └─ Protobuf packet framing (validates non-empty, valid protobuf)

Config schema (embedded JSON string): defines MessageBusPort, LogPath, LogLevel, LocalConnectionSuffix, peer filters (SystemName + ModuleName + AllowedUsers), cross-session options, log pruning, and PerSessionTransportDirectory.

Registry path (string): SOFTWARE\NVIDIA Corporation\NvContainer\MessageBusMessageBusPort

Broadcaster pipe (string): \\.\pipe\NvMessageBusBroadcast


External interfaces

InterfaceRole
C exportsFactory/release for IMessageBus instances (see API table)
Named pipesCreateFileW, ConnectNamedPipe, WaitNamedPipeW, IOCP
RegistryMessageBusPort and related NvContainer keys
LogsMessageBus_<pid>.log, rotation via ClientLogSizeLimit
RPC UUIDsUuidCreate / UuidToStringA for peer IDs
WS2_32Socket support for transport variants
NDC consumers_NdcPlugin.dll (endpoint NDC:NdcPlugin); PipsController.exe waits for PIPS GSBE, Clover peers

Relationship to GSP bus: GSP install creates symlinks from %ProgramFiles%\NVIDIA Corporation\NvContainer\NvMessageBus.dll to GSP's x64 build. NDC ships its own copy in services/NDC/ — byte-level diff vs GSP copy Not verified.


API table

ExportPurpose
generateMessageBusUniqueIdGenerate unique bus identifier
getMessageBusInterfaceCreate per-process MessageBus client
getMessageBusInterfaceWithConfigCreate client with explicit config
getSharedMessageBusInterfaceShared singleton client
getSharedMessageBusInterfaceWithConfigShared client with config
releaseMessageBusInterfaceRelease client instance

Internal classes (RTTI / strings):

ClassRole
MessageBusImplCore client/server implementation
MessageBusInterface_v1/v2/v3Versioned API surfaces
DefaultMessageBusConfigDefault seat config
FileMessageBusConfigFile-based config loader
RegistryMessageBusConfigRegistry-based config loader

Protobuf fields (strings): source_session, target_session, session, domain


Runtime from logs

Direct NvMessageBus.dll logs are not present in logs/NDC/ for this snapshot. Indirect runtime evidence:

SourceEvidence
_NdcPluginCurrent.logSubscribed to Message Bus; GSConfigClient connects with 38 peers; TAS init via bus
logs/GSP/NvContainerGsp.logGSP loads NvMessageBusBroadcast.dll — seat bus broadcaster
logs/GSP/GSConfiguratorPluginCurrent.logNDC container (PID 5608) fetches NdcConfigData via GSConfigClient on bus
logs/startup/gspSoftwareInstall.logSymlinks GSP MessageBus DLLs to %ProgramFiles%\NVIDIA Corporation\NvContainer\
logs/startup/ndcSoftwareInstall.logCopies NDC-local NvMessageBus.dll to services\NDC\

PipsController strings indicate runtime dependency: peers must join MessageBus within timeout or capture init fails (Not observed — PipsController never launched in snapshot).


Failure modes

StringMeaning
Cannot create an instance of MessageBusImplFactory/allocator failure
MessageBusImpl: received an empty packetFraming error
MessageBusImpl: received invalid protobuf packetDeserialization failure
session id, errorSession routing failure
Skipping obtaining process information for Broadcaster processSecurity info disabled path

Plugin-side bus failures (from _NdcPlugin strings, not observed at runtime):

StringMeaning
messageBus must be not nullClient not initialized before use
Message to {}/{} failed. Error: {}Send failure
Failed to post NDC response, Error: {}Response post failure

Evidence

SourcePath
Binaryservices/NDC/NvMessageBus.dll (3,529,264 bytes)
ModuleMapservices/NDC/plugins/_NdcPlugin.json
readpePE32+ DLL AMD64, 7 sections, entry 0x21ba80, timestamp 2025-06-03
stringsEmbedded JSON config schema; MessageBusPort; pipe path
Plugin loglogs/NDC/_NdcPluginCurrent.log (bus subscription)
Install logslogs/startup/ndcSoftwareInstall.log, logs/startup/gspSoftwareInstall.log

Radare2 summary

ItemValue
FormatPE32+ DLL GUI x86-64, 3,529,264 bytes, signed, stack canary
Exports6 (generateMessageBusUniqueIdreleaseMessageBusInterface)
Imports (notable)Named pipes, IOCP, RPC UUID, registry/file APIs, WS2_32
StringsFull MessageBus config JSON schema; NvMessageBus logging initialized; MessageBus Client version
PDBC:\dvs\p4\build\sw\gcomp\dev\src\MessageBus\_build\X64\Release\messagebus\NvMessageBus.pdb

Not verified

  • Whether NDC processes load this copy vs the GSP symlinked %ProgramFiles% copy at runtime.
  • Wire port number used by NDC peers on this seat (config not in workspace).
  • Byte-level identity vs services/GSP/Messagebus/x64/NvMessageBus.dll.
  • Direct MessageBus client log files (MessageBus_*.log) — not captured in logs/NDC/.

PipsController.exe

What it does

PipsController.exe is a native C++ console subprocess (16,029,296 bytes) deployed at services/NDC/PipsController/. _NdcPlugin.dll spawns it for GenericCapture configurations when session/CMS/user conditions match CSR allowlists.

It operates in two capture modes:

  1. --pips — capture input/feature telemetry and relay to PIPS GSBE over Message Bus + gRPC (SsiDataSink).
  2. --file — write captured payloads to a seat file (e.g. C:\ProgramData\NVIDIA\user-input.json) with optional RSA encryption.

Duration is capped by -duration (21600 s = 6 h in observed CSR configs). In this snapshot PipsController was never launched — active session CMS/user IDs did not match configured allowlists.

PDB (strings): C:\builds\gfn\security\ndc\out\x64-windows-release\PipsController\PipsController.pdb


Architecture

main (CLI11 / Poco)
  └─ PipsController
        ├─ SsiDataSinkServer          — gRPC service: /SsiDataSink/sendData
        ├─ StreamCaptureController    — Start/Stop/Pause/Resume (protobuf)
        ├─ MessageBusClient           — waits for PIPS GSBE, Clover peers
        ├─ PipsControllerTelemetry    — TAS connector
        ├─ PipsControllerTasConnector
        └─ spdlog → PipsController.log

Protobuf types (strings):

Proto / messageRole
SsiDataSink.protoVSsiMessage, SsiResponse, PIPSDataMessage, PIPSAggregateMessage
SsiStreamCaptureControllerDef.protoStreamCaptureRequest/Response, Start/Stop/Pause/Resume payloads
StreamCaptureControlMessageCapture control envelope

gRPC stack: grpc++ 1.71 (vcpkg x64-windows-v143-static-mt); build paths under C:\builds\gfn\security\ndc\out\.

Default capture path (string): Capture via gRPC relay to PIPS GSBE (default)


External interfaces

InterfaceRole
Parent process_NdcPlugin.dll via CreateProcessW with assembled GenericCapture command line
CLI--pips, --file, -duration, -grpc-port, -fi/--flush-interval
gRPC serverSsiDataSinkServer on configurable port [1024, 65535]
gRPC clientStart/Stop capture requests to remote {}:{} peers
Message BusPosts aggregate messages to PIPS GSBE; requires Clover + PIPS peers within timeout
File I/O--file mode writes to CSR-specified path; reads file:///C:/ProgramData/NVIDIA/user-input.json
LogsPipsController.log (string); parent logs stdout to commandOnStartCaptureOutput.log / commandOnStopCaptureOutput.log

Observed remote PIPS peers (mb-repeater / Smithy logs): PIPS:PIPS, PIPS:PIPS-InputFeatures, PIPS:PIPSTasConnector, PIPS:PIPSAnybrainTasConnector — seat join details Not verified for NDC spawn (no launch in snapshot).


API table

Symbol / componentTypeNotes
mainFunctionEntry; r2 afl at 0x140040a80 (~14k bytes)
(none)ExportsNo DLL exports — standalone EXE
SsiDataSinkServergRPC service/SsiDataSink/sendData
StreamCaptureControllerMessageProtobufStart/Stop/Pause/Resume
PIPSAggregateMessage.capture_idProtobuf fieldAggregate telemetry envelope
PipsController::StartMethodInit; failure → PipsController::Start failed during initialization
SendStopCaptureMethodRequires non-empty capture ID
CLI -p,--pipsFlagPIPS relay mode
CLI --fileFlagFile capture mode
CLI -grpc-portFlaggRPC server port (with --pips)
CLI capture durationFlagCapture duration in seconds

Runtime from logs

Install (logs/startup/ndcSoftwareInstall.log)
Copy PipsController contents to C:\Asgard\services\NDC\PipsController
.\PipsController\PipsController.exe
1 File(s) copied
Orchestration (logs/NDC/_NdcPluginCurrent.log)

Config parsed at boot (18:43:08):

ConfigCommand line (from log)
CMS allowlist (~90 IDs)PipsController.exe --pips -duration 21600 echo GenericCapture: CommandOnStopCapture xen false false
User allowlist #1PipsController.exe --file -duration 21600 echo … C:\ProgramData\NVIDIA\user-input.json true (encrypted)
User allowlist #2Same --file template with encryption cert loaded

Session evaluation (18:48:43) — no spawn:

FieldValue
Session ID[REDACTED_SESSION_ID]
User ID[REDACTED_USER_ID]
CMS IDs seen[REDACTED_CMS_ID], 100207711, 18761111, 100192311
OutcomeCapture is not configured for CMS IDs = … and Capture is not configured for user IDs = …

Conclusion: Binaries and triggers ready; no CreateProcessW for PipsController in this log window.


Failure modes

StringCondition
PipsController::Start failed during initializationStartup failure
PIPS GSBE peer ({}:{}) did not join MessageBus within {} secondsBus peer timeout
Clover peer ({}:{}) did not join MessageBus within {} secondsClover plugin timeout
Failed to start gRPC data sink server on port {}gRPC bind failure
Cannot flush SSI data to PIPS GSBE: MessageBus not availableBus unavailable at flush
Failed to post aggregate message to PIPS GSBE ({}:{}): {}Bus send failure
StartCapture request to {}:{} failed with error_code={}Remote start failure
StopCapture request to {}:{} failed with error_code={}Remote stop failure
SendStopCapture called with empty capture IDInvalid stop call
Protobuf serialization of aggregate message failed, capture_id={}Serialize error
PIPS_CONTROLLER_UNKNOWN_WARNINGTelemetry warning bucket
SsiDataSinkServer: port must be in range [1024, 65535], gotInvalid port

Parent-side failures (_NdcPlugin strings, not observed for PipsController):

StringCondition
Failed to execute command: {}CreateProcess failure
commandOnStartCapture terminated gracefully / forcing terminationStop-capture cleanup

Evidence

SourcePath
Binaryservices/NDC/PipsController/PipsController.exe
readpePE32+ console AMD64, 7 sections, entry 0xa4df40, signed, timestamp 2026-04-30
stringsPIPS, gRPC, SsiDataSink, CLI flags, MessageBus peer names
Plugin loglogs/NDC/_NdcPluginCurrent.log (command templates, no spawn)
Install loglogs/startup/ndcSoftwareInstall.log

Radare2 summary

ItemValue
FormatPE32+ console x86-64, 16,029,296 bytes, signed
ExportsNone
Entryentry0 @ 0x140a4df40 → jumps to init
main0x140040a80 (362 blocks, ~14k bytes)
Imports (notable)CreateProcessW, file I/O, console, synchronization, OutputDebugStringW
StringsPIPS, gRPC 1.71 paths, CloverCapturePlugin, Forward SSI stream to PIPS, CLI help text

Not verified

  • Default -grpc-port numeric value.
  • Kernel vs user-mode capture mechanism for --pips.
  • Exact bind address for SsiDataSinkServer when run as NDC child.
  • Runtime PipsController.log — not present in logs/NDC/ (process never started).
  • Post-capture file upload / TAS payload contents.

_NdcPlugin.dll

What it does

_NdcPlugin.dll is the NVIDIA Data Collector (NDC) NvContainer plugin loaded by NvContainerNDC.exe. Log banner: Welcome to the re-written Nvidia Data Collector!

It orchestrates conditional telemetry capture on a gameseat:

  1. Fetches NdcConfigData from GSConfigurator via GSConfigClient.
  2. Parses CaptureConfigurations (GenericCapture, NetworkCapture symbols present).
  3. Evaluates conditions (CMS IDs, user IDs, percentage rollout, session/VM time windows).
  4. Spawns PipsController.exe when conditions match at session start.
  5. Registers on Message Bus as NDC:NdcPlugin, subscribes to AIN (app install) and session lifecycle messages.
  6. Initializes TAS (Telemetry Aggregator Service) with schema gfn-team.open.ndc-test:1.

Version: 1.0.0.0 (optional plugin). Export: NvPluginGetInfo.


Architecture

NvPluginGetInfo → NvContainer plugin host
  └─ NdcPluginTaskQueue (deferred tasks)
        ├─ PluginInitialization
        │     ├─ MessageBus subscribe (endpoint NdcPlugin)
        │     └─ AIN subscription via Content Controller (CC)
        └─ PluginStart
              ├─ TAS init (GameseatTelemetry → TelemetryAggregator:SeatConnector)
              ├─ GSConfigClient → NdcConfigData
              ├─ NdcGenericCapture / NdcNetworkDataCollector parsers
              ├─ NdcCondition evaluator
              ├─ NdcCrypto (RSA encryption for --file captures)
              └─ CreateProcessW → PipsController.exe (on match)

Log component tags: NdcPlugin, NdcPluginTaskQue, NdcDeferredTaskQ, NdcGenericCaptur, NdcCondition, NdcCrypto, GameseatTelemetr, GSConfigClientUt.

Protobuf namespaces (deep extract): NdcServiceAPI, GsServiceApi, GCISCommunication, ContentControllerAPI, NVIDIA.Bifrost.*.

Framework: Poco, protobuf, OpenSSL/crypto (RSA-SHA3, RSASSA-PSS), MessageBusClient v3, GSConfigClient (gsprerequisites).


External interfaces

InterfaceRole
NvContainer hostLoaded by NvContainerNDC.exe; lifecycle Init/Start/Stop via deferred task queue
GSConfiguratorConfig key NdcConfigData (CSR); fetched at PluginStart
Message BusEndpoint NDC:NdcPlugin; ModuleMap loads NvMessageBus.dll from _NdcPlugin.json
Content Controller (CC)AIN (App Install Notification) subscription; ContentController messages ignored at runtime
CtMT (nvctmtsvc.exe)Delivers app-install notifications; plugin posts Notify::AppInstall ACKs
GsServiceApiSession ID + user ID for condition matching
TASTelemetryAggregator:SeatConnector:0 — init protobuf with serviceName: "NDC", resourceName: "gfn-team.open.ndc"
PipsController.exeGenericCapture subprocess (--pips / --file)
Logs%AG_LOGS%\NDC\_NdcPluginCurrent.log; capture stdout → commandOnStartCaptureOutput.log, commandOnStopCaptureOutput.log

ModuleMap (_NdcPlugin.json):

json
{ "ModuleMap\\NvMessageBus.dll": "C:\\Asgard\\services\\NDC\\NvMessageBus.dll" }

Message bus config path (string): C:/Program Files/NVIDIA Corporation/NvContainer/plugins/LocalSystem/messagebus.conf


API table

Symbol / taskTypeNotes
NvPluginGetInfoExportStandard NvContainer plugin entry; r2 @ 0x18019b970
PluginInitializationDeferred taskBus subscribe + AIN CC subscription
PluginStartDeferred taskTAS init, config fetch, capture setup
PluginStopDeferred taskString present; stop path Not verified in logs
NdcServiceAPIProtobuf domainNDC service messages (handler strings)
GsServiceApiProtobuf domainSession/user identification
GenericCaptureConfig.*CSR fieldsCommandOnStartCapture, CommandOnStopCapture, User, RestartUponCrash, CapturedFile, EncryptCapture, EncryptionKey
NetworkCaptureControlComponentStart/stop network capture via NCC (symbols only; not in CSR snapshot)
Notify::AppInstallBus messagePosted when CMS IDs added from CtMT
TAS init requestProtobufserviceName: "NDC", schemaId: "gfn-team.open.ndc-test:1"

GenericCapture CSR command template (log-assembled):

<PipsController.exe> <mode> -duration <sec> <CommandOnStartCapture> <CommandOnStopCapture> <User> <EncryptCapture> [<CapturedFile>] [<EncryptFile>]

Runtime from logs

Container load (logs/NDC/NvContainerNDC.log)
TimeEvent
18:43:07.858Secure-load 1.0.0.0 (~98 ms), optional plugin
18:43:07.886Initialized
18:43:08.758Started (StartTimeTotal ~872 ms)
Plugin boot (logs/NDC/_NdcPluginCurrent.log)
TimeEvent
18:43:07.885Module _NdcPlugin, MB-endpoint NdcPlugin
18:43:07.885Subscribed to Message Bus
18:43:07.886AIN subscription posted to CC → success
18:43:07.887Attemping to initialize NDC <---> TAS
18:43:07.908TAS peer visibility; init protobuf sent
18:43:08.491Welcome to the re-written Nvidia Data Collector!
18:43:08.744NdcConfigData fetched; 3 CaptureConfigurations, 3 conditions loaded
18:43:08.750Config 1: CMS allowlist, --pips, session time [0–21610], percentage 100
18:43:08.753Config 2–3: user allowlists, --fileuser-input.json, RSA cert loaded (451-byte key)
18:43:08.758PluginStart finished
Session runtime
TimeEvent
18:43:08–18:48:23Ignore ContentController message (repeated)
18:48:23.507Session ID [REDACTED_SESSION_ID], user [REDACTED_USER_ID]
18:48:40.587–41.737CMS IDs added: 18761111, 100192311, [REDACTED_CMS_ID], 100207711; Posting Notify::AppInstall response
18:48:43.114Session is startingCapture is not configured (CMS + user mismatch)
CtMT (logs/AutoOnboarder/ctmt.log)
TimeEvent
18:43:07.887Subscribe request from NDC:NdcPlugin
18:48:40–41Notify/ack cycles for app install notifications
GSConfigurator (logs/GSP/GSConfiguratorPluginCurrent.log)
GetConfiguration … Services=["NDC"] Exe='c:\asgard\services\ndc\nvcontainerndc.exe' | config='NdcConfigData'

Failure modes

String / conditionMeaning
Failed to open NDC Service Config, exiting.GSConfigurator config fetch failure
Failed to parse config. Error {}CSR parse error
Invalid Capture Configuration Type {}, skippingUnknown capture type
Failed to load encryption certificate.RSA cert parse failure
Failed to execute command: {}PipsController spawn failure
Failed to encrypt file: {}Post-capture encryption failure
NetworkCaptureControl returned an errorNetwork capture path failure (Not observed)
START_CAPTURE_FAILED / STOP_CAPTURE_FAILEDNetwork capture control errors
Null parameters received from NvContainer during plugin initializationHost init contract violation
Capture is not configured for CMS IDs = …Condition mismatch (observed)
Capture is not configured for user IDs = …Condition mismatch (observed)
Session range is invalidTime window config error

Mandatory plugin failure: N/A — plugin marked optional; container would not exit on plugin failure.


Evidence

SourcePath
Binaryservices/NDC/plugins/_NdcPlugin.dll (13,304,944 bytes)
ModuleMapservices/NDC/plugins/_NdcPlugin.json
readpePE32+ DLL AMD64, 7 sections, signed, timestamp 2026-04-30
stringsNdcPlugin, GenericCapture, NetworkCapture, Bifrost, crypto, CreateProcessW
Plugin loglogs/NDC/_NdcPluginCurrent.log
Container loglogs/NDC/NvContainerNDC.log
CtMT loglogs/AutoOnboarder/ctmt.log
GSConfigurator loglogs/GSP/GSConfiguratorPluginCurrent.log
Install loglogs/startup/ndcSoftwareInstall.log

Radare2 summary

ItemValue
FormatPE32+ DLL GUI x86-64, 13,304,944 bytes, signed, stack canary
ExportNvPluginGetInfo @ 0x18019b970
Imports (notable)CreateProcessW, CreateProcessAsUserW/A, CRYPT32, WS2_32, dbghelp, IPHLPAPI
StringsWelcome to the re-written Nvidia Data Collector!; GenericCapture/NetworkCapture; Bifrost protobuf types; log paths under C:\Asgard\logs\NDC\
PDBC:\builds\gfn\security\ndc\out\x64-windows-release\NdcPlugin\NdcPlugin.pdb

Not verified

  • NetworkCapture configuration type — symbols present; only GenericCapture observed in CSR/logs.
  • Exact protobuf schemas for NdcServiceAPI request/response fields.
  • Capture stop/teardown on session end (no session-end log in snapshot).
  • Whether --pips capture would succeed if conditions matched (PipsController never spawned).
  • Full list of ContentController message types (all ignored in sampled runtime).

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