Morph Service
Morph transition-controller notes are consolidated here from the 2026-05-19 snapshot.
Deep-only retained findings
https://checkip.amazonaws.comis referenced by Morph for external/open-network IP checks.
2026-05-19 application notes
morph.exe
What this program actually does
morph.exe implements the Gameseat Morph Service (NTS) — a Windows service that orchestrates seat network/volume morphing during SSLM session transitions. It waits for NGS:SSLM on MessageBus, subscribes to session notifications, and runs TransitionMonitor to verify the seat has morphed from closed → open network (IGW IP CIDR check) and attached block volumes before acknowledging SessionContentSetup.
Telemetry schema: gfn-team.open.morph:9 (MorphInitializedEvent, MorphCompletedEvent).
Architecture / control flow (recovered symbols)
main
└─ MorphService (CServiceBase@systemservicebase@nv)
├─ MorphService::OnStart → ServiceThread
│ └─ MorphController
│ ├─ MessageBus observer (Morph:Morph, Morph:Telemetry)
│ ├─ TasConnector → TAS / Kratos events
│ ├─ ConfigReader → GSConfigClient (SeatConfig, ZoneConfig, SessionObject)
│ ├─ NotificationHandler → SSLM notifications
│ └─ TransitionMonitor (worker thread polling loop)
└─ MorphService::StopMorph / OnStop / OnShutdownBuild tree: C:\builds\ngn-gia-storage\gfn\gameseat\morph\src\
PDB: C:\builds\ngn-gia-storage\gfn\gameseat\morph\out\x64-windows-release\src\morph.pdb
RTTI / telemetry types (deep extract sample)
| Class | Role |
|---|---|
MorphController, MorphService | Core service/controller |
GSConfigClient@gsprerequisites | Fetches seat/zone/session configs |
Connector@tas@gs@gfn@nv | TAS telemetry connector |
*@Fields@morph | BlockVolumeCount, BlockVolumeConfigureTimeMs, BlockVolumesConnectionTimeMs, DuplicateBlockVolumes, ErrorCode, FailureReason |
MessageBusEx, BusObserverInterface_v3 | Extended message bus observer |
External interfaces
| Interface | Role |
|---|---|
| Windows Service | Installed via morph.exe -install; log name "Gameseat Morph Service (NTS)" |
| MessageBus | Peers Morph:Morph, Morph:Telemetry; config C:\Program Files\NVIDIA Corporation\NvContainer\plugins\LocalSystem\messagebus.conf |
| GSConfigurator | GetConfiguration for SeatConfig, ZoneConfig, SessionObject (Services=["Morph"]) |
| SSLM | Waits for NGS:SSLM, subscribes; handles SessionContentSetup |
| HTTPS / WS2 | TransitionMonitor queries https://checkip.amazonaws.com; validates IP against Open CIDRs from zone config |
| Block volumes | Polls for volume serial from SessionObject (e.g. [REDACTED_VOLUME_ID]) |
| NVP morph check | CPUID leaf 0x40000000 — log: EBX: 0x7263694d, ECX: 0x666f736f, EDX: 0x76482074 → "NVP transition check passed" |
| Crypto | ADVAPI32 Crypt*, bcrypt.dll, CRYPT32.dll (HTTPS client) |
| Logs | logs/Morph/Morph.log |
TransitionMonitor behavior (logs + strings)
| Check | Evidence |
|---|---|
| IGW open network | IP must fall in configured Open CIDRs (log: [REDACTED_IP] is in Open CIDR: [REDACTED_CIDR]) |
| Block volume attach | Checking for volume with serial number: … until volume present |
| Session handler | NotificationHandler.cpp:137 Handling SessionContentSetup notification → Waiting for transition to complete... |
| Timeout strings | TAS not found on MessageBus before overall init timeout of {} |
Runtime timeline (from logs/Morph/Morph.log)
| Time (local) | Event |
|---|---|
| 18:43:04.973 | Custom log formatter; GSConfigClient init |
| 18:43:05.125 | Morph Service banner; MorphController created |
| 18:43:05.147 | MessageBus observer OK; TAS connector init |
| 18:43:05.124 | Initial SSLM subscription cancelled (NGS not on bus) |
| 18:43:05.466 | Waiting for NGS SSLM peer |
| 18:43:22.361 | NGS joined; SSLM subscribe success |
| 18:43:22.606 | MorphController initialized; listening for SSLM |
| 18:48:22.474 | Session phase: TransitionMonitor created; has_block_volumes: true |
| 18:48:22.482 | Block volume serial discovered; polling started |
| 18:48:22.482–23.258 | IGW checks fail ([REDACTED_IP] not in CIDR), then pass ([REDACTED_IP]) |
| 18:48:23.647 | SessionContentSetup received; waiting for transition |
Failure modes (strings + logs)
| String / log | Meaning |
|---|---|
Failed to create MessageBus observer for MorphController | Bus DLL/config missing |
TAS not found on MessageBus before exit | Telemetry connector could not find TAS peer |
IP {} is not in Open CIDRs: {} | Seat still on closed network |
No volume found with serial number: {} | Block volume not yet attached |
Received an unknown notification type. Ignoring... | Unhandled SSLM notification |
Exception in ServiceThread: {} | Service thread fault path |
Relationships
| Component | Interaction |
|---|---|
GfnSdkService, StutterShark | Sibling services; all wait/subscribe to NGS:SSLM |
GSConfiguratorPlugin | Config source for seat/zone/session |
SmithyController | Observes Morph:Morph, Morph:Telemetry peers |
mb-repeater | Bridges Morph peers to remote repeater |
| Pandora / SAS2 | Seat software install via VHDX (logs/startup/morphSoftwareInstall.log) |
Not verified
- Exact protobuf type for SSLM notifications handled vs ignored.
- Whether
MorphCompletedEventfired in this session (not seen in truncated log tail). - Service SCM name string in registry (install log shows display name only).
Evidence
readpe,strings, r2 onservices/morph/morph.exelogs/Morph/Morph.loglogs/startup/morphSoftwareInstall.loglogs/GSP/GSConfiguratorPluginCurrent.log,logs/SmithyV2/SmithyController/.../SmithyControllerPlugin.log,logs/mb-repeater/mb-repeater.log