Skip to content

AutoOnboarder

AutoOnboarder, CtMT, pc.dll, ScriptEngine, and fpgen notes are consolidated here from the 2026-05-19 snapshot.

Deep-only retained findings

  • Deep symbol extraction found .?AVGameSession_AwsSecret@Messages@Bifrost@NVIDIA@@ in MessagebusLib.dll; no literal AWS key value was present.
  • gitlab-master.nvidia.com source-path references are embedded in NVIDIA.ScriptEngine.Service.exe symbols.

2026-05-19 application notes

nvctmtsvc.exe (CtMT)

Binary path: services/AutoOnboarder/nvctmtsvc.exe
Size: 24,788,592 bytes | SHA256: (see _analysis/checksums.txt)
PDB: C:\builds\b\out\build\windows-x64-release\services\orchestrator\nvctmtsvc.pdb


What this program actually does

nvctmtsvc.exe is CtMT (Content Management Transport) — the NVIDIA Content Management Service on a GeForce NOW gameseat. It runs as a Windows service (nvctmtsvc install / start at seat bootstrap) and orchestrates the full content lifecycle for streaming sessions:

  1. Load seat/zone/content configs from GSConfigurator via Message Bus.
  2. Join the seat Message Bus and TAS (Telemetry Aggregator Service).
  3. Initialize AWS, cloud saves, HTTP, and Lightstep tracing.
  4. Run a GFN protocol message handler that fans out install notifications to GCIS/NDC plugins.
  5. Drive platform prewarm, artifact fetch, scraper/snapshot, platform controller (pc.dll), ScriptEngine, fpgen, and masquerade (MSQRD) during session setup/teardown.

Version from log: 2026.9.3.0, commit 6751aaa, build 12.05.2026 18:58:23.


Architecture / control flow

main.cpp (Windows service / CLI: install|start|stop|restart|status|query)
  └─ seat_configs_loader
        └─ GSConfigClient → MessageBus → GSConfigurator
              (ContentConfig, ZoneConfig, SasConfigData, SeatConfig, Lightstep)
  └─ Lightstep tracer (prod/[REDACTED_OTEL_HOST])
  └─ tas.cpp → MessageBus peer [CtMT:TasConnector]
  └─ AWS + cloud_save + HTTP init
  └─ gfn_protocols_processor (main worker thread)
        ├─ Subscribe/Unsubscribe from GfnGuard, GCIS:*, NDC:*
        ├─ ContentControllerAPI (LaunchSession, ShutdownSession, InstallApp, Prewarm, PlatformPrewarm)
        ├─ ScriptEngine remote (protobuf ScriptEngineMessage.InvokeRequest/Response)
        ├─ notify_gcis_subscribers → GCIS_APP_INSTALL_NOTIFICATION
        └─ platform_controller.cpp → dynamically loads pc.dll
  └─ commands_processor (prewarm, platform prewarm, shutdown to GS)
  └─ content_controller (session state machine, plugins, artifacts, userdata)
  └─ gfn_guard_plugin, d3dreg_plugin, disk_space_reserver, msqrd.cpp
  └─ sensitive_tools_manager (removes fpgen/d3dreg after use)
  └─ object_cache → fpgen.dll::generate_fingerprint (GetProcAddress)
  └─ Embedded Lua (export: luaopen_lfs)

RTTI / source modules (strings): gfn_protocols_processor.cpp, commands_processor.cpp, platform_controller.cpp, content_controller.cpp, cloud_save.cpp, gfn_guard_plugin.cpp, msqrd.cpp, seat_configs_loader.cpp, sensitive_tools_manager.cpp, object_cache.cpp.

Protobuf families: ContentControllerAPI, GCISCommunication, GsServiceApi, ScriptEngineMessagesDef.proto, NVIDIA.Bifrost.*.


External interfaces

InterfaceRole
Windows Service nvctmtsvcInstalled/started by content-tools installer (nvctmtsvc.exe install, start)
GSConfigurator (Message Bus)Config authority: ContentConfig, ZoneConfig, SasConfigData, SeatConfig, GsgTokens (CTMT.sessionToken)
Message BusPeer CtMT (+ CtMT:TasConnector); config at NvContainer\plugins\LocalSystem\messagebus.conf
TAS connectorTelemetry aggregation via bus
AWS S3Cloud save upload/download (cloud_save.cpp, ctmt_userdata_* metrics)
Lightstep / OpenTelemetry[REDACTED_OTEL_HOST], [REDACTED_OTEL_HOST]
GCIS pluginsSubscribe for GCIS_APP_INSTALL_NOTIFICATION; CtMT fans out app install events
GfnGuardSecurity/masquerade coordination via gfn_guard_plugin.cpp
NDC:NdcPluginSame install-notification subscription pattern
ScriptEngineRemote handler registered at startup (Added ScriptEngine remote)
pc.dllPlatform controller factory (create_platform_controller)
fpgen.dllDynamic generate_fingerprint for seat fingerprinting
Logs%AG_LOGS%\AutoOnboarder\ctmt.log
NetworkOutbound TCP observed from PID 8080 (Sysmon in ElmPluginOld.log)

API / CLI surface (inferred)

Command / functionBehavior
installRegister Windows service for auto-start
uninstallRemove service registration
start / stop / restartSCM control
status / queryQuery service state
-- passthroughTokens after -- forwarded to service body
print_ctmt_versionBanner: version, commit, timestamp
do_start / on_startFull startup sequence
ctmt_load_platform_controllerLoad pc.dll, resolve exports
GetProcAddress(generate_fingerprint)Load fpgen.dll at runtime
luaopen_lfsSole PE export — Lua filesystem bindings for embedded scripts
useScriptEngineConfig flag for ScriptEngine integration

ContentControllerAPI message types (strings): LaunchSession, ShutdownSession, InstallApp, Prewarm, PlatformPrewarm, Subscribe, Unsubscribe, SessionLaunchResult.

ScriptEngine protobuf (embedded in binary): InvokeRequest variants: Install, Configure, ConfigureMods, CollectMods, Shutdown, Cleanup.


Runtime logs

Bootstrap (logs/startup/contenttoolsSoftwareInstall.log)
TimeEvent
18:42:57.824Copy fpgen, scraperConfig, dummy, nvctmtsvc, pc.dll to AutoOnboarder\
18:42:57.931nvctmtsvc.exe install
18:42:58.491nvctmtsvc.exe start
18:42:58.540Write mb.conf
Service startup (logs/AutoOnboarder/ctmt.log)
TimeEvent
18:42:58.538Version banner CTMT 2026.9.3.0
18:42:58.539–58.654Load ContentConfig, ZoneConfig, SasConfigData, SeatConfig from GSConfigurator
18:42:58.734Join MessageBus as [CtMT:TasConnector]
18:42:58.761–58.791AWS, cloud saves, HTTP init; message handler start
18:42:58.812Added ScriptEngine remote; nvctmtsvc started successfully
18:43:01–18:43:07GCIS + NDC plugins subscribe for install notifications
18:43:22.761Platform prewarm begins; GfnGuard configure
18:48:26.629Load pc.dll; setup Steam platform controller
18:48:40.532Start PC; apps initialized (CMS [REDACTED_CMS_ID] Steam demo)
Config fetches (logs/GSP/GSConfiguratorPluginCurrent.log)

CtMT registered as service nvctmtsvc; fetches ContentConfig, ZoneConfig, SasConfigData, SeatConfig, and later GsgTokens property CTMT.sessionToken.

Message Bus (logs/mb-repeater/mb-repeater.log)

Peer system:"CtMT" module:"ScriptEngine" joined at 18:42:58.519.


Failure modes

Code / stringMeaning
MessageBus config not found: {}Missing bus config at startup
Failed to load seat configs.GSConfigurator fetch failure
Failed to join MessageBus.Bus connection failure
Failed to start CTMT message handler: {}.Handler init failure
generate_fingerprint failed with ret={}fpgen.dll call failed
CTMT_* error constantse.g. CTMT_SCRIPT_FAILURE, CTMT_CLOUD_SAVE_INITIALIZATION_FAILURE, CTMT_PLATFORM_PREWARM_TIMEOUT, CTMT_CONTENT_CONTROLLER_BAD_STATE
Failed to deploy container, error: 41MSQRD deploy failure (observed during I2P session)
Metadata from TechnicalMetadata.json differsArtifact metadata mismatch (signing certs, cms_id)
SSLM subscription attempt was cancelledWarning at startup (18:42:58.655)
Failed to enable logging, trying to stop & start again...MSQRD logging retry

Relationships

ComponentInteraction
NVIDIA.ScriptEngine.Service.exeBus peer CtMT:ScriptEngine; script invoke RPC
MessagebusLib.dllShared bus/protobuf types (CtMT embeds full Bifrost schema)
pc.dllPlatform lifecycle (Steam in snapshot)
fpgen.dllDynamic fingerprint generation
dummy.exeBundled placeholder tool (removed by sensitive_tools_manager)
GCIS plugins (7)Install notification subscribers
_NdcPluginInstall notification subscriber
GfnGuard / msq.exeMasquerade and security
GSConfiguratorConfig authority
ScraperFilesystem/registry snapshots (scraper.log)

Not verified

  • Exact Windows service display name and SCM recovery settings.
  • Full catalog of CtMT telemetry counters.
  • Whether generate_fingerprint succeeded in this snapshot (no explicit log line).
  • AWS credential provisioning path on seat.

Evidence

  • readpe, strings, radare2 on services/AutoOnboarder/nvctmtsvc.exe
  • docs/reverse-engineering/_analysis/nvctmtsvc.strings.txt
  • logs/AutoOnboarder/ctmt.log, scraper.log, platform_controller.txt
  • logs/startup/contenttoolsSoftwareInstall.log
  • logs/GSP/GSConfiguratorPluginCurrent.log
  • logs/mb-repeater/mb-repeater.log
  • services/AutoOnboarder/mb.conf, scraperConfig.ptxt

pc.dll (Platform Controller)

Binary path: services/AutoOnboarder/pc.dll
Size: 11,721,328 bytes | PDB: C:\builds\b\out\build\windows-x64-release\platform-controller\scraper_km_dll\pc.pdb


What this program actually does

pc.dll is the Platform Controller library — the seat-side engine that drives store-specific game session lifecycle (Steam, Battle.net, Epic, GOG Galaxy, EA App, and a dummy fallback). CtMT loads it dynamically via platform_controller.cppcreate_platform_controller and orchestrates platform init, app setup, service start/stop, cloud sync, and masquerade (MSQRD) path registration.

In this snapshot CtMT requests steam; the log shows full Steam PC construction for CMS [REDACTED_CMS_ID] ("MUMBA IV: Egypt Jewels Demo") with session [REDACTED_SESSION_ID].

Version from log: 2026.9.3, build 12.05.2026 18:58:23.


Architecture / control flow

create_platform_controller (export)
  └─ controller_factory.cpp
        ├─ steam_controller      (observed in snapshot)
        ├─ bnet_controller       (Battle.net)
        ├─ epic_games_controller
        ├─ ea_app / gog_galaxy   (symbols present)
        └─ default_platform → dummy.exe path
  └─ services_store (IService lifecycle per platform)
        ├─ *_session_state_controller (worker thread)
        ├─ *_services_storage
        ├─ watchers: userdata, manifests, install scripts, cloud sync
        └─ msqrd_controller (masquerade path hooks)
  └─ foxhound_facade (Steam C API 2026.3.10)
  └─ WinFS (Kiosk ACL grants on store directories)
  └─ init_logger / init_rsys_logger (rsyslog → [REDACTED_IP])
  └─ set_metrics_send_callback → CtMT telemetry (ctmt_pc_* stats)

Build paths (strings): platform-controller/platform_controller/steam_controller.cpp, bnet_controller.cpp, epic_games_controller.cpp, scraper_km_dll.cpp, bnet_utils/services_store.h.


External interfaces

InterfaceRole
CtMT (nvctmtsvc.exe)Loads DLL, sets callbacks, drives init/start/shutdown steps
Foxhound C APISteam integration (Loaded foxhound: C API version: 2026.3.10.…)
MSQRD / masqueradeRegisters platform build/common paths (msqrd_controller.cpp)
rsyslogRemote sink [REDACTED_IP] (scraper_km_dll.cpp:85)
Scraper pipelinePre-seeds Steam FS/registry from AO snapshots before PC runs
Store processesGalaxyClientService.exe, steamwebhelper.exe, Battle.net config paths
Logs%AG_LOGS%\AutoOnboarder\platform_controller.txt
Configsession_info.json, allowlist.json, masquerade.json

Exported API

ExportRole
create_platform_controllerFactory: construct platform-specific controller by store name
init_loggerInitialize local PC logging
init_rsys_loggerInitialize remote rsyslog sink
set_metrics_send_callbackRegister CtMT metrics callback (ctmt_pc_* counters)
clear_metrics_send_callbackUnregister metrics callback

Platform controller virtual API (RTTI): init_platform, init_apps, shutdown, get_installed_apps per store controller.

Telemetry counters (strings): ctmt_pc_init_platform_stats, ctmt_pc_session_event_stats, ctmt_pc_start_stats, ctmt_pc_shutdown_stats, ctmt_pc_service_failure.


Runtime logs

CtMT orchestration (logs/AutoOnboarder/ctmt.log)
TimeEvent
18:48:26.629Going to setup PC for platform: steam
18:48:26.629Going to load PC library
18:48:26.679Setting PC's callbacks
18:48:39.020PC init step: platform
18:48:40.111PC init step: apps
18:48:40.532Going to start PC
18:48:41.803Executing PC's post-start step
Platform controller (logs/AutoOnboarder/platform_controller.txt)
TimeEvent
18:48:26.635rsyslog sink [REDACTED_IP]; requested controller: steam
18:48:26.661Construction of Steam PC
18:48:26.673Foxhound loaded
18:48:26.678State: unknown → pc_created
18:48:39.021Steam build: F:\Asgard\GameLibrary\100207711\build
18:48:39.090State: pc_created → platform_initialized
18:48:40.111MSQRD init with Steam paths; apps init for CMS [REDACTED_CMS_ID]
Session metadata (logs/AutoOnboarder/session_info.json)

CMS [REDACTED_CMS_ID], game "MUMBA IV: Egypt Jewels Demo", store Steam, session [REDACTED_SESSION_ID].


Failure modes

String / logMeaning
Failed to init list of allowed processes. File doesn't exist: C:\ASGARD\SERVICES\NVGRIDSVC\NVGRIDSVC.EXENon-fatal allowlist init failure (observed)
Failed to create Platform ControllerFactory failure
Initialization failure: services store is in invalid stateBad IService state
Can't start/stop service '{}' due to its state: {}IService state machine guard
Failed to install GalaxyClientGOG Galaxy setup failure path
Failed to edit service app manifests in BNet DBBattle.net manifest edit failure
E_PC_GAME_OWNERSHIP_ERROROwnership validation error (CtMT string)
Exception in worker thread of '{}'Background service thread crash

Relationships

ComponentInteraction
nvctmtsvc.exeHost/orchestrator; loads exports dynamically
ScraperPre-session FS/registry baseline restore
dummy.exeReferenced as fallback platform binary at C:\asgard\services\autoonboarder\dummy.exe
Masquerade (msq.exe, MSQRD)Path filters for Steam build/common dirs
fpgen.dllSibling AutoOnboarder tool (not loaded by pc.dll)
FoxhoundSteam API shim

Not verified

  • Epic/GOG/Battle.net controllers exercised in this snapshot (symbols only).
  • Exact callback struct passed from CtMT to PC.
  • Whether dummy platform controller is ever selected at runtime.

Evidence

  • readpe -e, strings, radare2 on services/AutoOnboarder/pc.dll
  • docs/reverse-engineering/_analysis/pc.strings.txt
  • logs/AutoOnboarder/platform_controller.txt, ctmt.log, scraper.log
  • logs/AutoOnboarder/session_info.json, allowlist.json, masquerade.json

dummy.exe

Binary path: services/AutoOnboarder/dummy.exe
Size: 21,104 bytes | SHA256: e0fe2e5138254d728f4ce87e44aa4dad9c62a42394546c6360f8635094963571
PDB: C:\builds\b\out\build\windows-x64-release\tools\dummy\dummy.pdb


What this program actually does

dummy.exe is a minimal placeholder executable in the AutoOnboarder bundle. Static analysis shows no meaningful application logic — only CRT startup, exception handling, and a asInvoker UAC manifest. It is referenced by pc.dll as the binary path for the default_platform / unknown store fallback alongside named stores (battle_net, ea_app, gog_galaxy, steam).

CtMT's sensitive_tools_manager also targets sensitive bundled tools for post-session removal (same class as fpgen and d3dreg.exe). No runtime log lines name dummy.exe directly in this snapshot.


Architecture / control flow

main (CRT startup only)
  └─ Standard MSVC console EXE init
  └─ No custom strings, no exports, no service/bus/network code
  └─ Manifest: requestedExecutionLevel asInvoker

String count: ~168 lines at -n 6 — essentially PE metadata + CRT + cert chain only.


External interfaces

InterfaceRole
pc.dllReferences C:\asgard\services\autoonboarder\dummy.exe as default/unknown platform binary
Seat installCopied from V:\bin\dummy.exe at bootstrap
CtMT sensitive toolsLikely removed after session (same manager as fpgen)
LogsNone naming this binary in logs/AutoOnboarder/

API surface

ItemValue
ExportsNone
ImportsVCRUNTIME140, KERNEL32 (QueryPerformanceCounter, exception filters), CRT
CLINo usage/help strings recovered

Runtime logs

SourceEvidence
contenttoolsSoftwareInstall.log18:42:57.853 — Copying 'V:\bin\dummy.exe' to 'C:\Asgard\Services\AutoOnboarder\dummy.exe'
pc.strings.txtPlatform list includes dummy.exe under C:\asgard\services\autoonboarder
AutoOnboarder logsNo direct invocation logged

Failure modes

No failure strings — binary appears inert. If invoked as a platform process, behavior is unknown (likely immediate exit or no-op).


Relationships

ComponentInteraction
pc.dllPlatform controller factory references path for default/unknown store
nvctmtsvc.exeBundled and potentially cleaned by sensitive_tools_manager
fpgen.exeSibling AutoOnboarder utility tool

Not verified

  • Whether PC ever selects default_platform / dummy at runtime.
  • Exit code when launched.
  • Original author intent (placeholder vs test harness).

Evidence

  • readpe, strings, radare2 on services/AutoOnboarder/dummy.exe
  • docs/reverse-engineering/_analysis/pc.strings.txt (platform path reference)
  • logs/startup/contenttoolsSoftwareInstall.log
  • docs/reverse-engineering/_analysis/checksums.txt, sizes.txt

MessagebusLib.dll

Binary path: services/AutoOnboarder/ScriptEngine/MessagebusLib.dll
Size: 2,069,104 bytes | Linker: MSVC 14.41


What this library does

MessagebusLib.dll is the native C++ Message Bus client for AutoOnboarder. It wraps the seat NvMessageBus pipe transport, embeds ContentControllerAPI and ScriptEngine protobuf schemas, and exposes a flat C export surface consumed by NVIDIA.ScriptEngine.Service.exe (P/Invoke) and potentially other CtMT tooling.

Environment variables: CTMT_HOME, CTMT_MB_CONF — resolve install root and bus config path (C:\asgard\ + AutoOnboarder paths in strings).


Architecture / control flow

MessagebusConnect(config_path, peer_name)
  └─ MessageBusImpl (client v3.22 family)
        ├─ PipeTransport → NvMessageBusBroadcast
        ├─ SetOnMessageCallback → inbound protobuf dispatch
        └─ MessagebusReply → outbound responses
  └─ Embedded protobuf descriptors:
        ContentControllerAPI (LaunchSession, ShutdownSession, InstallApp, Prewarm, …)
        ScriptEngineMessage (InvokeRequest/Response)
        NVIDIA.Bifrost.Common (Error, Event, MapEntry)
        GCISCommunication types (cross-referenced)
  └─ GsConfGetString → optional GSConfigurator string fetch
  └─ SendTelemetry / SendTelemetryWithMeasurand → seat telemetry

Log banner: MessageBus Client version 3.22 (MessageBus_7588.log).


External interfaces

InterfaceRole
Message Bus broadcastNamed-pipe hub (port from mb.conf: 65000)
mb.confLogPath, MessageBusPort, InstallPath (NvContainer)
CtMT orchestratorSame protobuf universe embedded in nvctmtsvc.exe
GSConfiguratorGsConfGetString export for config property lookup
LogsMessageBus_<pid>.log under C:\asgard\logs\AutoOnboarder
Telemetryctmt_shutdown_game_data_telemetry, SendTelemetry* exports

Exported API

ExportRole
GetErrorRetrieve last client error string
GsConfGetStringFetch configuration string via GSConfigurator client
MessagebusConnectJoin Message Bus with config + peer identity
MessagebusDisconnectLeave bus
MessagebusReplySend reply to pending bus message
SendTelemetryEmit telemetry event
SendTelemetryWithMeasurandTelemetry with measurand dimension
SetOnMessageCallbackRegister inbound message handler

Protobuf message families (strings):

FamilyExamples
ContentControllerAPILaunchSession, ShutdownSession, InstallApp, Prewarm, PlatformPrewarm, Subscribe, SessionLaunchResult
ScriptEngineInvokeRequest.Install/Configure/Shutdown/Cleanup, InvokeResponse.Mods
Bifrost commonError, Event, GameSession, ModInfo, SessionApp

Runtime logs

LogEvidence
ScriptEngine.logConnected to MessageBus, listening... at 18:42:58.519
MessageBus_7588.logClient v3.22 init; pipe connected to broadcast PID 6496
mb-repeater.logScriptEngine peer registered on bus
ctmt.logCtMT uses separate NvContainer messagebus.conf (not this DLL directly)

Config (services/AutoOnboarder/mb.conf):

json
{
    "LogPath": "C:\\asgard\\logs\\AutoOnboarder",
    "MessageBusPort": 65000,
    "InstallPath": "C:\\Program Files\\NVIDIA Corporation\\NvContainer"
}

Failure modes

StringMeaning
Failed to connect to MessageBus, I guessConnect failure
No Error / GetErrorError retrieval API
subscription_unavailableRelated CtMT subscription failure path
Pipe transport errorsLogged in MessageBus_*.log (connect/read/write)

Relationships

ComponentRole
NVIDIA.ScriptEngine.Service.exePrimary consumer
nvctmtsvc.exeEmbeds same protobuf schemas natively (not via this DLL)
services/GSP/Messagebus/*Sibling MessageBus server/client builds
services/NDC/NvMessageBus.dllRelated NDC container bus client

Not verified

  • Exact MessagebusConnect parameter struct (C# P/Invoke signature not recovered).
  • Bus encryption settings for seat-local port 65000.
  • Whether CtMT loads this DLL directly (likely ScriptEngine-only in bundle).

Evidence

  • readpe -e, strings, radare2 on services/AutoOnboarder/ScriptEngine/MessagebusLib.dll
  • docs/reverse-engineering/_analysis/MessagebusLib.strings.txt
  • logs/AutoOnboarder/ScriptEngine.log, MessageBus_7588.log
  • services/AutoOnboarder/mb.conf

NVIDIA.ScriptEngine.Service.exe

Binary path: services/AutoOnboarder/ScriptEngine/NVIDIA.ScriptEngine.Service.exe
Size: 4,059,304 bytes | Framework: .NET (net10.0 host)


What this program actually does

NVIDIA.ScriptEngine.Service.exe is a .NET worker service that runs as the CtMT ScriptEngine bus peer. It connects to the seat Message Bus with elevated privileges, listens for protobuf ScriptEngineMessage invoke requests from CtMT, and executes automation scripts during session lifecycle phases (install, configure, mod collection, shutdown, cleanup).

Version from log: 2026.3.4, commit 81343942, pipeline 46540749.

Go package reference (embedded): gitlab-master.nvidia.com/gfn/content-management-tools/scriptengine/nvse-basestructs.git


Architecture / control flow

.NET host (BackgroundService / WindowsService)
  └─ NVIDIA.ScriptEngine.Service.dll
        └─ Worker+<ExecuteAsync>d__1
              ├─ ConfigureServices / AddHostedService
              ├─ UseWindowsService (Windows service lifetime)
              ├─ Privilege elevation (SeTakeOwnership, SeAssignPrimaryToken, SeTcb, SeCreatePagefile)
              ├─ MessagebusLib.dll
              │     ├─ MessagebusConnect (peer: CtMT:ScriptEngine)
              │     ├─ SetOnMessageCallback
              │     └─ MessagebusReply
              └─ Google.Protobuf ScriptEngineMessagesDef
                    InvokeRequest: Install | Configure | ConfigureMods | CollectMods | Shutdown | Cleanup
                    InvokeResponse: Mods, Error

CtMT registers ScriptEngine as a remote handler at startup (Added ScriptEngine remote in ctmt.log). Message schema is also embedded in nvctmtsvc.exe and MessagebusLib.dll.


External interfaces

InterfaceRole
Message BusPeer system:"CtMT" module:"ScriptEngine" (mb-repeater log)
MessagebusLib.dllNative P/Invoke bridge for bus I/O
CtMT (nvctmtsvc.exe)Sends ScriptEngineMessage.InvokeRequest RPCs
mb.confLocal bus settings: port 65000, log path C:\asgard\logs\AutoOnboarder
NvContainer busCtMT uses separate messagebus.conf; ScriptEngine uses mb.conf
Logs%AG_LOGS%\AutoOnboarder\ScriptEngine.log, MessageBus_<pid>.log
Windows privilegesSeTakeOwnership, SeAssignPrimaryToken, SeTcb, SeCreatePagefile

API surface (inferred)

ComponentRole
Worker.ExecuteAsyncMain service loop
MessagebusConnectJoin bus as ScriptEngine module
SetOnMessageCallbackReceive inbound protobuf messages
MessagebusReplySend responses
ScriptEngineMessage.InvokeRequest.*Install, Configure, ConfigureMods, CollectMods, Shutdown, Cleanup
ScriptEngineMessage.InvokeResponseMod list + error propagation
SessionContext / ApplicationContextapp_store, version, external_id, mount_point, build_root, metadata_path
ModInfo / ModStateMod scripting metadata
NLogStructured logging

Runtime logs

ScriptEngine (logs/AutoOnboarder/ScriptEngine.log)
TimeEvent
18:42:58.4338CtMT ScriptEngine started
18:42:58.4445Version 2026.3.4; privileges applied
18:42:58.5190Connected to MessageBus, listening...
CtMT (logs/AutoOnboarder/ctmt.log)
TimeEvent
18:42:58.812Added ScriptEngine remote
Message Bus (logs/mb-repeater/mb-repeater.log)
TimeEvent
18:42:58.519Peer CtMT:ScriptEngine PID 7068, SYSTEM, elevated
MessageBus client (logs/AutoOnboarder/MessageBus_7588.log)

MessageBus Client version 3.22; pipe transport to broadcast process 6496.

Install (logs/startup/contenttoolsSoftwareInstall.log)

Copied from scriptengine\ to C:\Asgard\Services\AutoOnboarder\ScriptEngine\ alongside MessagebusLib.dll.


Failure modes

String / conditionMeaning
Failed to connect to MessageBus, I guessMessagebusLib connect failure (in sibling DLL strings)
ScriptEngine.Error.message / .detailsProtobuf error response fields
CTMT_SCRIPT_* (in CtMT)CTMT_SCRIPT_FAILURE, CTMT_SCRIPT_TIMED_OUT, CTMT_SCRIPT_NOT_IMPLEMENTED, CTMT_SCRIPT_LOAD_FAILURE, CTMT_SCRIPT_BAD_CONTEXT
Failed to create script_engine: {}CtMT ScriptEngine remote init failure

No script execution traffic appears in the short ScriptEngine.log snapshot.


Relationships

ComponentInteraction
MessagebusLib.dllNative bus client (required dependency)
nvctmtsvc.exeOrchestrator; registers ScriptEngine remote
GCIS pluginsIndirect — scripts may drive install/security actions
NVIDIA.ScriptEngine.BaseStructsShared struct definitions (assembly reference)

Not verified

  • On-disk script catalog paths and interpreter (Lua vs other).
  • Specific InvokeRequest messages handled in this session (log too short).
  • Windows service name registered in SCM (likely CtMT-managed, not standalone SCM entry).

Evidence

  • strings, readpe, radare2 on services/AutoOnboarder/ScriptEngine/NVIDIA.ScriptEngine.Service.exe
  • logs/AutoOnboarder/ScriptEngine.log, MessageBus_7588.log, ctmt.log
  • logs/mb-repeater/mb-repeater.log
  • services/AutoOnboarder/mb.conf

fpgen (AutoOnboarder)

Split deep docs:

  • fpgen.exe — CLI fingerprint generator
  • fpgen.dll — library used by CtMT / pc.dll

fpgen.exe

Binary path: services/AutoOnboarder/fpgen/fpgen.exe
Size: 58,992 bytes | SHA256: a45c0b36ca9fba01f6932f10ddb3a34b8fabf2ca7917da7444832862fe7c357b
PDB: C:\builds\b\out\build\windows-x64-release\tools\fpgen\fpgen.pdb


What this program actually does

fpgen.exe is a CLI fingerprint generator shipped in the AutoOnboarder bundle. It collects hardware and system identity signals (GPU via NVAPI/D3DKMT, device enumeration via SetupAPI, registry values, Windows service configs) and produces a seat fingerprint. The core logic lives in sibling fpgen.dll (generate_fingerprint export); the EXE is the standalone console entry point.

CtMT also loads fpgen.dll dynamically at runtime (object_cache.cppGetProcAddress(generate_fingerprint)) and logs generate_fingerprint failed with ret={} on failure. After use, sensitive_tools_manager removes fpgen from disk (Removing sensitive tools).


Architecture / control flow

fpgen.exe (console main)
  └─ fpgen.dll::generate_fingerprint
        ├─ nvapi_QueryInterface / nvapi_pepQueryInterface (NVIDIA GPU)
        ├─ D3DKMTEnumAdapters2 / D3DKMTQueryAdapterInfo (display adapters)
        ├─ SetupDi* / SetupGetInfDriverStoreLocationW (PnP devices)
        ├─ RegOpenKeyExW / RegEnumValueW / RegQueryValueExW (registry)
        ├─ OpenSCManagerW / OpenServiceW / QueryServiceConfigW (services)
        ├─ SHGetFolderPathW (known folders)
        └─ VerifyVersionInfoW / GetNativeSystemInfo (OS identity)

External interfaces

InterfaceRole
CtMT (nvctmtsvc.exe)Primary runtime consumer via dynamic fpgen.dll load
fpgen.dllShared implementation (generate_fingerprint)
Seat installCopied from V:\tools\fpgen.exe at bootstrap
Sensitive tools cleanupRemoved post-session by CtMT sensitive_tools_manager
LogsNo dedicated fpgen.log; failures surface in ctmt.log

API surface

SymbolRole
generate_fingerprintSole meaningful export (in DLL; EXE calls into DLL)
CLI stdout/stderrConsole output (no usage strings recovered in snapshot)

Hardware APIs used (imports/strings): NVAPI, D3DKMT, SetupAPI, Advapi registry, Service Control Manager.


Runtime logs

SourceEvidence
contenttoolsSoftwareInstall.log18:42:57.825 — copy V:\tools\fpgen.exeAutoOnboarder\fpgen\
nvctmtsvc.stringsgenerate_fingerprint failed with ret={}
nvctmtsvc.stringsRemoving sensitive tools / remove_sensitive_tools
CtMT logNo explicit fingerprint success/failure line in captured session

Failure modes

StringMeaning
generate_fingerprint failed with ret={}DLL call returned error code
GetProcAddress({}) failed, lastError={}Dynamic load of fpgen.dll failed
Removing: {}Sensitive tool deletion (includes fpgen path)

Relationships

ComponentInteraction
fpgen.dllCore fingerprint implementation
nvctmtsvc.exeDynamic loader + cleanup
dummy.exeSibling placeholder tool in AutoOnboarder root
d3dreg.exeAlso listed in sensitive tools removal set

Not verified

  • CLI arguments and output format (stdout file vs inline hash).
  • Cryptographic algorithm (hash type, salting).
  • Whether EXE is invoked directly or only DLL via CtMT.

Evidence

  • readpe, strings, radare2 on services/AutoOnboarder/fpgen/fpgen.exe
  • docs/reverse-engineering/_analysis/fpgen.strings.txt
  • docs/reverse-engineering/_analysis/nvctmtsvc.strings.txt (dynamic load strings)
  • logs/startup/contenttoolsSoftwareInstall.log

fpgen.dll

Binary path: services/AutoOnboarder/fpgen/fpgen.dll
Size: 58,480 bytes | SHA256: f89fa55a93b7990087af3b1bbad216bfaa4a3db5aa1d393c8da6ec02d073bf91
PDB: C:\builds\b\out\build\windows-x64-release\fpgen\fpgen.pdb


What this library does

fpgen.dll implements generate_fingerprint — the core seat/device fingerprint routine used by fpgen.exe (CLI) and nvctmtsvc.exe (dynamic GetProcAddress load from C:\asgard\services\AutoOnboarder\fpgen\fpgen.dll).

The library queries GPU adapters (NVAPI, D3DKMT), PnP devices (SetupAPI), registry keys, Windows service configurations, and OS version info to derive a fingerprint blob consumed by CtMT telemetry/onboarding.


Architecture / control flow

generate_fingerprint (export, ordinal 1)
  ├─ GPU: nvapi_QueryInterface, D3DKMTEnumAdapters2, D3DKMTQueryAdapterInfo
  ├─ Devices: SetupDiGetClassDevsW, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceRegistryPropertyW
  ├─ Registry: RegOpenKeyExW, RegEnumValueW, RegQueryValueExW
  ├─ Services: OpenSCManagerW, OpenServiceW, QueryServiceConfigW
  ├─ Folders: SHGetFolderPathW
  └─ OS: GetNativeSystemInfo, VerifyVersionInfoW, GetSystemDirectoryW

Same hardware enumeration surface as fpgen.exe; DLL is the loadable unit for CtMT embedding.


External interfaces

InterfaceRole
fpgen.exeConsole wrapper loading this DLL
nvctmtsvc.exeRuntime dynamic load via object_cache.cpp
sensitive_tools_managerPost-use removal from disk
Install pathC:\Asgard\services\AutoOnboarder\fpgen\fpgen.dll

Exported API

ExportOrdinalRole
generate_fingerprint1Compute seat fingerprint; return code logged by CtMT on failure

Runtime logs

SourceEvidence
contenttoolsSoftwareInstall.log18:42:57.828 — copy V:\tools\fpgen.dll
nvctmtsvc.stringsgenerate_fingerprint failed with ret={}
nvctmtsvc.stringsGetProcAddress({}) failed, lastError={}
sensitive_tools_manager.cppRemoving sensitive tools after session

No dedicated fpgen log file in snapshot.


Failure modes

ConditionMeaning
Non-zero return from generate_fingerprintLogged by CtMT as generate_fingerprint failed with ret={}
GetProcAddress failureDLL missing or export stripped
Post-session deletionDLL removed from seat by sensitive tools manager

Relationships

ComponentInteraction
fpgen.exeCLI host
nvctmtsvc.exePrimary production consumer
pc.dll / dummy.exeSibling AutoOnboarder binaries (no direct load)

Not verified

  • Fingerprint output encoding (hex, base64, protobuf).
  • Input parameters to generate_fingerprint (likely none — C ABI).
  • Success path logging (only failure string found).

Evidence

  • readpe -e, strings, radare2 on services/AutoOnboarder/fpgen/fpgen.dll
  • docs/reverse-engineering/_analysis/fpgen-dll.strings.txt
  • docs/reverse-engineering/_analysis/fpgen-dll.objdump.txt
  • docs/reverse-engineering/_analysis/nvctmtsvc.strings.txt
  • logs/startup/contenttoolsSoftwareInstall.log

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