c73a33edd8
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>
15 KiB
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;
}