Skip to content

Masquerade Drivers

Masquerade driver/filter services are consolidated here from the 2026-05-19 snapshot.

2026-05-19 application notes

gfnmon.dll

Canonical binary: services/masquerade/gfnmon.dll
Analysis date: 2026-05-28 (Asgard snapshot 2026-05-19)


What this program actually does

gfnmon.dll is a signed PE32+ x64 DLL (536,688 bytes, compiled 2026-05-07) exporting 34 gfnmon_* functions. Strings and RTTI name it NVIDIA Masquerade and reference masquerade::km::io callback dispatch types (gfnmon_process_create, gfnmon_file_access, gfnmon_untrusted_file_opened, gfnmon_driver_load, etc.).

The DLL is the user-mode control library for the masquerade monitor kernel stack. Seat install copies it to C:\Asgard\Services\masquerade\gfnmon.dll alongside kernel driver nvgfnmon.sys (installed via nvgfnmon.inf). Consumers load the DLL and call exports to register filters and event callbacks that are forwarded to the kernel driver via overlapped I/O (CreateThreadpoolIo, CreateFileW, GetOverlappedResult).

Performance counter names in services/masquerade/nvmsqrdsvc.man (gfnmon_process_start_count, gfnmon_untrusted_file_open_count, gfnmon_driver_load_count, etc.) confirm runtime telemetry categories tied to this API surface.

Not verified: Which process(es) in this snapshot dynamically load gfnmon.dll at runtime (no LoadLibrary gfnmon string match in seat logs).


Architecture / control flow

  Consumer process (Not verified which in logs)
        |
        | LoadLibrary(gfnmon.dll) + gfnmon_initialize / gfnmon_configure
        v
  gfnmon.dll  -- threadpool overlapped I/O -->  nvgfnmon.sys (minifilter, FSFilter Activity Monitor)
        |
        | callback dispatch (gfnmon_callback<...> templates in RTTI)
        v
  Registered user callbacks (process/file/registry/driver events)
  1. Init: gfnmon_initializegfnmon_configure (per export names and main-sized init function at 0x180022c60 in r2).
  2. Policy setup: filter/callback setters (gfnmon_add_*, gfnmon_set_*, gfnmon_clear_*).
  3. Runtime: kernel driver posts events; DLL invokes registered callbacks; sync variants exist (*_sync_callback, gfnmon_set_sync_message_sequence_number_callback).
  4. Teardown: gfnmon_uninitialize.

Domain model exports (gfnmon_set_default_domain, gfnmon_add_process_to_domain, gfnmon_set_process_protection_configuration_for_domain) indicate multi-domain process isolation policy.


External interfaces (gRPC, message bus, Win32, drivers)

InterfacePresentEvidence
gRPCNot verifiedNo gRPC strings in binary (r2 izq filter)
NVIDIA Message BusNot verifiedNo MessageBus strings in binary
Kernel driver (nvgfnmon.sys)YesInstall log installs nvgfnmon.inf; DLL uses threadpool I/O + CreateFileW pattern consistent with driver device comms
Win32 ETW/PerfYesImports EventRegister, EventWriteString, PerfStartProviderEx, PerfCreateInstance, etc. (ADVAPI32)
Win32 process/volume APIsYesCreateToolhelp32Snapshot, OpenProcess, QueryFullProcessImageNameW, volume enumeration APIs
Registry (policy)Yes (API surface)Exports gfnmon_add_registry_access_filter, gfnmon_set_registry_create_key_callback

Related kernel drivers in the same masquerade pack (not direct DLL imports, co-deployed): nvguard.sys, nvmsqrd.sys, nvfoxhnd.sys.


API / exports / imports table

Exports (34, radare2 iE)
ExportNotes (from name only)
gfnmon_initializeInit
gfnmon_configureApply configuration
gfnmon_uninitializeTeardown
gfnmon_set_driver_load_callbackDriver load notification
gfnmon_set_driver_queue_statistics_callbackQueue metrics
gfnmon_set_on_file_access_callbackFile access events
gfnmon_set_untrusted_file_opened_callbackUntrusted file open
gfnmon_set_file_operation_callbackGeneric file ops
gfnmon_set_reparse_point_callbackReparse point / junction
gfnmon_set_rename_directory_callbackDirectory rename
gfnmon_set_registry_create_key_callbackRegistry key creation
gfnmon_add_registry_access_filterRegistry path filter
gfnmon_add_registry_access_filter_exExtended registry filter
gfnmon_clear_registry_access_filtersReset registry filters
gfnmon_add_file_access_filterFile path filter
gfnmon_clear_file_access_filtersReset file access filters
gfnmon_add_file_operation_filterFile operation filter
gfnmon_clear_file_operation_filtersReset file op filters
gfnmon_add_protected_processMark protected process
gfnmon_add_process_to_domainDomain assignment
gfnmon_set_default_domainDefault security domain
gfnmon_set_domain_for_placementFile placement domain
gfnmon_set_minimum_allowed_domain_for_privilegePrivilege floor
gfnmon_set_process_protection_configurationProcess protection config
gfnmon_set_process_protection_configuration_for_domainPer-domain protection
gfnmon_set_protected_process_configurationProtected process policy
gfnmon_set_protected_process_opened_callbackProtected process handle open
gfnmon_set_non_critical_process_configurationNon-critical process allow-list
gfnmon_set_process_create_callbackAsync process create
gfnmon_set_process_create_sync_callbackSync process create
gfnmon_set_process_terminate_callbackAsync process terminate
gfnmon_set_process_terminate_sync_callbackSync process terminate
gfnmon_set_image_load_callbackModule load
gfnmon_set_privileged_image_load_callbackPrivileged module load
gfnmon_set_sync_message_sequence_number_callbackSync message ordering
Key imports (sample)
DLLFunctions (sample)
KERNEL32.dllCreateFileW, CreateThreadpoolIo, StartThreadpoolIo, GetOverlappedResult, CreateToolhelp32Snapshot, OpenProcess, volume/path APIs
ADVAPI32.dllEventRegister, EventWriteString, PerfStartProviderEx, PerfCreateInstance, LookupPrivilegeValueW
MSVCP140.dllC++ runtime

Runtime timeline (from logs/)

Time (2026-05-19)EventSource
18:42:56.337gfnmon.dll copied to C:\Asgard\Services\masquerade\logs/startup/msqrdSoftwareInstall.log
18:42:56.617nvgfnmon.inf driver install rc=0logs/startup/msqrdSoftwareInstall.log
18:42:56.617Registry fixup for driver nvgfnmonlogs/startup/msqrdSoftwareInstall.log

No log lines in logs/ reference gfnmon_* export calls or gfnmon.dll load events directly.


Failure modes

ModeEvidence
Driver not installed / device open failsnvgfnmon.inf install failure would block kernel path; install log shows rc=0 in this snapshot
Callback registration errorsNot verified in seat logs (no gfnmon_* log strings)
GciPlugin start failure (related seat component)logs/GCIS/NvContainerGcis.log: mandatory plugin GciPlugin failed in Starting state at 19:04:53 — Not verified whether this involves gfnmon.dll

Evidence sources

  • Binary: services/masquerade/gfnmon.dll
  • Driver INF: services/masquerade/nvgfnmon.inf
  • Perf manifest: services/masquerade/nvmsqrdsvc.man (gfnmon_* counters)
  • Install log: logs/startup/msqrdSoftwareInstall.log
  • readpe, strings (workspace analysis 2026-05-28)

Radare2

PropertyValue
TypePE32+ DLL, x64, signed, canary enabled
Size536,688 bytes
CompiledThu May 7 16:00:31 2026
PDBC:\builds\gfn\content-management-tools\masquerade\masquerade\masquerade\bin\user\Release\gfnmon.pdb
Entryentry0 at 0x180049754 (DllMain dispatch)
Exports34 gfnmon_* functions
Notable stringsNVIDIA Masquerade, NVIDIA CORPORATION, masquerade::km::io::disposal_types
Key functions (r2 afl)gfnmon_initialize, gfnmon_uninitialize, domain/filter export stubs

msq.exe

Canonical binary: services/masquerade/msq.exe
Analysis date: 2026-05-28 (Asgard snapshot 2026-05-19)


What this program actually does

msq.exe is a signed PE32+ x64 console CLI (541,296 bytes, compiled 2026-05-07) with no PE exports. RTTI reveals a cxxopts-based command dispatcher with classes cmd_create, cmd_start, cmd_stop, cmd_list, cmd_mount, cmd_unmount, cmd_deploy, cmd_undeploy, cmd_image, cmd_remove, cmd_wait, cmd_touch, cmd_commit, cmd_config, cmd_index, cmd_log, cmd_perf, cmd_run, and event_monitoring.

Help strings embedded in the binary define subcommands:

  • CREATE — creates container
  • START — starts an existing container
  • STOP — stops a running container
  • LIST — lists existing containers
  • IMAGE — add existing image to container
  • MOUNT — mount all images for container
  • UNMOUNT — unmount container stuck in unmount_pending
  • REMOVE — remove container
  • WAIT — wait for container until it stops
  • DEPLOY / UNDEPLOY — deploy-mode lifecycle
  • TOUCH — touch file in container

Status enum strings include status::container_is_not_running, status::only_one_active_container_is_supported, status::failed_to_create_container, etc.

During seat install, msq.exe is invoked once and exits rc=0 before kernel drivers are installed (logs/startup/msqrdSoftwareInstall.log).

Not verified: Exact subcommand invoked at install time (install log only shows process exit code).


Architecture / control flow

  CLI (main @ 0x140022d50)
        |
        | cxxopts parse → cmd_* handler
        v
  Named-pipe LPC client  (CreateNamedPipeW / ConnectNamedPipe / ReadFile / WriteFile)
        |
        | serialize_iterator / deserialize_iterator / context@pipe@lpc
        v
  nvmsqrdsvc.exe (msq::core pipe server — Not verified pipe name from this binary alone)
        |
        v
  Container state machine + nvmsqrd.sys kernel driver

Secondary paths:

  • ETW tracing: StartTraceW / StopTraceW / EnableTrace (cmd_log, cmd_perf).
  • Performance counters: PerfStartProviderEx and related ADVAPI32 perf APIs.
  • Filesystem: FindFirstFileW, GetFileAttributesW, CreateFileW for local container metadata (container_dir string).

Container state transition log strings: CONTAINER STATE UPDATE: Container stopped|mounted|deployed|running.


External interfaces (gRPC, message bus, Win32, drivers)

InterfacePresentEvidence
gRPCNot verifiedNo gRPC strings
Message BusNot verifiedNo MessageBus strings
Named pipe LPCYesCreateNamedPipeW, ConnectNamedPipe, RTTI context@pipe@lpc, event_monitoring pipe handler
Win32 ETWYesStartTraceW, StopTraceW, EnableTrace
Win32 Perf countersYesPerfStartProviderEx, PerfCreateInstance, …
Kernel driverIndirectCommands target nvmsqrdsvc / nvmsqrd.sys; no direct DeviceIoControl import in msq.exe

API / exports / imports table

Exports

None (radare2 iE empty).

CLI subcommands (RTTI / strings)
Command classPurpose (from embedded help strings)
cmd_createCreate container
cmd_startStart container (REQUIRED: name; OPTIONAL: entry point, single-CT mode)
cmd_stopStop container (REQUIRED: guid)
cmd_listList containers (OPTIONAL: active only)
cmd_imageAdd image to container
cmd_mountMount container images
cmd_unmountForce unmount from unmount_pending
cmd_deployEnter deploy mode
cmd_undeployLeave deploy mode
cmd_removeDelete container (OPTIONAL: remove sandbox)
cmd_waitBlock until container stops
cmd_touchTouch file in container
cmd_commitNot verified (class present, no help string captured)
cmd_configNot verified
cmd_indexIndex generation (--generate-index, --use-index strings)
cmd_logETW log level control
cmd_perfPerformance counter control
cmd_runNot verified
Key imports
DLLFunctions (sample)
KERNEL32.dllNamed pipe + file APIs, events, WaitForMultipleObjects
ADVAPI32.dllETW + perf counter APIs, RevertToSelf
USER32.dllCharLowerW, CharLowerBuffW
MSVCP140.dllC++ iostream/locale
pdh.dllNot verified usage (import present)
ole32.dllCoCreateGuid (deep extract)

Runtime timeline (from logs/)

Time (2026-05-19)EventSource
18:42:56.308Copied to C:\Asgard\Services\masquerade\msq.exelogs/startup/msqrdSoftwareInstall.log
18:42:56.375Process finished: msq.exe -> 0logs/startup/msqrdSoftwareInstall.log
18:43:22.763+CTMT msqrd.cpp sets masquerade parameters (registry_enabled, touch_priority, thread_pool_threads) after services startedlogs/AutoOnboarder/ctmt.log

No per-invocation command-line capture in logs.


Failure modes

Status / error stringMeaning (from string name)
status::container_doesnt_existTarget container missing
status::container_is_already_runningDuplicate start
status::container_is_not_runningOperation requires running container
status::only_one_active_container_is_supportedSingle active container limit
status::failed_to_create_containerCreate path failure
status::unable_to_save_container_configPersist failure
Failed to start trace, errorETW trace start failure (cmd_log)
File specified with --use-index doesn't existIndex file missing (cmd_index)

Install-time failure not observed in this snapshot (rc=0).


Evidence sources

  • Binary: services/masquerade/msq.exe
  • Install log: logs/startup/msqrdSoftwareInstall.log
  • Session log: logs/AutoOnboarder/ctmt.log (masquerade init via CTMT, not direct msq.exe calls)
  • readpe, strings (workspace analysis 2026-05-28)

Radare2

PropertyValue
TypePE32+ console EXE, x64, signed
Size541,296 bytes
CompiledThu May 7 16:00:22 2026
PDB...\masquerade\bin\user\Release\msq.pdb
Entryentry0main at 0x140022d50 (619 bytes)
ExportsNone
Notable stringsContainer CLI help, NVIDIA Masquerade, NVIDIA Masquerade KM, status:😗 enums
IPCNamed pipe Win32 imports + pipe@lpc RTTI

msqrun.exe

Canonical binary: services/masquerade/msqrun.exe
Analysis date: 2026-05-28 (Asgard snapshot 2026-05-19)


What this program actually does

msqrun.exe is a signed PE32+ x64 console helper (239,216 bytes, compiled 2026-05-07) with no PE exports. RTTI shows msq::launcher handling named-pipe LPC requests (deserialize_iterator, serialize_iterator, context@pipe@lpc) with methods bound to run_handler.

The binary launches processes inside an MSQ container sandbox:

  • CreateProcessAsUserW — spawn with impersonated user token
  • CreateEnvironmentBlock / DestroyEnvironmentBlock — per-user environment
  • CreateJobObjectW / SetInformationJobObject / OpenJobObjectW — job-based process grouping
  • ImpersonateNamedPipeClient — client identity from pipe connection
  • CreateNamedPipeW — LPC server/client role for launcher commands

Error string: Container is not running.

Deployed to C:\Asgard\Services\masquerade\msqrun.exe during masquerade install. Referenced as OPTIONAL entry point in msq.exe START command help (OPTIONAL: entry point to run in container).

Not verified: Direct log evidence of msqrun.exe invocation in this snapshot (no matching lines in logs/).


Architecture / control flow

  Parent (nvmsqrdsvc container runtime — Not verified caller in logs)
        |
        | spawns or connects to msqrun.exe
        v
  msqrun.exe  main @ 0x140005380
        |
        | msq::launcher::run_handler (pipe RPC)
        |   ImpersonateNamedPipeClient
        |   CreateEnvironmentBlock
        v
  CreateProcessAsUserW  -->  sandboxed process in container job

Pipe protocol matches msq.exe / nvmsqrdsvc.exe (lpc serialize/deserialize iterators).


External interfaces (gRPC, message bus, Win32, drivers)

InterfacePresentEvidence
gRPCNot verifiedNo gRPC strings
Message BusNot verifiedNo MessageBus strings
Named pipe LPCYesFull named-pipe API set + ImpersonateNamedPipeClient
Win32 process launchYesCreateProcessAsUserW, job objects, environment blocks
IO completion portYesCreateIoCompletionPort, GetQueuedCompletionStatus (deep extract)
Kernel driverIndirectRequires running container (enforced by nvmsqrdsvc / nvmsqrd.sys); no direct DeviceIoControl import

API / exports / imports table

Exports

None.

Internal API surface (RTTI)
SymbolRole
msq::launcherPipe command handler for run operations
msq::launcher::run_handlerReturns msq::status, writes to basic_stringstream
status@msqShared status enumeration with msq.exe / nvmsqrdsvc.exe
Key imports
DLLFunctions
KERNEL32.dllNamed pipes, CreateProcessAsUserW, job objects, IOCP, files
USERENV.dllCreateEnvironmentBlock, DestroyEnvironmentBlock
ADVAPI32.dllToken/security (via process creation path — Not verified full list)
MSVCP140.dllC++ streams/locale

Runtime timeline (from logs/)

Time (2026-05-19)EventSource
18:42:56.312Copied to C:\Asgard\Services\masquerade\msqrun.exelogs/startup/msqrdSoftwareInstall.log

No runtime invocation lines for msqrun.exe in logs/ (rg msqrun → install copy only).


Failure modes

ConditionEvidence
Container is not runningEmbedded error string
Pipe handler returns msq::status errorRTTI signature; specific codes Not verified without dynamic trace
Job assignment failureRelated counters in nvmsqrdsvc.man: msq_failed_add_to_job_count (manifest only)

Evidence sources

  • Binary: services/masquerade/msqrun.exe
  • Install log: logs/startup/msqrdSoftwareInstall.log
  • Related CLI docs: msq.exe START help strings (entry point option)
  • readpe, strings (workspace analysis 2026-05-28)

Radare2

PropertyValue
TypePE32+ console EXE, x64, signed
Size239,216 bytes
CompiledThu May 7 16:00:06 2026
PDB...\masquerade\bin\user\Release\msqrun.pdb
Entryentry0main at 0x140005380
ExportsNone
Notable stringsContainer is not running, CreateProcessAsUserW, NVIDIA Masquerade
IPCNamed pipe + msq::launcher RTTI

nvguardsvc.exe

Canonical binary: services/masquerade/nvguardsvc.exe
Analysis date: 2026-05-28 (Asgard snapshot 2026-05-19)


What this program actually does

nvguardsvc.exe is a signed PE32+ x64 Windows service executable (4,509,296 bytes, compiled 2026-05-07). It registers on the NVIDIA Message Bus as GfnGuard:GfnGuard Service (confirmed in logs/SmithyV2/.../SmithyControllerPlugin.log and logs/mb-repeater/mb-repeater.log at 18:42:57–18:43:08).

Static analysis shows:

  • GFNGuardAPI protobuf message types (GFNGuardMessagesDef.proto, GenericGFNGuardMessage, configure/launch/shutdown session messages)
  • GSConfigClient integration (GSConfiguratorServiceAPI, waits for GSConfigurator peer on Message Bus)
  • ContentController / Bifrost protobuf types (NVIDIA.Bifrost.Messages.GameSession, etc.)
  • Filter manager linkage (FLTLIB.DLL) for interaction with nvguard.sys minifilter

GSPrerequisites queries this binary as a configurable service:

Services=["nvguardsvc"] Exe='c:\asgard\services\masquerade\nvguardsvc.exe'

(logs/GSP/GSConfiguratorPluginCurrent.log)

CTMT (logs/AutoOnboarder/ctmt.log) drives GfnGuard lifecycle: configure, application metadata, links, detach, lambda — all via Message Bus to the GfnGuard peer served by this process.

Windows service name: nvguardsvc (auto-start type 2, started during install).

Not verified: Whether this binary is literally named "GFN Guard" in its internal service display string (Message Bus module name is GfnGuard Service).


Architecture / control flow

  Service start (nvguardsvc)
        |
        +--> Join NVIDIA Message Bus (MessageBusEx / BusObserverEx)
        |         config: C:\Program Files\NVIDIA Corporation\NvContainer\plugins\LocalSystem\messagebus.conf
        |         (also seat-local mb.conf with MessageBusPort 65000)
        |
        +--> Wait for GSConfigurator peer (GSConfigClient)
        |
        +--> Register GfnGuard API handlers (protobuf)
        |         <-- CTMT gfn_guard_plugin (configure app, links, detach, lambda)
        |         <-- GSPrerequisites ZoneConfig queries
        |
        +--> Apply rules to nvguard.sys via FLTLIB / driver configuration
        |         (telemetry counters: gfnguard_add_subject_rule_*, gfnguard_apply_app_rules_*)
        |
        +--> Optional gfnmon.dll callbacks (Not verified direct load in this binary)

main at 0x140037c10 (~1314 bytes) orchestrates initialization. Strings reference waiting for TAS on Message Bus before exit/timeout — Not verified what TAS stands for beyond string context.


External interfaces (gRPC, message bus, Win32, drivers)

InterfacePresentEvidence
gRPCNot verifiedNo gRPC library strings in r2 izq output
NVIDIA Message BusYesMessageBusEx, BusObserverEx, Joining MessageBus as peer, Failed to create MessageBus observer
Protobuf (GFNGuard, Bifrost, GCIS)YesExtensive .proto type strings, google::protobuf RTTI
GSConfigurator / GSPrerequisitesYesGSConfigClientImpl, GetConfiguration, GSP log entry
Win32 service SCMYesService APIs in deep extract (CreateServiceW, etc.)
Win32 crypto/TLSYesCRYPT32.dll, bcrypt.dll, AWS SigV4 strings (cloud check path)
WTSYesWTSGetActiveConsoleSessionId
Minifilter (nvguard.sys)YesFLTLIB.DLL import; nvguard.inf co-installed; perf counters gfnguard_*
HTTP/cURLYesCURLOPT_PIPEWAIT string (cloud check — Not verified endpoint)

Seat Message Bus config (services/masquerade/mb.conf):

json
"MessageBusPort": 65000,
"InstallPath": "C:\\Program Files\\NVIDIA Corporation\\NvContainer"

API / exports / imports table

Exports

None.

Message Bus identity (runtime logs)
FieldValue
systemGfnGuard
moduleGfnGuard Service (also Telemetry peer at PID 7588)
session0
userS-1-5-18 (SYSTEM)
Protobuf APIs (string evidence)
API familyMessages / types (sample)
GFNGuardAPIConfigure, configure rules, configure application, configure cloud check, application links, application detach, launch session, shutdown session
GSConfiguratorGetConfiguration, update_service_configuration_response
BifrostGameSession, SessionApp, ModInfo, BlockVolume, PrewarmGame
GCISCommunicationListed in deep extract
Key imports (sample)
DLLRole
KERNEL32.dllProcess, file, sync, threadpool IO
ADVAPI32.dllSecurity, ETW/perf
FLTLIB.DLLFilter manager communication
WS2_32.dllNetwork (Not verified protocol)
CRYPT32.dll / bcrypt.dllTLS/certs for cloud check
WTSAPI32.dllSession ID
USERENV.dllEnvironment
dbghelp.dllDiagnostics

Runtime timeline (from logs/)

Time (2026-05-19)EventSource
18:42:56.323Copied to masquerade dirlogs/startup/msqrdSoftwareInstall.log
18:42:57.278nvguard.inf driver install rc=0logs/startup/msqrdSoftwareInstall.log
18:42:57.586nvguardsvc.exe exit rc=0 (install helper invocation)logs/startup/msqrdSoftwareInstall.log
18:42:57.587Service startup type set to 2 (automatic)logs/startup/msqrdSoftwareInstall.log
18:42:57.705Started service: nvguardsvclogs/startup/msqrdSoftwareInstall.log
18:42:57.772Message Bus peer GfnGuard:GfnGuard Service addedlogs/mb-repeater/mb-repeater.log
18:43:08.536SmithyController sees GfnGuard peers joinlogs/SmithyV2/.../SmithyControllerPlugin.log
18:43:22.761CTMT: GfnGuard available, configuringlogs/AutoOnboarder/ctmt.log
18:43:23.871+CTMT sends GfnGuard application configure / ACK cycleslogs/AutoOnboarder/ctmt.log
18:43:23.913GSPrerequisites GetConfiguration for nvguardsvc / ZoneConfiglogs/GSP/GSConfiguratorPluginCurrent.log
18:48:36–18:48:40CTMT GfnGuard communication timeouts for some appslogs/AutoOnboarder/ctmt.log

Failure modes

FailureEvidence
Message Bus observer creation failedString: Failed to create MessageBus observer, possibly MessageBus DLL/SO is missing.
Message Bus connect timeoutTimed out while connecting synchronously to message bus.
Address collisionGSConfigClient address collision error reported by message bus
GSConfigurator missingGSConfigurator not on bus. / Failed to receive response from GSConfigurator
TAS missing at initTAS not found on MessageBus before overall init timeout of {}
Protobuf dispatch errorError dispatching message from MessageBus... incompatible protobuf versions
CTMT communication timeoutCTMT_GFN_GUARD_COMMUNICATION_FAILURE / Failed to communicate with gfn guard [0] timeout
Empty service nameservice_name is empty. Aborting...
GSPrerequisites config parse errorsMultiple service_api_response does not have ... strings

Evidence sources

  • Binary: services/masquerade/nvguardsvc.exe
  • Driver INF: services/masquerade/nvguard.inf
  • Message Bus config: services/masquerade/mb.conf
  • Perf manifest: services/masquerade/nvmsqrdsvc.man (gfnguard_* counters)
  • Logs: logs/startup/msqrdSoftwareInstall.log, logs/AutoOnboarder/ctmt.log, logs/GSP/GSConfiguratorPluginCurrent.log, logs/mb-repeater/mb-repeater.log, logs/SmithyV2/SmithyController/1779216188403/SmithyControllerPlugin.log

Radare2

PropertyValue
TypePE32+ console EXE, x64, signed
Size4,509,296 bytes
CompiledThu May 7 16:01:29 2026
PDB...\masquerade\bin\user\Release\nvguardsvc.pdb
Entryentry0main at 0x140037c10
ExportsNone
Notable stringsMessageBusEx paths, GFNGuard protobuf types, GSConfigClient, Bifrost messages
DependenciesLarge protobuf + MessageBus + curl/AWS sigv4 surface

nvmsqrdsvc.exe

Canonical binary: services/masquerade/nvmsqrdsvc.exe
Analysis date: 2026-05-28 (Asgard snapshot 2026-05-19)


What this program actually does

nvmsqrdsvc.exe is a signed PE32+ x64 Windows service (1,343,600 bytes, compiled 2026-05-07) described in strings as "NVIDIA Masquerade user-mode service". It implements the msq::core container engine: create/mount/deploy/start/stop containers backed by the nvmsqrd.sys HSM minifilter driver.

Key capabilities (RTTI + error strings):

  • msq::container state machine: stoppedmounteddeployed / running / unmount_pending
  • Named-pipe LPC server dispatching to msq::core and msq::runtime_controller (CreateNamedPipeW, ImpersonateNamedPipeClient)
  • VHDX / virtual disk operations: VirtDisk.dll, CreateVirtualDisk, OpenVirtualDisk, GetVirtualDiskPhysicalPath, WIMGAPI.DLL
  • Transactional NTFS: ktmw32.dll, CreateFileTransactedW, OpenTransaction
  • Sandbox: job objects, ACL manipulation (SetEntriesInAclW), transactional file ops
  • Windows service host: StartServiceCtrlDispatcherW, RegisterServiceCtrlHandlerExW, SetServiceStatus

Policy file services/masquerade/nvmsqrdsvc.json lists excluded processes/directories and cleanup paths on commit.

Windows service name: nvmsqrdsvc (automatic start, started at install). ETW perf provider in services/masquerade/nvmsqrdsvc.man registers 159+ counters (msq_*, gfnmon_*, foxhound_*, gfnguard_*).

Constraint enforced in binary: CURRENTLY ONLY ONE ACTIVE CONTAINER IS SUPPORTED.


Architecture / control flow

  Windows Service (nvmsqrdsvc)  main @ 0x140004a60
        |
        +--> Register perf counters (nvmsqrdsvc.man / Perf* APIs)
        |
        +--> Named pipe server (LPC)
        |         ^                              |
        |         | msq.exe CLI commands         | msqrun.exe launcher RPC
        |         |                              v
        +--> msq::core / msq::runtime_controller
        |         |
        |         +--> msq::container lifecycle
        |         |       VirtDisk VHDX mount, sandbox, JSON config persist
        |         |
        |         +--> DeviceIoControl  -->  nvmsqrd.sys (FSFilter HSM)
        |
        +--> msq::container_event_listener (state change notifications)

Container transitions log strings include mounted_to_running_transition, mounted_to_deployed_transition, unload_stopped_containers.


External interfaces (gRPC, message bus, Win32, drivers)

InterfacePresentEvidence
gRPCNot verifiedNo gRPC strings
Message BusNot verifiedNo MessageBus strings in this binary
Named pipe LPCYesFull pipe server API + msq::core pipe handlers
Win32 SCMYesComplete service API set in deep extract
VirtDisk / VHDXYesVirtDisk.dll, CreateVirtualDisk, OpenVirtualDisk
WIMYesWIMGAPI.DLL import
MinifilterYesFLTLIB.DLL, DeviceIoControl; nvmsqrd.sys via nvmsqrd.inf
Transactional NTFSYesktmw32.dll, transacted create APIs
Process launchYesCreateProcessW (distinct from msqrun's CreateProcessAsUserW)

API / exports / imports table

Exports

None.

Internal classes (RTTI)
ClassRole
msq::corePipe command implementation (container CRUD, mount, deploy)
msq::runtime_controllerRuntime pipe control
msq::containerContainer object + state transitions
msq::container_event_listenerEvent callbacks on state changes
msq::container_stop_waiterWait for stop completion
event_system::event_listenerInternal event bus
Container states (strings)
StateString
stoppedcontainer_state::stopped
mountedcontainer_state::mounted
unmount_pendingcontainer_state::unmount_pending
deployedcontainer_state::deployed
runningcontainer_state::running
Key imports (sample)
DLLFunctions (sample)
KERNEL32.dllPipes, processes, volumes, thread pools, DeviceIoControl
ADVAPI32.dllService control, security descriptors, perf counters
VirtDisk.dllVirtual disk attach/open
FLTLIB.DLLFilter communication
WIMGAPI.DLLWIM images
mi.dllNot verified purpose
SHLWAPI.dllPath helpers
USERENV.dllEnvironment blocks
Configuration (nvmsqrdsvc.json)
KeyValue (sample)
directories_to_exclude%ProgramData%\Microsoft\Crypto\
processes_to_exclude%WinDir%\system32\werfault.exe
directories_to_cleanup_on_commit%WinDir%\Logs, %TEMP%, …

Runtime timeline (from logs/)

Time (2026-05-19)EventSource
18:42:56.331Copied nvmsqrdsvc.exe, .man, .jsonlogs/startup/msqrdSoftwareInstall.log
18:42:57.035nvmsqrd.inf driver install rc=0logs/startup/msqrdSoftwareInstall.log
18:42:57.404Install helper: nvmsqrdsvc.exe rc=0logs/startup/msqrdSoftwareInstall.log
18:42:57.404Startup type → 2 (automatic)logs/startup/msqrdSoftwareInstall.log
18:42:57.415Started service: nvmsqrdsvclogs/startup/msqrdSoftwareInstall.log
18:43:22.763CTMT Initializing masquerademsqrd.cpp removes container, enables logginglogs/AutoOnboarder/ctmt.log
18:43:22.909–22.949CTMT sets MSQRD params: registry_enabled=false, touch_priority=3, thread_pool_threads=2logs/AutoOnboarder/ctmt.log
18:48:40.111AutoOnboarder MSQRD controller: MSQRD deployed - false, MSQRD IO redirection - falselogs/AutoOnboarder/platform_controller.txt

Not verified: CTMT msqrd.cpp IPC mechanism to nvmsqrdsvc (likely pipe/RPC; not named in logs).


Failure modes

Error stringCondition
Failed to create a new containerContainer creation
Failed to create sandbox for containerSandbox setup
Failed to save JSON description of containerConfig persist
Only one active container is supportedSecond active container
Container [{}] is not in unmount_pending state, use 'stop'Invalid unmount
Attempt to start sandboxless containerStart without sandbox
No sandbox found, couldn't deploy container with --sandbox optionDeploy mismatch
Failed to mount container / Failed to stop containerLifecycle errors
status::container_doesnt_exist / status::container_already_existCLI-level status codes (shared with msq.exe)
MSQRD logging enable retryFailed to enable logging, trying to stop & start again... in logs/AutoOnboarder/ctmt.log

Evidence sources

  • Binary: services/masquerade/nvmsqrdsvc.exe
  • Config: services/masquerade/nvmsqrdsvc.json, services/masquerade/nvmsqrdsvc.man
  • Driver INF: services/masquerade/nvmsqrd.inf
  • Logs: logs/startup/msqrdSoftwareInstall.log, logs/AutoOnboarder/ctmt.log, logs/AutoOnboarder/platform_controller.txt

Radare2

PropertyValue
TypePE32+ console EXE, x64, signed
Size1,343,600 bytes
CompiledThu May 7 16:00:41 2026
PDB...\masquerade\bin\user\Release\nvmsqrdsvc.pdb
Entryentry0main at 0x140004a60 (~1305 bytes)
ExportsNone
Notable stringsmsq::core::*, container state enums, single-container limit
Driver IODeviceIoControl + FLTLIB.DLL

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