fe2a6db786
rust / build / test / clippy / fmt (push) Has been cancelled
Layout:
- src/ .NET 10 x64 reference: MxNativeCodec, MxNativeClient,
MxAsbClient, probes, tests, harnesses. Executable spec.
- design/ Architectural plan for the Rust port (M0–M6), error
model, protocol invariants, risks (R1–R16), adversarial
review log (review.md).
- rust/ Rust workspace. M0 skeleton + M1 codec parity.
mxaccess-codec: 215 unit tests + 2 cross-implementation
parity tests (byte-identical against .NET reference).
Other crates are M0 stubs awaiting M2+.
- captures/ Frida + netsh + pcap evidence per CLAUDE.md
("captures are evidence, not throwaway logs").
- analysis/ Decompiled C# (frida/proxy/decompiled-*),
Ghidra exports for native DLLs (`exports/` only —
working state at `projects/` and AVEVA's input
binaries at `input/` are gitignored).
- docs/ Reverse-engineering reference docs.
- tools/ Setup-LiveProbeEnv.ps1 (Infisical credential fetcher),
Compute-Crc.ps1 (.NET parity helper).
- .github/workflows/ Rust CI: fmt + build + test + clippy on Windows.
- LICENSE MIT (Joseph Doherty, 2026).
Verified:
- cargo test --workspace → 217 passed (215 unit + 2 .NET parity), 0 failed
- cargo clippy --workspace -- -D warnings → clean
- cargo fmt --all -- --check → clean
- cargo publish --dry-run -p mxaccess-codec → packages cleanly
Excluded from history (see .gitignore):
- **/bin, **/obj, **/target — build artifacts
- analysis/ghidra/projects/ — Ghidra working state (regenerable)
- analysis/ghidra/input/ — AVEVA proprietary DLLs (vendor IP)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
12 KiB
| 1 | interface_index | interface_name | iid | method_index | method_name | proc_offset | proc_va | opnum | x86_stack_size | client_buffer_size | server_buffer_size | proc_flags | param_count | oi2_flags | oi2_ext_flags | raw_header | params |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 3 | RegisterEngine | 0x0054 | 0x100075fe | 3 | 20 | 8 | 8 | 0x46 | 4 | 0x08 | 0x05 | 33 6c 00 00 00 00 03 00 14 00 08 00 08 00 46 04 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x008b(must_size|must_free|in|by_value),stack=8,type=type+0x002c @0x1000792e [0xb4, 0x83, 0x00, 0x00, FC_USMALL, 0x00, 0x00, 0x00, 0xde, 0xff, FC_IP, FC_CONSTANT_IID, 0xf7, 0x92, 0x9f, 0xb4, 0x48, 0xc7]; p2:flags=0x000b(must_size|must_free|in),stack=12,type=type+0x0036 @0x10007938 [FC_IP, FC_CONSTANT_IID, 0xf7, 0x92, 0x9f, 0xb4, 0x48, 0xc7, 0x69, 0x41, 0x8e, 0xca, 0xa0, 0x67, FC_HYPER, 0x01, 0x27, FC_NO_REPEAT]; p3:flags=0x0070(out|return|base_type),stack=16,type=FC_LONG |
| 3 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 4 | UnRegisterEngine | 0x0084 | 0x1000762e | 4 | 12 | 8 | 8 | 0x44 | 2 | 0x08 | 0x01 | 33 6c 00 00 00 00 04 00 0c 00 08 00 08 00 44 02 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0070(out|return|base_type),stack=8,type=FC_LONG |
| 4 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 5 | Connect | 0x00a8 | 0x10007652 | 5 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 05 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 5 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 6 | TransferData | 0x00de | 0x10007688 | 6 | 28 | 32 | 8 | 0x46 | 6 | 0x08 | 0x05 | 33 6c 00 00 00 00 06 00 1c 00 20 00 08 00 46 06 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x010b(must_size|must_free|in|simple_ref),stack=20,type=type+0x004c @0x1000794e [FC_CARRAY, 0x00, 0x01, 0x00, 0x28, 0x00, FC_ERROR_STATUS_T, 0x00, 0x01, 0x00, 0x01, FC_END, FC_RP, FC_DOUBLE, FC_LONG, FC_PAD, FC_IP, FC_CONSTANT_IID]; p5:flags=0x0070(out|return|base_type),stack=24,type=FC_LONG |
| 6 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 7 | AddSubscriberEngine | 0x011a | 0x100076c4 | 7 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 07 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 7 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 8 | RemoveSubscriberEngine | 0x0150 | 0x100076fa | 8 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 08 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 8 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 9 | SetHeartbeatSendInterval | 0x0186 | 0x10007730 | 9 | 16 | 16 | 8 | 0x44 | 3 | 0x08 | 0x01 | 33 6c 00 00 00 00 09 00 10 00 10 00 08 00 44 03 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |
| 9 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 10 | RegisterEngine2 | 0x01b0 | 0x1000775a | 10 | 24 | 16 | 8 | 0x46 | 5 | 0x08 | 0x05 | 33 6c 00 00 00 00 0a 00 18 00 10 00 08 00 46 05 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x008b(must_size|must_free|in|by_value),stack=8,type=type+0x002c @0x1000792e [0xb4, 0x83, 0x00, 0x00, FC_USMALL, 0x00, 0x00, 0x00, 0xde, 0xff, FC_IP, FC_CONSTANT_IID, 0xf7, 0x92, 0x9f, 0xb4, 0x48, 0xc7]; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x000b(must_size|must_free|in),stack=16,type=type+0x0036 @0x10007938 [FC_IP, FC_CONSTANT_IID, 0xf7, 0x92, 0x9f, 0xb4, 0x48, 0xc7, 0x69, 0x41, 0x8e, 0xca, 0xa0, 0x67, FC_HYPER, 0x01, 0x27, FC_NO_REPEAT]; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 10 | 0 | INmxService2 | 2630A513-A974-4B1A-8025-457A9A7C56B8 | 11 | GetPartnerVersion | 0x01e6 | 0x10007790 | 11 | 24 | 24 | 36 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 0b 00 18 00 18 00 24 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x2150(out|base_type|simple_ref|0x2000),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 11 | 1 | INmxSvcStatistics | 6EB90E4C-DF5C-47F0-B2CD-110549C1162A | 3 | GetNmxSvcStatistics | 0x0312 | 0x100078bc | 3 | 12 | 0 | 124 | 0x44 | 2 | 0x08 | 0x01 | 33 6c 00 00 00 00 03 00 0c 00 00 00 7c 00 44 02 08 01 00 00 00 00 00 00 | p0:flags=0x0112(must_free|out|simple_ref),stack=4,type=type+0x0076 @0x10007978 [FC_STRUCT, FC_SMALL, 0x50, 0x00, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG, FC_LONG]; p1:flags=0x0070(out|return|base_type),stack=8,type=FC_LONG |
| 12 | 1 | INmxSvcStatistics | 6EB90E4C-DF5C-47F0-B2CD-110549C1162A | 4 | ResetSvcStatistics | 0x0336 | 0x100078e0 | 4 | 8 | 0 | 8 | 0x44 | 1 | 0x08 | 0x01 | 33 6c 00 00 00 00 04 00 08 00 00 00 08 00 44 01 08 01 00 00 00 00 00 00 | p0:flags=0x0070(out|return|base_type),stack=4,type=FC_LONG |
| 13 | 2 | INmxStatus | 4CA783BC-F68E-42F4-9D76-8107C826F625 | 3 | OPENCONNECTION | 0x027c | 0x10007826 | 3 | 32 | 24 | 64 | 0x46 | 7 | 0x08 | 0x01 | 33 6c 00 00 00 00 03 00 20 00 18 00 40 00 46 07 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x000b(must_size|must_free|in),stack=8,type=type+0x005c @0x1000795e [FC_IP, FC_CONSTANT_IID, 0xea, 0x9a, 0x84, 0x73, 0x2a, 0x47, FC_STRUCT, 0x47, 0xb8, 0xc6, 0x1c, 0x80, 0x6a, 0xf1, 0x2d, 0xfc]; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x2150(out|base_type|simple_ref|0x2000),stack=20,type=FC_LONG; p5:flags=0x2150(out|base_type|simple_ref|0x2000),stack=24,type=FC_ENUM32; p6:flags=0x0070(out|return|base_type),stack=28,type=FC_LONG |
| 14 | 2 | INmxStatus | 4CA783BC-F68E-42F4-9D76-8107C826F625 | 4 | CloseConnection | 0x02be | 0x10007868 | 4 | 16 | 8 | 36 | 0x44 | 3 | 0x08 | 0x01 | 33 6c 00 00 00 00 04 00 10 00 08 00 24 00 44 03 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x2150(out|base_type|simple_ref|0x2000),stack=8,type=FC_ENUM32; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |
| 15 | 2 | INmxStatus | 4CA783BC-F68E-42F4-9D76-8107C826F625 | 5 | GetConnectionStatus | 0x02e8 | 0x10007892 | 5 | 16 | 8 | 36 | 0x44 | 3 | 0x08 | 0x01 | 33 6c 00 00 00 00 05 00 10 00 08 00 24 00 44 03 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x2150(out|base_type|simple_ref|0x2000),stack=8,type=FC_ENUM32; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |
| 16 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 3 | RegisterEngine | 0x0054 | 0x100075fe | 3 | 20 | 8 | 8 | 0x46 | 4 | 0x08 | 0x05 | 33 6c 00 00 00 00 03 00 14 00 08 00 08 00 46 04 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x008b(must_size|must_free|in|by_value),stack=8,type=type+0x002c @0x1000792e [0xb4, 0x83, 0x00, 0x00, FC_USMALL, 0x00, 0x00, 0x00, 0xde, 0xff, FC_IP, FC_CONSTANT_IID, 0xf7, 0x92, 0x9f, 0xb4, 0x48, 0xc7]; p2:flags=0x000b(must_size|must_free|in),stack=12,type=type+0x0036 @0x10007938 [FC_IP, FC_CONSTANT_IID, 0xf7, 0x92, 0x9f, 0xb4, 0x48, 0xc7, 0x69, 0x41, 0x8e, 0xca, 0xa0, 0x67, FC_HYPER, 0x01, 0x27, FC_NO_REPEAT]; p3:flags=0x0070(out|return|base_type),stack=16,type=FC_LONG |
| 17 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 4 | UnRegisterEngine | 0x0084 | 0x1000762e | 4 | 12 | 8 | 8 | 0x44 | 2 | 0x08 | 0x01 | 33 6c 00 00 00 00 04 00 0c 00 08 00 08 00 44 02 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0070(out|return|base_type),stack=8,type=FC_LONG |
| 18 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 5 | Connect | 0x00a8 | 0x10007652 | 5 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 05 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 19 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 6 | TransferData | 0x00de | 0x10007688 | 6 | 28 | 32 | 8 | 0x46 | 6 | 0x08 | 0x05 | 33 6c 00 00 00 00 06 00 1c 00 20 00 08 00 46 06 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x010b(must_size|must_free|in|simple_ref),stack=20,type=type+0x004c @0x1000794e [FC_CARRAY, 0x00, 0x01, 0x00, 0x28, 0x00, FC_ERROR_STATUS_T, 0x00, 0x01, 0x00, 0x01, FC_END, FC_RP, FC_DOUBLE, FC_LONG, FC_PAD, FC_IP, FC_CONSTANT_IID]; p5:flags=0x0070(out|return|base_type),stack=24,type=FC_LONG |
| 20 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 7 | AddSubscriberEngine | 0x011a | 0x100076c4 | 7 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 07 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 21 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 8 | RemoveSubscriberEngine | 0x0150 | 0x100076fa | 8 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 08 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_LONG; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 22 | 3 | INmxService | 575008DB-845D-46C6-A906-F6F8CA86F315 | 9 | SetHeartbeatSendInterval | 0x0186 | 0x10007730 | 9 | 16 | 16 | 8 | 0x44 | 3 | 0x08 | 0x01 | 33 6c 00 00 00 00 09 00 10 00 10 00 08 00 44 03 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |
| 23 | 4 | INmxNotify | 73849AEA-472A-4715-B8C6-1C806AF12DFC | 3 | ConnectionEstablished | 0x021c | 0x100077c6 | 3 | 24 | 32 | 8 | 0x44 | 5 | 0x08 | 0x01 | 33 6c 00 00 00 00 03 00 18 00 20 00 08 00 44 05 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0048(in|base_type),stack=12,type=FC_ENUM32; p3:flags=0x0048(in|base_type),stack=16,type=FC_LONG; p4:flags=0x0070(out|return|base_type),stack=20,type=FC_LONG |
| 24 | 4 | INmxNotify | 73849AEA-472A-4715-B8C6-1C806AF12DFC | 4 | ConnectionClosed | 0x0252 | 0x100077fc | 4 | 16 | 16 | 8 | 0x44 | 3 | 0x08 | 0x01 | 33 6c 00 00 00 00 04 00 10 00 10 00 08 00 44 03 08 01 00 00 00 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x0048(in|base_type),stack=8,type=FC_LONG; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |
| 25 | 5 | INmxSvcCallback | B49F92F7-C748-4169-8ECA-A0670B012746 | 3 | DataReceived | 0x0000 | 0x100075aa | 3 | 16 | 8 | 8 | 0x46 | 3 | 0x08 | 0x05 | 33 6c 00 00 00 00 03 00 10 00 08 00 08 00 46 03 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x010b(must_size|must_free|in|simple_ref),stack=8,type=type+0x0006 @0x10007908 [FC_CARRAY, 0x00, 0x01, 0x00, 0x28, 0x00, FC_USMALL, 0x00, 0x01, 0x00, FC_CHAR, FC_END, FC_UP, 0x00, FC_ENUM32, 0x00, FC_CARRAY, 0x01]; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |
| 26 | 5 | INmxSvcCallback | B49F92F7-C748-4169-8ECA-A0670B012746 | 4 | StatusReceived | 0x002a | 0x100075d4 | 4 | 16 | 8 | 8 | 0x46 | 3 | 0x08 | 0x05 | 33 6c 00 00 00 00 04 00 10 00 08 00 08 00 46 03 08 05 00 00 01 00 00 00 | p0:flags=0x0048(in|base_type),stack=4,type=FC_LONG; p1:flags=0x010b(must_size|must_free|in|simple_ref),stack=8,type=type+0x0006 @0x10007908 [FC_CARRAY, 0x00, 0x01, 0x00, 0x28, 0x00, FC_USMALL, 0x00, 0x01, 0x00, FC_CHAR, FC_END, FC_UP, 0x00, FC_ENUM32, 0x00, FC_CARRAY, 0x01]; p2:flags=0x0070(out|return|base_type),stack=12,type=FC_LONG |