Files
mxaccess/analysis/ghidra/exports/LmxProxy.dll.events-decompile.md
T
Joseph Doherty fe2a6db786
rust / build / test / clippy / fmt (push) Has been cancelled
Initial project state: .NET reference, design, Rust port (M0+M1), evidence
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>
2026-05-05 06:21:00 -04:00

7.7 KiB

LmxProxy.dll selected decompile

FUN_1001611f at 1001611f

Signature: undefined __thiscall FUN_1001611f(void * this, long param_1, long param_2, undefined4 param_3)


/* WARNING: Function: __EH_prolog3 replaced with injection: EH_prolog3 */
/* WARNING: Function: __EH_epilog3 replaced with injection: EH_epilog3 */

void __thiscall FUN_1001611f(void *this,long param_1,long param_2,undefined4 param_3)

{
  basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> bVar1;
  undefined4 *puVar2;
  int *piVar3;
  basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *pbVar4;
  undefined4 *this_00;
  long lVar5;
  wchar_t *pwVar6;
  long lVar7;
  _func_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr
  *p_Var8;
  undefined4 *local_30;
  undefined4 local_2c;
  undefined4 local_28;
  undefined4 local_24;
  int *local_20;
  int local_1c;
  void *local_18;
  int local_14;
  undefined4 local_8;
  undefined4 uStack_4;
  
  uStack_4 = 0x20;
  local_8 = 0x1001612b;
  puVar2 = (undefined4 *)FUN_100170a4(0x34);
  if (puVar2 == (undefined4 *)0x0) {
    this_00 = (undefined4 *)0x0;
  }
  else {
    this_00 = puVar2 + 1;
    *puVar2 = 3;
    _eh_vector_constructor_iterator_(this_00,0x10,3,FUN_10001517,FUN_10001f45);
  }
  local_1c = *(int *)((int)this + 8);
  local_14 = 0;
  if (0 < local_1c) {
    local_18 = (void *)((int)this + 4);
    do {
      piVar3 = (int *)FUN_10007d02(local_18,local_14);
      local_20 = piVar3;
      if (piVar3 != (int *)0x0) {
        (**(code **)(*piVar3 + 4))(piVar3);
      }
      local_8 = 1;
      if (piVar3 != (int *)0x0) {
        FUN_10015d08(this_00 + 8,param_1);
        FUN_10015d08(this_00 + 4,param_2);
        *(undefined2 *)this_00 = 0x6024;
        this_00[2] = param_3;
        local_2c = 0;
        local_28 = 3;
        local_24 = 0;
        local_30 = this_00;
        bVar1 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
                              (DAT_100294e0 + 0xc));
        if (bVar1 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
          pwVar6 = L"  Item Handle ";
          lVar5 = param_1;
          lVar7 = param_2;
          p_Var8 = endl_exref;
          pbVar4 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
                   FUN_10002dbf(*(int **)(DAT_100294e0 + 0xc),
                                L"CProxy_ILMXProxyServerEvents::Fire_OnWriteComplete firing event - Server Handle "
                               );
          pbVar4 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
                             (pbVar4,lVar5);
          pbVar4 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
                   FUN_10002dbf((int *)pbVar4,pwVar6);
          pbVar4 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
                             (pbVar4,lVar7);
          std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar4,p_Var8);
        }
        (**(code **)(*piVar3 + 0x18))(piVar3,2,&DAT_100201f8,0x400,1,&local_30,0,0,0);
      }
      local_8 = 0xffffffff;
      if (piVar3 != (int *)0x0) {
        (**(code **)(*piVar3 + 8))(piVar3);
      }
      local_14 = local_14 + 1;
    } while (local_14 < local_1c);
  }
  if (this_00 != (undefined4 *)0x0) {
    FUN_10015d66(this_00,3);
  }
  return;
}


FUN_10016271 at 10016271

Signature: undefined __thiscall FUN_10016271(void * this, long param_1, long param_2, undefined4 param_3)


/* WARNING: Function: __EH_prolog3 replaced with injection: EH_prolog3 */
/* WARNING: Function: __EH_epilog3 replaced with injection: EH_epilog3 */

void __thiscall FUN_10016271(void *this,long param_1,long param_2,undefined4 param_3)

{
  basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> bVar1;
  undefined4 *puVar2;
  int *piVar3;
  basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *pbVar4;
  undefined4 *this_00;
  long lVar5;
  wchar_t *pwVar6;
  long lVar7;
  _func_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr
  *p_Var8;
  undefined4 *local_30;
  undefined4 local_2c;
  undefined4 local_28;
  undefined4 local_24;
  int *local_20;
  int local_1c;
  void *local_18;
  int local_14;
  undefined4 local_8;
  undefined4 uStack_4;
  
  uStack_4 = 0x20;
  local_8 = 0x1001627d;
  puVar2 = (undefined4 *)FUN_100170a4(0x34);
  if (puVar2 == (undefined4 *)0x0) {
    this_00 = (undefined4 *)0x0;
  }
  else {
    this_00 = puVar2 + 1;
    *puVar2 = 3;
    _eh_vector_constructor_iterator_(this_00,0x10,3,FUN_10001517,FUN_10001f45);
  }
  local_1c = *(int *)((int)this + 8);
  local_14 = 0;
  if (0 < local_1c) {
    local_18 = (void *)((int)this + 4);
    do {
      piVar3 = (int *)FUN_10007d02(local_18,local_14);
      local_20 = piVar3;
      if (piVar3 != (int *)0x0) {
        (**(code **)(*piVar3 + 4))(piVar3);
      }
      local_8 = 1;
      if (piVar3 != (int *)0x0) {
        FUN_10015d08(this_00 + 8,param_1);
        FUN_10015d08(this_00 + 4,param_2);
        local_2c = 0;
        local_24 = 0;
        *(undefined2 *)this_00 = 0x6024;
        this_00[2] = param_3;
        local_28 = 3;
        local_30 = this_00;
        bVar1 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
                              (DAT_100294e0 + 0xc));
        if (bVar1 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
          pwVar6 = L"  Item Handle ";
          lVar5 = param_1;
          lVar7 = param_2;
          p_Var8 = endl_exref;
          pbVar4 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
                   FUN_10002dbf(*(int **)(DAT_100294e0 + 0xc),
                                L"CProxy_ILMXProxyServerEvents::Fire_OperationComplete firing event - Server Handle "
                               );
          pbVar4 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
                             (pbVar4,lVar5);
          pbVar4 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
                   FUN_10002dbf((int *)pbVar4,pwVar6);
          pbVar4 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
                             (pbVar4,lVar7);
          std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar4,p_Var8);
        }
        (**(code **)(*piVar3 + 0x18))(piVar3,3,&DAT_100201f8,0x400,1,&local_30,0,0,0);
      }
      local_8 = 0xffffffff;
      if (piVar3 != (int *)0x0) {
        (**(code **)(*piVar3 + 8))(piVar3);
      }
      local_14 = local_14 + 1;
    } while (local_14 < local_1c);
  }
  if (this_00 != (undefined4 *)0x0) {
    FUN_10015d66(this_00,3);
  }
  return;
}


Catch@10016cd3 at 10016cd3

Signature: undefined * __cdecl Catch@10016cd3(void)


undefined * __cdecl Catch_10016cd3(void)

{
  basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> bVar1;
  basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *this;
  int unaff_EBP;
  _func_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr
  *p_Var2;
  
  bVar1 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
                        (DAT_100294e0 + 4));
  if (bVar1 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
    p_Var2 = endl_exref;
    this = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
           FUN_10002dbf(*(int **)(DAT_100294e0 + 4),
                        L"Fire_OnWriteComplete - threw an unknown exception");
    std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(this,p_Var2);
  }
  *(undefined4 *)(unaff_EBP + 8) = 0x80004005;
  *(undefined4 *)(unaff_EBP + -4) = 0xffffffff;
  return &DAT_10016d17;
}