[R3/R4 Path A] mxaccess: port Lmx.dll FUN_10100ce0 synthesizer kernel
rust / build / test / clippy / fmt (push) Has been cancelled
rust / cargo public-api drift check (F41) (push) Has been cancelled

Path A landed for R3/R4. The byte->MxStatus synthesizer in Lmx.dll is
FUN_10100ce0 (`analysis/ghidra/exports/Lmx.dll.synthesizer-helpers2-decompile.md`),
a 4-byte u32 LE -> 4-tuple MxStatus decoder used by every NMX-frame
parser in Lmx.dll. The kernel is byte-deterministic and context-free,
so it ports as a pure function -- the operation-tracking state
machine the original verdict deferred is NOT required for synthesis.

Bit layout (per FUN_10100ce0 lines 21-24):
  bit 31:        success    (-1 if set, 0 if clear)
  bits 27..24:   category   (4 bits)
  bits 23..20:   detected_by (4 bits)
  bits 15..0:    detail     (i16 -- low 16 bits, signed)
  bits 30..28, 19..16: reserved/padding

Codec changes:
- MxStatus::from_packed_u32() / ::to_packed_u32() -- the kernel +
  inverse for round-trip parity.
- MxStatus::from_nmx_response_code() -- the constructed-from-response-
  code switch in FUN_1010bd10:741-770 (six proven mappings: 0x01, 0x02
  -> CommunicationError + RequestingNmx; 0x03 -> ConfigurationError +
  RequestingNmx; 0x04 -> ConfigurationError + RespondingNmx; 0x05 ->
  CommunicationError + RespondingNmx; 0x1A -> CommunicationError +
  RequestingNmx).
- MxStatusCategory / MxStatusSource: from_i16/to_i16 promoted to const
  fn so MxStatus::from_packed_u32 can be const.
- NmxOperationStatusMessage::try_parse_process_data_received_body() --
  thin wrapper that peels the outer NmxObservedEnvelope before
  delegating to try_parse_inner. Mirrors
  NmxOperationStatusMessage.TryParseProcessDataReceivedBody (.NET cs:20-32).
- NmxOperationStatusMessage::promote_to_typed() -- entry point that
  returns the existing Status field. Documented as a no-op pass-through
  for now (the 5-byte inner-body wire shape is NOT the same field as
  the 4-byte packed-u32 the kernel decodes); kept for API symmetry.
- 22 new round-trip tests covering the kernel, the response-code
  switch, the proven 0x00/0x41/0xEF completion bytes, and round-trip
  for every canonical sentinel.

mxaccess (Session) changes:
- New OperationKind enum (Write/WriteSecured/Read/Subscribe/
  Unsubscribe/Activate/Suspend/Other).
- New OperationContext struct (correlation_id, op_kind, reference,
  retry_count) -- ground for the F54 follow-on per-operation
  correlation work.
- New OperationStatus event type {raw, status, context,
  is_during_recovery}, mirroring MxNativeOperationStatusEvent (cs:73-78)
  with the typed-MxStatus addition.
- Session::operation_status_events() -> broadcast::Receiver<Arc<
  OperationStatus>> + operation_status_stream() Stream variant.
- callback_router() now tries operation-status parsing first, falling
  through to subscription messages -- matches MxNativeSession
  .OnCallbackReceived dispatch order (cs:574,582,590).
- recover_connection() flips a recovery_active counter (Arc<AtomicU32>
  shared with the router) so OperationStatus.is_during_recovery is
  populated correctly. Mirrors MxNativeSession._recoveryActive
  Volatile.Read at cs:573.
- 3 new router tests covering: status-word frame dispatch + typed
  promotion to WriteCompleteOk; completion-only frames stay verbatim;
  is_during_recovery is stamped from the live counter.

Per-operation context tracking (correlating completion frames back to
outstanding writes/subscribes via the correlation_id) is filed as F54
in design/followups.md. The synthesizer kernel itself is byte-
deterministic, so the kernel and the correlation work are decoupled.

Ghidra evidence (the next-ring xref walk beyond FUN_10114a90):
- analysis/ghidra/exports/Lmx.dll.set-attribute-result-xrefs.md --
  xrefs to OnSetAttributeResult / CancelWithStatus / OperationComplete.
- analysis/ghidra/exports/Lmx.dll.vtable-data-xrefs.md -- vtable-slot
  data xrefs for the virtual-dispatch path.
- analysis/ghidra/exports/Lmx.dll.synthesizer-decompile.md --
  ScanOnDemandCallback::OperationComplete/MultipleOperationComplete
  (FUN_1010b990), RemotePlatformResolver::OperationComplete
  (FUN_1010dc80), and the constructed-from-responseCode synthesizer
  in FUN_1010bd10 (lines 698-770). FUN_1010bd10 is the wire-frame
  receiver that drives the synthesis.
- analysis/ghidra/exports/Lmx.dll.synthesizer-helpers-decompile.md --
  FUN_10003fc0 (the <success %d category %d ...> formatter; confirms
  the 4-tuple layout), FUN_1008f150 (dispatch helper).
- analysis/ghidra/exports/Lmx.dll.synthesizer-helpers2-decompile.md --
  FUN_10100ce0 (the kernel itself), FUN_10100bc0 (3xu16 reader),
  FUN_1005e580 (4-byte stream reader), FUN_1010ee00 (sister NMX-frame
  parser using the same kernel).
- analysis/ghidra/exports/Lmx.dll.synthesizer-callers-xrefs.md --
  caller graph; confirms the kernel is called from many wire-frame
  parsers but each parser shares the single 4-byte decoder.

R3/R4 verdict updated in design/70-risks-and-open-questions.md from
"settled at verbatim-preserve" to "settled per Path A". F54 filed in
design/followups.md for the per-operation correlation work.

cargo build / test / clippy -D warnings / RUSTDOCFLAGS=-D warnings doc
all clean. cargo public-api baselines regenerated for mxaccess and
mxaccess-codec.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-05-06 07:08:36 -04:00
parent 460c61df43
commit c73a33edd8
17 changed files with 4962 additions and 135 deletions
@@ -0,0 +1,35 @@
# Lmx.dll xrefs
## 0x114a90 at 10114a90
Target function: `FUN_10114a90`
| From | Ref type | Caller function |
| --- | --- | --- |
| `10196410` | `DATA` | `` |
## 0x100dc750 at 100dc750
Target function: `FUN_100dc750`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1018f268` | `DATA` | `` |
## 0x1010b990 at 1010b990
Target function: `FUN_1010b990`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1010cf49` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010e440` | `UNCONDITIONAL_CALL` | `FUN_1010e410` |
## 0x1010dc80 at 1010dc80
Target function: `FUN_1010dc80`
| From | Ref type | Caller function |
| --- | --- | --- |
| `10195488` | `DATA` | `` |
@@ -0,0 +1,119 @@
# Lmx.dll xrefs
## 0x1010bd10 at 1010bd10
Target function: `FUN_1010bd10`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1010d89b` | `UNCONDITIONAL_CALL` | `FUN_1010d4a0` |
## 0x1010e410 at 1010e410
Target function: `FUN_1010e410`
| From | Ref type | Caller function |
| --- | --- | --- |
| `101956a8` | `DATA` | `` |
## 0x10101360 at 10101360
Target function: `FUN_10101360`
| From | Ref type | Caller function |
| --- | --- | --- |
| `10061e82` | `UNCONDITIONAL_CALL` | `FUN_10061c60` |
| `10110335` | `UNCONDITIONAL_CALL` | `` |
## 0x10100ce0 at 10100ce0
Target function: `FUN_10100ce0`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1010c2ea` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c474` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c50d` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c5fb` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c8ac` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010ca5f` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010cb16` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010cd61` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010f27d` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `1010f365` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `1010fa8d` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `1010facf` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
## 0x10100bc0 at 10100bc0
Target function: `FUN_10100bc0`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1010c47e` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c605` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010ca69` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010cb20` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
## 0x1005e580 at 1005e580
Target function: `FUN_1005e580`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1010c612` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010ca76` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010f51a` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `1010f8bb` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `1010fa76` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `1010fab8` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `10110415` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `10110440` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `10110513` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `101116fc` | `UNCONDITIONAL_CALL` | `` |
| `10111ab6` | `UNCONDITIONAL_CALL` | `` |
| `10111d51` | `UNCONDITIONAL_CALL` | `` |
| `10111884` | `UNCONDITIONAL_CALL` | `` |
| `101118d2` | `UNCONDITIONAL_CALL` | `` |
| `10111b52` | `UNCONDITIONAL_CALL` | `` |
| `10110be2` | `UNCONDITIONAL_CALL` | `FUN_10110986` |
| `10110c03` | `UNCONDITIONAL_CALL` | `FUN_10110986` |
## 0x10067aa0 at 10067aa0
Target function: `FUN_10067aa0`
| From | Ref type | Caller function |
| --- | --- | --- |
| `1006afb2` | `UNCONDITIONAL_CALL` | `FUN_10069c30` |
| `101044a9` | `UNCONDITIONAL_CALL` | `Catch@10104467` |
| `100fd351` | `UNCONDITIONAL_CALL` | `FUN_100fd200` |
| `10067d89` | `UNCONDITIONAL_CALL` | `FUN_10067d30` |
| `100fd560` | `UNCONDITIONAL_CALL` | `FUN_100fd400` |
| `100ffe3a` | `UNCONDITIONAL_CALL` | `FUN_100ffc90` |
| `1010951d` | `UNCONDITIONAL_CALL` | `FUN_10107880` |
| `1010bfcc` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c250` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c2bb` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c7a4` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010d27a` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010f497` | `UNCONDITIONAL_CALL` | `FUN_1010ee00` |
| `10070743` | `UNCONDITIONAL_CALL` | `FUN_10070360` |
| `10070869` | `UNCONDITIONAL_CALL` | `FUN_10070360` |
| `10070a01` | `UNCONDITIONAL_CALL` | `FUN_10070360` |
## 0x100860c0 at 100860c0
Target function: `FUN_100860c0`
| From | Ref type | Caller function |
| --- | --- | --- |
| `10069f19` | `UNCONDITIONAL_CALL` | `FUN_10069c30` |
| `1006a588` | `UNCONDITIONAL_CALL` | `FUN_10069c30` |
| `10138a4b` | `UNCONDITIONAL_CALL` | `FUN_101389c0` |
| `1010c158` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c206` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010c5ba` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010d0b4` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
| `1010d167` | `UNCONDITIONAL_CALL` | `FUN_1010bd10` |
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,574 @@
# Lmx.dll selected decompile
## FUN_10003fc0 at 10003fc0
Signature: `undefined FUN_10003fc0(void)`
```c
wchar_t * __thiscall
FUN_10003fc0(wchar_t *param_1,short param_2,undefined4 param_3,undefined4 param_4,short param_5)
{
swprintf_s(param_1,0x104,L"<success %d category %d detectedBy %d detail %d>",(int)param_2,param_3,
param_4,(int)param_5);
return param_1;
}
```
## FUN_10016fd0 at 10016fd0
Signature: `undefined FUN_10016fd0(void)`
```c
void __fastcall FUN_10016fd0(int *param_1)
{
byte bStack_17;
*param_1 = (uint)bStack_17 << 8;
param_1[1] = 0;
param_1[2] = 0;
param_1[3] = 0;
param_1[4] = 0;
return;
}
```
## FUN_1008f150 at 1008f150
Signature: `undefined FUN_1008f150(void)`
```c
void __thiscall
FUN_1008f150(int param_1,int *param_2,undefined4 param_3,undefined4 param_4,undefined4 param_5,
undefined4 param_6,undefined4 param_7,undefined4 param_8,undefined4 param_9,
undefined4 param_10,undefined4 param_11)
{
int iVar1;
char cVar2;
undefined4 uVar3;
undefined4 uVar4;
basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_> *pbVar5;
int iVar6;
int *piVar7;
_func_basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_>_ptr_basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_>_ptr
*p_Var8;
int *local_258;
undefined4 local_254;
ulong local_250;
ushort local_24c;
ushort uStack_24a;
uchar local_248 [4];
uchar local_244 [4];
undefined4 local_240;
undefined4 local_23c;
undefined4 local_238;
undefined4 local_234;
undefined4 local_230;
undefined4 local_22c;
undefined4 local_228;
undefined4 local_224;
GUID local_220 [33];
uint local_8;
local_8 = DAT_101d60b8 ^ (uint)&stack0xfffffffc;
CoCreateGuid(local_220);
cVar2 = FUN_100408d0();
if (cVar2 != '\0') {
uVar3 = FUN_10047fe0(local_220[0].Data1,local_220[0]._4_4_,local_220[0].Data4._0_4_,
local_220[0].Data4._4_4_);
p_Var8 = endl_exref;
uVar4 = (**(code **)(*param_2 + 8))();
piVar7 = param_2;
pbVar5 = (basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_> *)
FUN_1001a0e0(*(undefined4 *)(DAT_101d6474 + 0x38),
L"CReferenceStringResolver::ResolveReference - reference ",param_2,
L" guid ",uVar3,L" ref ",uVar4);
pbVar5 = std::basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_>::operator<<
(pbVar5,piVar7);
uVar3 = FUN_1001a0e0(pbVar5);
uVar3 = FUN_1001a0e0(uVar3);
uVar3 = FUN_1001a0e0(uVar3);
pbVar5 = (basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_> *)
FUN_1001a0e0(uVar3);
std::basic_ostream<unsigned_short,struct_std::char_traits<unsigned_short>_>::operator<<
(pbVar5,p_Var8);
}
local_250 = local_220[0].Data1;
local_24c = local_220[0].Data2;
uStack_24a = local_220[0].Data3;
local_244[0] = local_220[0].Data4[4];
local_244[1] = local_220[0].Data4[5];
local_244[2] = local_220[0].Data4[6];
local_244[3] = local_220[0].Data4[7];
local_254 = param_11;
local_240 = param_7;
local_238 = param_9;
local_248[0] = local_220[0].Data4[0];
local_248[1] = local_220[0].Data4[1];
local_248[2] = local_220[0].Data4[2];
local_248[3] = local_220[0].Data4[3];
local_234 = param_10;
local_258 = param_2;
iVar1 = *(int *)(param_1 + 0x24);
local_22c = param_4;
local_23c = param_8;
local_228 = param_5;
local_230 = param_3;
local_224 = param_6;
iVar6 = FUN_1008e910(iVar1,*(undefined4 *)(iVar1 + 4),&local_258);
if (*(int *)(param_1 + 0x28) == 0x4924923) {
/* WARNING: Subroutine does not return */
std::_Xlength_error("list<T> too long");
}
*(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1;
*(int *)(iVar1 + 4) = iVar6;
**(int **)(iVar6 + 4) = iVar6;
__security_check_cookie(local_8 ^ (uint)&stack0xfffffffc);
return;
}
```
## FUN_10112f20 at 10112f20
Signature: `undefined FUN_10112f20(void)`
```c
int * __thiscall FUN_10112f20(int *param_1,int *param_2)
{
UINT UVar1;
BSTR pOVar2;
if (*param_1 != *param_2) {
AtlComPtrAssign(param_1,*param_2);
}
if ((BSTR)param_1[1] != (BSTR)param_2[1]) {
SysFreeString((BSTR)param_1[1]);
pOVar2 = (BSTR)0x0;
if ((BSTR)param_2[1] != (BSTR)0x0) {
UVar1 = SysStringByteLen((BSTR)param_2[1]);
pOVar2 = SysAllocStringByteLen((LPCSTR)param_2[1],UVar1);
}
param_1[1] = (int)pOVar2;
if ((param_2[1] != 0) && (pOVar2 == (BSTR)0x0)) {
/* WARNING: Subroutine does not return */
FUN_100013e0(0x8007000e);
}
}
if ((BSTR)param_1[2] != (BSTR)param_2[2]) {
SysFreeString((BSTR)param_1[2]);
pOVar2 = (BSTR)0x0;
if ((BSTR)param_2[2] != (BSTR)0x0) {
UVar1 = SysStringByteLen((BSTR)param_2[2]);
pOVar2 = SysAllocStringByteLen((LPCSTR)param_2[2],UVar1);
}
param_1[2] = (int)pOVar2;
if ((param_2[2] != 0) && (pOVar2 == (BSTR)0x0)) {
/* WARNING: Subroutine does not return */
FUN_100013e0(0x8007000e);
}
}
if ((BSTR)param_1[3] != (BSTR)param_2[3]) {
SysFreeString((BSTR)param_1[3]);
pOVar2 = (BSTR)0x0;
if ((BSTR)param_2[3] != (BSTR)0x0) {
UVar1 = SysStringByteLen((BSTR)param_2[3]);
pOVar2 = SysAllocStringByteLen((LPCSTR)param_2[3],UVar1);
}
param_1[3] = (int)pOVar2;
if ((param_2[3] != 0) && (pOVar2 == (BSTR)0x0)) {
/* WARNING: Subroutine does not return */
FUN_100013e0(0x8007000e);
}
}
if ((BSTR)param_1[4] != (BSTR)param_2[4]) {
SysFreeString((BSTR)param_1[4]);
pOVar2 = (BSTR)0x0;
if ((BSTR)param_2[4] != (BSTR)0x0) {
UVar1 = SysStringByteLen((BSTR)param_2[4]);
pOVar2 = SysAllocStringByteLen((LPCSTR)param_2[4],UVar1);
}
param_1[4] = (int)pOVar2;
if ((param_2[4] != 0) && (pOVar2 == (BSTR)0x0)) {
/* WARNING: Subroutine does not return */
FUN_100013e0(0x8007000e);
}
}
return param_1;
}
```
## FUN_10112da0 at 10112da0
Signature: `undefined FUN_10112da0(void)`
```c
void __fastcall FUN_10112da0(undefined4 *param_1)
{
int *piVar1;
uint uVar2;
void *local_10;
undefined1 *puStack_c;
int local_8;
puStack_c = &LAB_1017253f;
local_10 = ExceptionList;
uVar2 = DAT_101d60b8 ^ (uint)&stack0xfffffffc;
ExceptionList = &local_10;
*param_1 = PreboundReference::vftable;
param_1[1] = PreboundReference::vftable;
param_1[3] = PreboundReference::vftable;
local_8 = 7;
piVar1 = (int *)param_1[0x19];
if (piVar1 != (int *)0x0) {
(**(code **)(*piVar1 + 8))(piVar1,uVar2);
}
local_8._0_1_ = 6;
SysFreeString((BSTR)param_1[0x2b]);
local_8._0_1_ = 5;
SysFreeString((BSTR)param_1[0x27]);
local_8._0_1_ = 4;
if (7 < (uint)param_1[0x21]) {
operator_delete((void *)param_1[0x1c]);
}
param_1[0x21] = 7;
param_1[0x20] = 0;
*(undefined2 *)(param_1 + 0x1c) = 0;
local_8._0_1_ = 3;
piVar1 = (int *)param_1[0x1a];
if (piVar1 != (int *)0x0) {
(**(code **)(*piVar1 + 8))(piVar1);
}
local_8._0_1_ = 0xc;
SysFreeString((BSTR)param_1[0x18]);
local_8._0_1_ = 0xb;
SysFreeString((BSTR)param_1[0x17]);
local_8._0_1_ = 10;
SysFreeString((BSTR)param_1[0x16]);
local_8._0_1_ = 9;
SysFreeString((BSTR)param_1[0x15]);
local_8._0_1_ = 2;
piVar1 = (int *)param_1[0x14];
if (piVar1 != (int *)0x0) {
(**(code **)(*piVar1 + 8))(piVar1);
}
local_8._0_1_ = 1;
if (7 < (uint)param_1[0x12]) {
operator_delete((void *)param_1[0xd]);
}
param_1[0x12] = 7;
param_1[0x11] = 0;
*(undefined2 *)(param_1 + 0xd) = 0;
local_8 = (uint)local_8._1_3_ << 8;
if (7 < (uint)param_1[0xb]) {
operator_delete((void *)param_1[6]);
}
param_1[0xb] = 7;
param_1[10] = 0;
*(undefined2 *)(param_1 + 6) = 0;
*param_1 = MxConnectionCallback::vftable;
ExceptionList = local_10;
return;
}
```
## FUN_101139c0 at 101139c0
Signature: `undefined FUN_101139c0(void)`
```c
undefined4 * __thiscall FUN_101139c0(undefined4 *param_1,short *param_2,undefined4 param_3)
{
short sVar1;
uint uVar2;
short *psVar3;
void *local_10;
undefined1 *puStack_c;
undefined4 local_8;
puStack_c = &LAB_101726b3;
local_10 = ExceptionList;
uVar2 = DAT_101d60b8 ^ (uint)&stack0xfffffffc;
ExceptionList = &local_10;
*param_1 = MxConnectionCallback::vftable;
local_8 = 0;
param_1[1] = CReferenceToResolve::vftable;
*(undefined1 *)(param_1 + 2) = 0;
param_1[3] = RedundancyResolutionStatusCallback::vftable;
*param_1 = PreboundReference::vftable;
param_1[1] = PreboundReference::vftable;
param_1[3] = PreboundReference::vftable;
*(undefined1 *)(param_1 + 4) = 0;
param_1[5] = 0;
param_1[0xb] = 7;
param_1[10] = 0;
*(undefined2 *)(param_1 + 6) = 0;
psVar3 = param_2;
do {
sVar1 = *psVar3;
psVar3 = psVar3 + 1;
} while (sVar1 != 0);
FUN_100363d0(param_2,(int)psVar3 - (int)(param_2 + 1) >> 1);
local_8._1_3_ = (undefined3)((uint)local_8 >> 8);
param_1[0x12] = 7;
param_1[0x11] = 0;
*(undefined2 *)(param_1 + 0xd) = 0;
local_8._0_1_ = 2;
FUN_10113900(param_2);
param_1[0x19] = param_3;
param_1[0x1a] = 0;
*(undefined1 *)(param_1 + 0x1b) = 0;
param_1[0x21] = 7;
param_1[0x20] = 0;
*(undefined2 *)(param_1 + 0x1c) = 0;
param_1[0x27] = 0;
param_1[0x2a] = 0;
param_1[0x2b] = 0;
local_8 = CONCAT31(local_8._1_3_,8);
*(undefined1 *)(param_1 + 0x2c) = 0;
param_1[0x29] = 0;
if (DAT_101d8c40 == 0) {
FUN_10113070(uVar2);
}
FUN_101133d0();
(**(code **)(*(int *)param_1[0x19] + 4))((int *)param_1[0x19]);
ExceptionList = local_10;
return param_1;
}
```
## FUN_10113b10 at 10113b10
Signature: `undefined FUN_10113b10(void)`
```c
undefined4 * __thiscall FUN_10113b10(undefined4 *param_1,int *param_2,undefined4 param_3)
{
undefined4 *puVar1;
short sVar2;
char cVar3;
uint uVar4;
int iVar5;
short *psVar6;
short *psVar7;
undefined2 *puVar8;
void *local_10;
undefined1 *puStack_c;
undefined1 local_8;
undefined3 uStack_7;
puStack_c = &LAB_1017276f;
local_10 = ExceptionList;
uVar4 = DAT_101d60b8 ^ (uint)&stack0xfffffffc;
ExceptionList = &local_10;
*param_1 = MxConnectionCallback::vftable;
param_1[1] = CReferenceToResolve::vftable;
*(undefined1 *)(param_1 + 2) = 0;
param_1[3] = RedundancyResolutionStatusCallback::vftable;
*param_1 = PreboundReference::vftable;
param_1[1] = PreboundReference::vftable;
param_1[3] = PreboundReference::vftable;
*(undefined1 *)(param_1 + 4) = 0;
param_1[5] = 0;
param_1[0xb] = 7;
param_1[10] = 0;
*(undefined2 *)(param_1 + 6) = 0;
param_1[0x12] = 7;
param_1[0x11] = 0;
*(undefined2 *)(param_1 + 0xd) = 0;
uStack_7 = 0;
local_8 = 2;
param_1[0x14] = param_2;
if (param_2 != (int *)0x0) {
(**(code **)(*param_2 + 4))(param_2,uVar4);
}
param_1[0x15] = 0;
param_1[0x16] = 0;
param_1[0x17] = 0;
param_1[0x18] = 0;
param_1[0x19] = param_3;
param_1[0x1a] = 0;
*(undefined1 *)(param_1 + 0x1b) = 0;
param_1[0x21] = 7;
param_1[0x20] = 0;
*(undefined2 *)(param_1 + 0x1c) = 0;
param_1[0x27] = 0;
param_1[0x2a] = 0;
param_1[0x2b] = 0;
_local_8 = CONCAT31(uStack_7,0xe);
*(undefined1 *)(param_1 + 0x2c) = 0;
param_1[0x29] = 0;
if (DAT_101d8c40 == 0) {
FUN_10113070();
}
if (param_2 != (int *)0x0) {
puVar1 = param_1 + 0x15;
SysFreeString((BSTR)param_1[0x15]);
*puVar1 = 0;
iVar5 = (**(code **)(*(int *)param_1[0x14] + 0x20))((int *)param_1[0x14],puVar1);
if (iVar5 < 0) {
/* WARNING: Subroutine does not return */
FUN_1005bf30(iVar5,0,"E:\\BldSrc\\6\\s\\ExtInterfaces\\Lmx\\IMxReferencePtr.h",0x3f);
}
psVar7 = (short *)*puVar1;
if (psVar7 == (short *)0x0) {
psVar7 = &DAT_1017a514;
}
psVar6 = psVar7;
do {
sVar2 = *psVar6;
psVar6 = psVar6 + 1;
} while (sVar2 != 0);
FUN_100363d0(psVar7,(int)psVar6 - (int)(psVar7 + 1) >> 1);
puVar1 = param_1 + 0x15;
SysFreeString((BSTR)param_1[0x15]);
*puVar1 = 0;
iVar5 = (**(code **)(*(int *)param_1[0x14] + 0x20))((int *)param_1[0x14],puVar1);
if (iVar5 < 0) {
/* WARNING: Subroutine does not return */
FUN_1005bf30(iVar5,0,"E:\\BldSrc\\6\\s\\ExtInterfaces\\Lmx\\IMxReferencePtr.h",0x3f);
}
puVar8 = (undefined2 *)*puVar1;
if (puVar8 == (undefined2 *)0x0) {
puVar8 = &DAT_1017a514;
}
cVar3 = FUN_10134a10(puVar8);
if (cVar3 != '\0') {
psVar6 = (short *)FUN_1005f6b0();
psVar7 = psVar6;
do {
sVar2 = *psVar7;
psVar7 = psVar7 + 1;
} while (sVar2 != 0);
FUN_100363d0(psVar6,(int)psVar7 - (int)(psVar6 + 1) >> 1);
}
}
FUN_101133d0();
(**(code **)(*(int *)param_1[0x19] + 4))((int *)param_1[0x19]);
ExceptionList = local_10;
return param_1;
}
```
## FUN_10114620 at 10114620
Signature: `undefined FUN_10114620(void)`
```c
void __fastcall FUN_10114620(int param_1)
{
char cVar1;
undefined4 uVar2;
undefined4 uVar3;
undefined1 local_18 [4];
void *local_14;
void *local_10;
undefined1 *puStack_c;
undefined4 local_8;
local_8 = 0xffffffff;
puStack_c = &LAB_10172866;
local_10 = ExceptionList;
ExceptionList = &local_10;
if (*(char *)(*(int *)(param_1 + 100) + 0x6dc) != '\0') {
cVar1 = FUN_1005faf0(DAT_101d60b8 ^ (uint)&stack0xfffffffc);
if (cVar1 == '\0') {
local_14 = operator_new(0x1c);
local_8 = 0;
if (local_14 == (void *)0x0) {
local_14 = (void *)0x0;
}
else {
local_14 = (void *)FUN_10060b80();
}
local_8 = 0xffffffff;
FUN_1003ec10(*(undefined4 *)(param_1 + 0x50));
uVar3 = 0;
uVar2 = FUN_1002c750(&local_14);
FUN_10066e70(local_18,uVar2,uVar3);
local_14 = operator_new(0x1c);
local_8 = 1;
if (local_14 == (void *)0x0) {
local_14 = (void *)0x0;
}
else {
local_14 = (void *)FUN_10060b80();
}
local_8 = 0xffffffff;
FUN_1003ec10(*(undefined4 *)(param_1 + 0x50));
uVar3 = 0;
uVar2 = FUN_1002c750(&local_14);
FUN_10066e70(local_18,uVar2,uVar3);
*(undefined1 *)(*(int *)(param_1 + 100) + 0x6dd) = 1;
}
}
ExceptionList = local_10;
return;
}
```
## FUN_10112cd0 at 10112cd0
Signature: `undefined FUN_10112cd0(void)`
```c
void __fastcall FUN_10112cd0(int param_1)
{
uint uVar1;
void *pvVar2;
void *local_10;
undefined1 *puStack_c;
undefined4 local_8;
local_8 = 0xffffffff;
puStack_c = &LAB_1017247b;
local_10 = ExceptionList;
uVar1 = DAT_101d60b8 ^ (uint)&stack0xfffffffc;
ExceptionList = &local_10;
pvVar2 = operator_new(0x38);
local_8 = 0;
if (pvVar2 != (void *)0x0) {
FUN_1009f240(*(undefined4 *)(param_1 + 0x50),*(undefined2 *)(*(int *)(param_1 + 100) + 0x2ac),
param_1,*(int *)(param_1 + 100));
}
local_8 = 0xffffffff;
(*(code *)**(undefined4 **)(param_1 + 4))(uVar1);
ExceptionList = local_10;
return;
}
```
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,134 @@
# Lmx.dll xrefs
## 0x10196410 at 10196410
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10196400 at 10196400
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x101963f8 at 101963f8
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x101963f0 at 101963f0
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| `10112dd3` | `DATA` | `FUN_10112da0` |
| `10113a13` | `DATA` | `FUN_101139c0` |
| `10113b5f` | `DATA` | `FUN_10113b10` |
## 0x101963e8 at 101963e8
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| `10112dda` | `DATA` | `FUN_10112da0` |
| `10113a1a` | `DATA` | `FUN_101139c0` |
| `10113b66` | `DATA` | `FUN_10113b10` |
## 0x101963e0 at 101963e0
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10196418 at 10196418
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10196420 at 10196420
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x1018f268 at 1018f268
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x1018f260 at 1018f260
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x1018f258 at 1018f258
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x1018f270 at 1018f270
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10195488 at 10195488
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10195480 at 10195480
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10195478 at 10195478
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |
## 0x10195490 at 10195490
Target function: `(none)`
| From | Ref type | Caller function |
| --- | --- | --- |
| (none) | | |