Skip to content

LkmPlugin.dll

What this program actually does

LkmPlugin.dll implements LOFN (License/OAuth Flow Network) key management and exposes seat security state to external consumers via named-pipe APIs. It serves as the bridge between GciPlugin's cloud-check/patching logic and clients that need LOFN JWK material, patching state, or JSON-RPC security queries.

On PluginStart it spins up two concurrent pipe server threads: a legacy binary protocol (LegacyPipeApi) and a JSON-RPC protocol (JsonRpcPipeApi). MB endpoint: LkmPlugin. Build: version 1.0 2026-04-07-b253f97.


Architecture / control flow

NvContainerGcis.exe
  └─ LkmPlugin.dll
        ├─ GcisPluginTaskQueue / GSConfigClient
        ├─ PluginStart (early, before config re-fetch):
        │     ├─ LegacyPipeApi thread → CreateNamedPipeA, binary exchange
        │     └─ JsonRpcPipeApi thread → JSON-RPC over named pipe
        ├─ LOFN state machine
        │     ├─ GetLofnData / SetLofnData (via GciPlugin GCIS API)
        │     ├─ Challenge URL handling (LofnDataMessage)
        │     └─ JWK material (GSEC_LKM_Error_UnableToSetLofnJwk)
        ├─ Cloud-check coordination
        │     └─ ConfigureCloudCheck, CloudCheckProcessDataMessage
        └─ GsecTasTelemetry

Key RTTI/strings: LegacyPipeApi, JsonRpcPipeApi, LkmPluginPipeApi, CreateNamedPipeA.


External interfaces

Named-pipe APIs

APIProtocolPurpose
LegacyPipeApiFixed-size binary frames (min 16 bytes)Legacy LOFN/patching clients
JsonRpcPipeApiJSON-RPC over pipeModern clients; cloud-check queries

Log strings: Waiting for a client to connect, LegacyPipeApiExchange, JSON-RPC PipeApiExchange, JSON-RPC Input:.

GCIS Service API (via GciPlugin)

MessagePurpose
GetLofnData / SetLofnDataLOFN key exchange
GetPatchingStateSeat patching state for pipe consumers
Cloud-check messagesProcess validation callbacks

Message Bus

  • Endpoint: LkmPlugin
  • Parses bus messages: GSEC_LKM_Error_FailedToParseBusMessage, MalformedRequestReceived

Runtime timeline

Time (UTC)EventSource
19:04:52.649Module LkmPlugin, init OKLkmPluginCurrent.log
19:04:52.883PluginStart: Legacy + JSON-RPC pipe threads startLkmPluginCurrent.log
19:04:52.884Both pipes waiting for client connectionLkmPluginCurrent.log
19:04:52.972TAS session initiatedLkmPluginCurrent.log
19:04:53.025GcisConfigData not foundFailed to start LkmPluginLkmPluginCurrent.log
19:04:53.028LkmPlugin first to report mandatory failure (Starting)NvContainerGcis.log
19:04:53.057Stop: pipe threads get shutdown connect; legacy "data size < 16", JSON "unexpected end of text"LkmPluginCurrent.log

Note: pipe threads start before the failing GcisConfigData fetch — they briefly accept connections during teardown.


Failure modes

Error stringMeaning
GSEC_LKM_Error_LofnDataNotSetLOFN keys not provisioned
GSEC_LKM_Error_MalformedLofnDataMessageInvalid LOFN protobuf
GSEC_LKM_Error_EmptyChallengeUrlReceivedInLofnDataMessageMissing OAuth challenge URL
GSEC_LKM_Error_UnableToSetLofnJwkJWK write failure
GSEC_LKM_Error_UpdatePatchingStateFailedPatching state sync failed
GSEC_LKM_Error_FailedToParseResponseFromGciPluginGciPlugin RPC response invalid
GSEC_LKM_Error_LegacyPipeApiFailedToCreatePipeNamed pipe creation failed
GSEC_LKM_Error_JsonRpcPipeApiInvalidRequestErrorBad JSON-RPC payload
GSEC_LKM_Error_JsonRpcPipeApiCloudCheckFailedCloud-check RPC error
LegacyPipeApi: Received data size is less than 16Truncated legacy frame (seen on shutdown)
Missing GcisConfigDataPluginStart abort (observed)

Not verified

  • Exact pipe names (not in log strings; likely derived from seat/instance ID).
  • JSON-RPC method catalog (only error paths recovered).
  • LOFN OAuth flow sequence with external identity provider.
  • Whether pipe APIs are reachable from user session or SYSTEM-only.

Evidence

  • strings / RTTI on services/GCIS/plugins/LkmPlugin.dll
  • logs/GCIS/LkmPluginCurrent.log, LkmPluginOld.log
  • logs/GCIS/NvContainerGcis.log
  • logs/GSP/GSConfiguratorPluginCurrent.log

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