ARM64 Windows: desktop app crashes ~16s after every launch - Codex Micro serialport addon delay-load failure (0xC06D007F)
ARM64 Windows: ChatGPT desktop crashes ~16s after every launch — Codex Micro serialport addon delay-load failure (0xC06D007F)
Summary
On ARM64 Windows, the ChatGPT desktop app's main (browser) process dies ~16 seconds after every launch. The window appears, then vanishes. It is 100% reproducible.
The cause is the bundled Work Louder / Codex Micro serialport native addon. It delay-imports napi_create_function from node.exe, which node-gyp's delay-load hook resolves to the host executable (ChatGPT.exe). ChatGPT.exe exports no N-API symbols — they live in chrome.dll. The lookup fails, the Visual C++ delay-loader raises 0xC06D007F, and because it's an SEH exception at dlopen time, the app's JS try/catch cannot catch it. The process dies.
Impact
Any ARM64 Windows user with Codex Micro enabled cannot open the app at all. First crash on this machine: 2026-07-15 ~11:52 ET, with no local change — consistent with a server-side rollout of the Codex Micro feature. The app was working normally before that.
Environment
| | |
|---|---|
| App | ChatGPT desktop (OpenAI.Codex) 26.707.9981.0, arm64, MSIX |
| ChatGPT.exe | 150.0.7871.115, built 2026-07-07 |
| Client version (logs) | 26.707.72221 |
| OS | Windows 11 build 26220, ARM64 (Surface Pro X / Snapdragon, 8 cores) |
| Serial devices | 6 COM ports present (4x Surface UART, 2x Bluetooth SPP) |
Root cause
Decoded DelayLoadInfo from the Crashpad minidump:
exception code : 0xC06D007F = VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND)
szDll : "node.exe"
szProcName : "napi_create_function"
fImportByName : 1
hmodCur : 0x7FF658A80000 -> ...\OpenAI.Codex_26.707.9981.0_arm64__2p2nqsd0c76g0\app\ChatGPT.exe
pfnCur : 0x0
dwLastError : 127 (ERROR_PROC_NOT_FOUND)
ptype : browser (main process -> whole app dies)
The szDll / szProcName strings live in the .rdata of:
app\resources\app.asar.unpacked\node_modules\@worklouder\device-kit-oai\
node_modules\@worklouder\wl-device-kit\node_modules\serialport\
node_modules\@serialport\bindings-cpp\prebuilds\win32-arm64\node.napi.node
Export tables confirm the mismatch:
| Binary | Total exports | N-API exports | napi_create_function? |
|---|---|---|---|
| ChatGPT.exe | 2 | 0 | NO |
| chrome.dll | 3174 | 158 | YES |
| chrome_elf.dll | 27 | 0 | NO |
node-gyp's stock win_delay_load_hook.cc intercepts the node.exe load and returns GetModuleHandle(NULL) — the host exe. In standard Electron that exe exports the N-API symbols. In this Chromium-shell architecture they're in chrome.dll, so the hook resolves to a module that cannot satisfy the import.
The first-party addons are built correctly and load fine — better_sqlite3.node, windows-account.node, windows-updater.node are all loaded in the same process at crash time. Only the vendored third-party prebuild is wrong. win32-arm64 is the only prebuild shipped, so there is no fallback.
Trigger path
renderer -> IPC -> CodexMicroHostService.getState()
-> eS.getService()
-> require('./codex-micro-service-CR6sUcZG.js')
-> top-level: createRequire(__filename)('@worklouder/device-kit-oai')
-> @worklouder/wl-device-kit -> serialport -> @serialport/bindings-cpp
-> LoadLibrary(prebuilds/win32-arm64/node.napi.node)
-> delay-load napi_create_function from ChatGPT.exe -> NULL -> 0xC06D007F -> fatal
The try/catch around discovery.findWLDevices([DeviceType.Project2077]) cannot help — the crash happens earlier, during require, and is a native SEH exception.
Reproduction
- ARM64 Windows 11, ChatGPT desktop 26.707.9981.0, Codex Micro enabled.
- Launch the app.
- ~16s later the main process dies; a Crashpad dump lands in
%LOCALAPPDATA%\Packages\OpenAI.Codex_2p2nqsd0c76g0\LocalCache\Roaming\Codex\web\Codex\Crashpad\reports.
Observed 3/3 launches, identical signature each time (dumps at 15:21:44, 15:36:45, 16:00:05).
Suggested fix
- Rebuild/relink the
@serialport/bindings-cppwin32-arm64 prebuild against the host that actually exports the N-API symbols (chrome.dll), matching how the first-party addons are built — e.g. a custom delay-load hook returningGetModuleHandle("chrome.dll")instead ofGetModuleHandle(NULL). node-hid'sHID.nodesits in the same@workloudertree and is very likely to hit the identical failure once serialport is fixed — please check it too.- Defensive: wrap the
codex-micro-servicerequire so a failure degrades the feature instead of killing the main process. (Note: an SEH delay-load failure is not catchable from JS — the real fix must be #1.) - Short term: consider gating the Codex Micro rollout off for ARM64 Windows until the addon is rebuilt. This unblocks affected users immediately.
Note
There is no user-side workaround. The broken file is inside the signed MSIX package, and Windows blocks modification even for an elevated Administrator that has taken ownership.
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗