Two units of work in one commit:
1. nmx_service2_messages.rs (~470 LoC, 18 tests) — port of
NmxService2Messages.cs. Encoders for all 9 INmxService2 opnums
(RegisterEngine, UnRegisterEngine, Connect, TransferData,
AddSubscriberEngine, RemoveSubscriberEngine, SetHeartbeatSendInterval,
RegisterEngine2, GetPartnerVersion) plus BSTR + InterfacePointer NDR
helpers used by RegisterEngine2 marshalling. Decoders for the
GetPartnerVersion result and the generic HRESULT response. M3 stream
B (NmxClient) will be a thin layer over these + the transport.
2. object_exporter_client.rs (~290 LoC, 6 tests including 2 real-socket
tokio tests) — resolves followup F9. Implements:
- resolve_oxid_unauthenticated (cs:14-30)
- resolve_oxid_with_managed_ntlm_packet_integrity (cs:66-81)
ResolveOxidOutcome enum disambiguates the two response shapes the
.NET reference parses (typed result vs 4-byte failure). The two SSPI
flavours (cs:32-47, cs:49-64) are permanently skipped — they wrap
.NET-only System.Net.Security.SspiClientContext.
design/followups.md: F9 moved to Resolved with this commit's hash.
Test count delta: 364 -> 389 (+25; mxaccess-rpc 137 -> 162; +18 from
nmx_service2_messages, +7 from object_exporter_client which includes
the +2 fall-through tests for the dual-shape response decoder).
Open followups touched: F9 resolved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>