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>
17 KiB
17 KiB
NmxAdptr.dll
- Path:
C:\Program Files (x86)\ArchestrA\Framework\Bin\NmxAdptr.dll - Size: 369536 bytes
- Machine: x86
- PE timestamp: 2020-04-06T01:17:01+00:00
- ImageBase:
0x10000000
Exports
| Ordinal | RVA | Name |
|---|---|---|
| 1 | 0x00016d93 | DllCanUnloadNow |
| 2 | 0x0001e66a | DllGetClassObject |
| 3 | 0x0001ee73 | DllRegisterServer |
| 4 | 0x0001ee82 | DllUnregisterServer |
Imports
WS2_32.dll:gethostbyname,inet_addr,setsockopt,WSACleanup,WSAGetLastError,WSASocketW,inet_ntoa,sendto,recvfrom,select,closesocket,WSAStartupKERNEL32.dll:UnmapViewOfFile,lstrlenW,GetLastError,EnterCriticalSection,LeaveCriticalSection,InitializeCriticalSectionAndSpinCount,DeleteCriticalSection,GetProcAddress,GetModuleHandleW,FreeLibrary,FindClose,FindFirstFileW,GetModuleFileNameW,InterlockedIncrement,LocalFree,GetSystemDirectoryW,GetWindowsDirectoryW,LoadLibraryExW,FindNextFileW,LocalAlloc,FormatMessageW,CreateDirectoryW,MultiByteToWideChar,lstrlenA,GetCurrentThreadId,GetLocalTime,InterlockedDecrement,OutputDebugStringW,MapViewOfFile,OpenFileMappingW,CreateFileMappingW,GetTickCount,DeleteFileW,GetCurrentProcess,GetCurrentProcessId,CreateFileW,GetComputerNameW,SetEvent,WaitForMultipleObjects,CreateThread,CreateEventW,TerminateThread,ReleaseMutex,WriteFile,SetFilePointer,GetPrivateProfileIntA,GetModuleFileNameA,GetPrivateProfileStringA,CreateFileA,OutputDebugStringA,GetFileAttributesW,DisableThreadLibraryCalls,WideCharToMultiByte,Sleep,HeapFree,HeapAlloc,GetProcessHeap,RaiseException,EncodePointer,GetSystemTimeAsFileTime,QueryPerformanceCounter,IsDebuggerPresent,SetUnhandledExceptionFilter,WaitForSingleObject,CloseHandle,CreateMutexW,DecodePointer,InterlockedExchange,InterlockedCompareExchange,TerminateProcess,UnhandledExceptionFilter,FlushFileBuffersUSER32.dll:CharNextW,wsprintfA,UnregisterClassW,InSendMessageExADVAPI32.dll:SetSecurityDescriptorDacl,RegOpenKeyExW,RegCloseKey,RegQueryValueExW,RegSetValueExW,InitializeSecurityDescriptorole32.dll:CoTaskMemAlloc,CoUninitialize,CoCreateFreeThreadedMarshaler,CoFileTimeNow,CoTaskMemRealloc,CoInitialize,CoCreateInstance,CoTaskMemFreeOLEAUT32.dll:VariantInit,VariantClear,VariantChangeType,SysStringLen,SysFreeString,VarBstrCat,SysAllocString,SysAllocStringByteLen,SysStringByteLen,SysAllocStringLen,SetErrorInfo,GetErrorInfo,UnRegisterTypeLib,RegisterTypeLib,CreateErrorInfoATL100.DLL:ord_64,ord_61,ord_68,ord_56,ord_49,ord_15,ord_32,ord_23,ord_30SHLWAPI.dll:PathAppendW,PathRemoveFileSpecWMSVCP100.dll:??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@XZ,?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ,??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ,?width@ios_base@std@@QBE_JXZ,?flags@ios_base@std@@QBEHXZ,?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ,?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z,?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JPB_W_J@Z,?width@ios_base@std@@QAE_J_J@Z,?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z,?uncaught_exception@std@@YA_NXZ,?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ,?good@ios_base@std@@QBE_NXZ,?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ,?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ,?_BADOFF@std@@3_JB,?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ,?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z,?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z,?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z,??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z,??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ,?_Orphan_all@_Container_base0@std@@QAEXXZ,??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z,?ends@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z,??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@J@Z,??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z,??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAE@XZ,?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z,?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ,?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEXABVlocale@2@@Z,?setf@ios_base@std@@QAEHHH@Z,?_Xout_of_range@std@@YAXPBD@Z,?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W0@Z,?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ,?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ,?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ,?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ,?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ,?_Xlength_error@std@@YAXPBD@Z,?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ,??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ,?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ,?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ,?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JXZ,?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ,?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JPA_W_J@Z,?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JPB_W_J@Z,?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEPAV12@PA_W_J@Zdbghelp.dll:MiniDumpWriteDumpMSVCR100.dll:realloc,_unlock,__dllonexit,_lock,sprintf_s,vsprintf_s,strlen,strncpy_s,fopen_s,fclose,fprintf,_snprintf_s,_purecall,wcsncpy_s,strrchr,_wcsicmp,_onexit,?terminate@@YAXXZ,_malloc_crt,_encoded_null,_initterm,_initterm_e,_amsg_exit,__CppXcptFilter,_except_handler4_common,?_type_info_dtor_internal_method@type_info@@QAEXXZ,_crt_debugger_hook,__clean_type_info_names_internal,malloc,_vsnwprintf_s,swprintf_s,memmove_s,_stricmp,??3@YAXPAX@Z,wcsrchr,free,memcmp,memcpy_s,strstr,memcpy,memmove,??2@YAPAXI@Z,__CxxFrameHandler3,_snwprintf_s,_CxxThrowException,memset,wcscat_s,_wsplitpath_s,??_V@YAXPAX@Z,??1exception@std@@UAE@XZ,??0exception@std@@QAE@ABQBD@Z,?what@exception@std@@UBEPBDXZ,wcslen,??0exception@std@@QAE@ABV01@@Z,?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z,_splitpath_s,_makepath_s,calloc,_recalloc,wcscpy_s,wcscmp
Resources
| Type | ID/name | Lang | RVA | Size |
|---|---|---|---|---|
REGISTRY |
101 |
1033 | 0x0003d1cc | 628 |
REGISTRY |
102 |
1033 | 0x0003d440 | 641 |
TYPELIB |
1 |
1033 | 0x0003d6c4 | 108824 |
6 |
7 |
1033 | 0x00057fdc | 48 |
16 |
1 |
1033 | 0x0005800c | 964 |
24 |
2 |
1033 | 0x000583d0 | 346 |
GUID hits
(none)
Interesting strings
_lNetNMXHeartbeatsMissedCntWWl!0m=NMXMTYPE_HEARTBEAT_DISCONNECT_REQWWW!SlNetNMXHeartbeatPeriodWWl(preboundReferenceHandleW<()pNmxStatsInfoWWWx7********** End of Nmx Dump **********-__MIDL___MIDL_itf_NmxAdptr_0001_0081_0001WWW.?AUINmx2@@.?AUINmx3@@.?AUINmx4@@.?AUINmx@@.?AUINmxHeartbeat@@.?AUINmxStatistics@@.?AUINmxSvcCallback@@.?AUINmxSvcStatistics@@.?AV?$CComCoClass@VCNmxAdapter@@$1?CLSID_Nmx@@3U_GUID@@B@ATL@@.?AV?$CComCoClass@VCNmxStatistics@@$1?CLSID_NmxStatistics@@3U_GUID@@B@ATL@@.?AV?$CComObject@VCNmxAdapter@@@ATL@@.?AV?$CComObject@VCNmxStatistics@@@ATL@@.?AVCNmxAdapter@@.?AVCNmxAdptrStats@@.?AVCNmxStatistics@@/PutRequestEx@0()MxSourceRequestingNmxWWW0<NNmxSvcDisconnectingW0=vMX_E_LmxInvalidCommandWW0^BNmxSvcConnectedW0pNmxSvcStats5MxSecurityVerifiedWriteW8APrebindReferenceExWW$,8WYINmxSvcStatisticsWWW:MX_E_SecuredWriteWWW<nmx packet is null>=NMXMTYPE_SET_HEARTBEAT_RATEW>NMXMTYPE_VERSION_ERRORWWAdapter_%d CNmxAdapter::PutRequest received invalid argument. Size is %dAdapter_%d CNmxAdapter::PutRequest received invalid pointer.Adapter_%d Enter PutRequest. Destination Platform %d Engine %d is OVERLOADEDAdapter_%d Enter PutRequest. Destination: Platform %d, Engine %d. Size = %dAdapter_%d Enter PutRequestEx. Destination: Platform %d, Engine %d. Size = %dAdapter_%d GetResponse from Platform %d Engine %d, Cookie=%d, Size=%d, RespCode=%xAdapter_%d PutRequest failed. Dest Platform=%d, Engine=%d. Cookie=%d.Adapter_%d PutRequest successfully to Platform=%d, Engine=%d. Cookie=%d.Adapter_%d PutRequestEx failed. Dest Platform=%d, Engine=%d.Adapter_%d PutRequestEx successfully to Platform=%d, Engine=%d.Adapter_%d couldn't Initialize NmxSvc.Any User cam write to these attributes. No security checking is done.WaC:\nmx_objectdebug.iniCNmxAdapter::CheckTimeouts - calling TransferData to platform %d, engine %d, message %SCNmxAdapter::CleanRequests - calling ProcessDataReceived to platform %d, engine %d, message %sCNmxAdapter::ClearStats m_pListAnonymousID is set to NULLCNmxAdapter::ClearStats succededCNmxAdapter::FinalRelease - enterCNmxAdapter::FinalRelease - exitedCNmxAdapter::GenerateErrorRequest - failed to allocate memory size %dCNmxAdapter::GenerateErrorRequest() entered.CNmxAdapter::GenerateErrorRequest() exited.CNmxAdapter::GetAnonymousEngineID - *m_pListAnonymousID %dCNmxAdapter::GetAnonymousEngineID - *pEngineID %dCNmxAdapter::GetAnonymousEngineID - ENTERCNmxAdapter::GetAnonymousEngineID - FAILEDCNmxAdapter::GetAnonymousEngineID - m_pNmxStats == NULLCNmxAdapter::GetPartnerVersion NmxSvc pointer 0x%x, hr 0x%xCNmxAdapter::GetPartnerVersion NmxSvc pointer reinitialized 0x%x, hr 0x%xCNmxAdapter::GetPartnerVersion for platform lPlatformId %d, plVersion %d hr 0x%xCNmxAdapter::GetPriorityRequest - Discarding expired %d byte message from P%d E%d (cookie %d). In total: %d messages %I64d bytesCNmxAdapter::GetResponse - ENTER: found a response for Engine %dCNmxAdapter::GetResponse - GetPacketsSentInfo return NULL ptr for C%d P%d E%dCNmxAdapter::GetResponse - m_Id.EngineId %d from Platform %d Engine %d, Cookie=%d, Size=%d, RespCode=%xCNmxAdapter::GetResponse - m_Id.EngineId %d got an exceptionCNmxAdapter::GetResponse - m_Id.EngineId Platform %d Engine %d, *pdwRequestHandle %d *pdwSize %d *pdwResponseCode %xCNmxAdapter::Initialize - EXITCNmxAdapter::Initialize - GetAnonymousEngineID FAILED.CNmxAdapter::InitializeAnonymous - ENTER pPlatformId %d pEngineId %dCNmxAdapter::InitializeAnonymous - EXITCNmxAdapter::InitializeAnonymous - InitNmxStats FAILEDCNmxAdapter::ParseExtendedRequest - DISABLE_ENGINE_DIAGS on C%d P%d E%dCNmxAdapter::ParseExtendedRequest - ENABLE_ENGINE_DIAGS on C%d P%d E%dCNmxAdapter::ParseExtendedRequest - NMX_DUMP_LEVEL1 on C%d P%d E%dCNmxAdapter::ParseExtendedRequest - NMX_DUMP_LEVEL2 on C%d P%d E%dCNmxAdapter::ParseExtendedRequest - NMX_DUMP_LEVEL3 on C%d P%d E%dCNmxAdapter::ParseExtendedRequest - NMX_DUMP_LEVEL4 on C%d P%d E%dCNmxAdapter::PutBadVersionResponse - Adapter_%d Failed PutResponse to Platform %d, Engine %d. Cookie=%d. TransferData Error=%xCNmxAdapter::PutBadVersionResponse - Adapter_%d PutResponse to Platform %d, Engine %d. Cookie=%d. Size = %d.CNmxAdapter::PutBadVersionResponse - calling TransferData to platform %d engine %d dwSize %d message %SCNmxAdapter::PutRequest - ENTER m_Id.EngineId %d Destination: Platform %d, Engine %d. Size = %dCNmxAdapter::PutRequest - FAILED (hr = %X). Sending from EngineId %d to dwPlatformId %d dwEngineId %d. *pdwRequestHandle %d.CNmxAdapter::PutRequest - m_Id.EngineId %d successfully to Platform=%d, Engine=%d. Cookie=%dCNmxAdapter::PutRequestEx - ENTER m_Id.EngineId %d Destination: Platform %d, Engine %d. Size = %dCNmxAdapter::PutRequestEx - TransferData FAILED (hr = %X). Sending from EngineId %d to dwPlatformId %d dwEngineId %d.CNmxAdapter::PutRequestEx - calling TransferData to platform %d engine %d %x dwSize %d message %SCNmxAdapter::PutRequestEx - m_Id.EngineId %d successfully put request to Platform=%d, Engine=%d.CNmxAdapter::PutResponse - Adapter_%d Failed to put response to Platform %d, Engine %d. Cookie=%d. Error=%xCNmxAdapter::PutResponse - Adapter_%d PutResponse to Platform %d, Engine %d. Cookie=%d. Size = %d.CNmxAdapter::PutResponse - calling TransferData to platform %d dwSize %d message %SCNmxAdapter::RemoveSubscriberEngine SyncCallThreadFn timed outCNmxAdapter::RemoveSubscriberEngine SyncCallThreadFn was called. Return value is 0x%x.CNmxAdapter::RemoveSubscriberEngine is called, but current window procedure is processing a input-synchronous message.CNmxAdapter::SyncCallThreadFn exitedCNmxAdapter::TransferData FAILED. NmxSvc cannot be createdCNmxAdapter::TransferData recreating NmxSvcCNmxAdapter::isEngineValid Unknown error from Bootstrap::GetPlatformIdentity(), hr = %xCNmxAdapter::~CNmxAdapter - enterCNmxAdapter::~CNmxAdapter - exitCNmxAdapter_%d::GetConnectionInfo - will connect to platform %dCalling ReRegisterNmxSvc in TransferData because NmxSvc pointer is bad.CoTaskMemAlloc() failed in CNmxAdapter::GetRequest()CoTaskMemAlloc() failed in CNmxAdapter::GetResponse()CoTaskMemAlloc() failed in CNmxAdapter::PutBadVersionResponse()CoTaskMemAlloc() failed in CNmxAdapter::PutRequestEx()CurVer = s 'NmxAdptr.NmxStatistics.1'CurVer = s 'WonderWare.Nmx.CNmxAdapter.1'E:\BldSrc\6\s\src\Nmx\NmxAdptr\Release\NmxAdptr.pdbEGetResponse2ElNmxMsgMxTimeoutFC:\nmxdebug.iniFailed to create share memory for NmxStatisticsFailed to locate MiniDumpWriteDump to generate minidump. Maybe old version of dbghelp.dll is being used.ForceRemove {4169B47A-54BD-11D3-A9CC-00A0C9FB55A0} = s 'NmxStatistics Class'ForceRemove {42DB0511-28BE-11D3-80C0-00104B5F96A7} = s 'NmxAdptr'GetNmxStatisticsGetNmxSvcStatisticsWGetResponseWGlobal\Nmx.StatisticGlobal\Nmx.Statistic.LockIBootstrapController InterfaceIBootstrapController2 InterfaceWWWIBootstrapController3 InterfaceWWW'IBootstrapController4 InterfaceWWWIBootstrapController5 InterfaceWWWIBootstrapProcessController InterfaceWIBootstrapRegister InterfaceWW!IBootstrapRegister2 InterfaceWIBootstrapRegister3 InterfaceWIBootstrapRegister4 InterfaceWIBootstrapRegister5 InterfaceWIBootstrapRegister6 InterfaceW"IBootstrapRegistryAccess Interface%IBootstrapStatusCallback InterfaceIFMC InterfaceIFMCCallback InterfaceIInfoNotify InterfaceWIMCHeartbeatCallback InterfaceINmx2WWWINmx3WWW@INmx4WWWINmxHeartbeatWWWINmxNotifyWWINmxService InterfaceWINmxService2 InterfaceINmxServiceWdINmxStatistics InterfaceWWINmxStatus InterfaceWWINmxStatusWWINmxSvcCallbackWIPlatformInfoServer InterfaceWIPlatformInfoServer2 InterfaceIPlatformInformationClerk InterfaceWWW$IPlatformInformationClerk2 InterfaceWW$IPlatformInformationClerk3 InterfaceWWIPlatformStatusCallback InterfaceWIProcessStatusCallback InterfaceWWIStatusNotify InterfaceWWWIUdpMessage InterfaceWInitializeAnonymous() - InitNmxService failed.InternalAddRef() CNmxAdapter::%p refcount = %dInternalRelease() CNmxAdapter::%p refcount = %dMINmxService2MX_E_LmxVersionMismatchWMX_E_NotWriteableWWWMX_E_VerifiedWriteWWMX_E_WriteAccessDeniedWWMiniDumpWriteDumpMxSecuritySecuredWriteWWMxSourceRequestingLmxWWWMxSourceRespondingLmxWWWMxSourceRespondingNmxWWWNMX Header %s: buffer size pktHeader.dwDataSize %d doesn't match received message size of %dNMXMTYPE_CONNECT_INFOWWWNMXMTYPE_CONNECT_INFO_REQWWWNMXMTYPE_ENGINE_DATANMXMTYPE_GET_HEARTBEAT_RATEWNMXMTYPE_PLATFORM_HEARTBEATWNPutRequest2WNmxAdapter.cppNmxAdptrNmxAdptr CoCreateInstance for NmxSvc returned error 0x%xNmxAdptr ModuleNmxAdptr.DLLNmxAdptr.NmxStatistics = s 'NmxStatistics Class'NmxAdptr.NmxStatistics.1 = s 'NmxStatistics Class'NmxQueueErrorNmxQueueHandleNmxRefCountNmxService ClassWWNmxServiceWWNmxStatistics ClassWWW#NmxStatistics.cppNmxStatisticsWWWNmxSubscriberEngine- ... 72 more