Files
mxaccess/analysis/ghidra/exports/Lmx.dll.synthesizer-helpers-decompile.md
T
Joseph Doherty c73a33edd8
rust / build / test / clippy / fmt (push) Has been cancelled
rust / cargo public-api drift check (F41) (push) Has been cancelled
[R3/R4 Path A] mxaccess: port Lmx.dll FUN_10100ce0 synthesizer kernel
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>
2026-05-06 07:08:36 -04:00

15 KiB

Lmx.dll selected decompile

FUN_10003fc0 at 10003fc0

Signature: undefined FUN_10003fc0(void)


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)


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)


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)


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)


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)


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)


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)


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)


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;
}