Skip to content

GciPlugin.dll

What this program actually does

GciPlugin.dll is the central security enforcement plugin in the GCIS (Grid Cloud Init Security) NvContainer stack. It runs inside NvContainerGcis.exe as a mandatory plugin with message-bus endpoint GciPluginSysmon.

It enforces GeForce NOW seat security policy by coordinating with GSConfigurator for seat config, masquerade/MSQRD kernel hooks, cloud/session messages (AIN, app launch, patching), LOFN key coordination via LkmPlugin, and telemetry to TAS. It publishes ProcessEventMessage events consumed by mb-repeater → Sysmon rules.

Build: version 2.0 2026-04-07-b253f97. DLL version 2.0.0.0.


Architecture / control flow

NvContainerGcis.exe
  └─ GciPlugin.dll (NvPluginGetInfo)
        ├─ GcisPluginTaskQueue / GciDeferredTaskQ
        │     ├─ PluginInitialization → subscribe MB, AIN via ContentController
        │     └─ PluginStart → telemetry, GSConfigClient fetch GcisConfigData, masquerade init
        ├─ GciPluginStub — GCIS Service API handler (protobuf)
        ├─ GSConfigClient — ZoneConfig / SeatConfig / GcisConfigData from GSConfigurator
        ├─ GsecTasTelemetry — TAS session
        └─ Msqrd/gfnmon callbacks — driver load, file access, reparse, registry filters

Core RTTI classes: GciPluginStub, GcisPluginTaskQueue, GciDeferredTaskQ, GSConfigClient, GsecTasTelemetry, Connector@tas@gs@gfn@nv.


External interfaces

GCIS Service API (protobuf)

Namespace: GCISCommunication.GCISServiceAPI

MessageInferred purpose
GCISServiceAPI_GCISRequest_GciFeatureControlEnable/disable GCI security features at runtime
GCISServiceAPI_GCISRequest_GetPatchingStateQuery seat patching state
GCISServiceAPI_GCISRequest_GetLofnData / SetLofnDataLOFN key material (coordinates with LkmPlugin)
GCISServiceAPI_GCISRequest_ElmFeatureControlProxy to Elm plugin
GCISServiceAPI_GCISRequest_UadFeatureControlProxy to UAD plugin
GCISServiceAPI_GCISRequest_GssmFeatureControlProxy to GSSM plugin

Notifications (outbound): GCISNotification_CloudCheckProcesses, CloudCheckProcessInfo, SecurityTerminationInitiated, LaunchCommand, AppLaunchCommand.

Message Bus

  • Endpoint: GciPluginSysmon
  • Creates GSConfigClient_<pid>_... peer; waits for GSConfigurator
  • Subscribes to AIN via ContentController (Subscribing for AIN message)
  • mb-repeater.json forwards GCIS / GciPluginSysmon / ProcessEventMessage

Masquerade / MSQRD

Error stringMeaning
MsqrdFailedToLocateGfnmonConfigureCannot reach masquerade monitor
MsqrdFailedToSetDriverLoadNotifyCallbackKernel driver load notifications
MsqrdFailedToSetFileAccessNotifyCallbackFile access policy hooks
MsqrdFailedToSetReparsePointNotifyCallbackReparse/junction monitoring
MsqrdFailedToConfigureMasqueradeGfnMonitorSeat monitor setup
IgnoringLaunchCommandFromUntrustedProcessPolicy enforcement outcome
FailedToPostTerminateProcessEventProcess kill/flag path

Telemetry (TAS)

Log sequence: Initializing telemetry reporterInitiating GciPlugin <--> TAS sessionGciPlugin <--> TAS session initiated.


Runtime timeline

Time (UTC)EventSource
18:43:01.337Module load, MB-endpoint GciPluginSysmon, GSConfigurator config fetch OKGciPluginOld.log
18:43:01.382Init OK; AIN subscription succeeds (Successfully subscribed CC for AIN messages)GciPluginOld.log
18:43:01.806PluginStart: GcisConfigData OK, config version windows-1651, service config loadedGciPluginOld.log
18:48:23.507Session ID from GsServiceApi; session state → 1GciPluginOld.log
19:04:52.395Second GCIS start: init OK, seat [REDACTED_ZONE]/[REDACTED_POOL]GciPluginCurrent.log
19:04:52.453AIN subscription fails error 1; TAS UEC fails (no session yet)GciPluginCurrent.log
19:04:52.975TAS session initiated on Start attemptGciPluginCurrent.log
19:04:53.026GcisConfigData OBJECT_NOT_FOUND (0x80ec0006)Failed to start GciPluginSysmonGciPluginCurrent.log
19:04:53.029Mandatory plugin failure → container exit 14109NvContainerGcis.log

Seat metadata (both runs): Zone/Pool [REDACTED_ZONE]/[REDACTED_POOL], InstanceId [REDACTED_INSTANCE_ID], IpAddress [REDACTED_IP], Base environment [REDACTED_BASE_ENV].


Failure modes

ConditionError / logImpact
Missing GcisConfigData in GSConfiguratorOBJECT_NOT_FOUND (0x80ec0006): Property 'GcisConfigData' not foundPluginStart fails; container exits 14109
AIN subscription failureFailed to subscribe CC for AIN messages with error 1Non-fatal at init; CC may not be ready
TAS not connected at initFailed to send UEC without establishing connection with TASEarly telemetry dropped
Masquerade driver issuesMsqrdFailedToLocateGfnmon* stringsKernel enforcement unavailable
Untrusted process actionsIgnoringLaunchCommandFromUntrustedProcessPolicy block (expected)
Telemetry consentFailed to set telemetry device consentSeen in first successful run only

Not verified

  • Exact bitmask semantics of GciFeatureControl fields.
  • Complete default allow/deny process lists (config not in workspace).
  • Whether AIN error 1 is benign when ContentController unavailable at boot.
  • Why GcisConfigData present at 18:43 but absent at 19:04 (GSConfigurator state change, not GciPlugin bug).

Evidence

  • strings / RTTI on services/GCIS/plugins/GciPlugin.dll
  • logs/GCIS/GciPluginCurrent.log, GciPluginOld.log
  • logs/GCIS/NvContainerGcis.log
  • logs/GSP/GSConfiguratorPluginCurrent.log (GcisConfigData requests)
  • services/gs2/mb-repeater.json

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