Poverty Inspired Me to Fix a 'Wine Can't Do This' Timeout
说明与用途
问题:MetaTrader 5 在 Linux VPS 上的 Wine 环境中因 IPC 超时而无法初始化。解决方案:钩住 ReadFile,将 12 字节回复中的状态字节从 1 改为 2,使终端成功完成初始化。
问题
MetaTrader 5 failed to initialize under Wine on a headless Linux VPS, returning IPC timeout (-10005) after 30 seconds.
结果
By intercepting and modifying the IPC status byte in memory, the trader bypassed Wine’s deadlock, enabling MetaTrader 5 to initialize and run headlessly on a low‑cost Linux VPS.
工作流
- 1. Set up three isolated Wine prefixes, each with its own MT5 terminal and embedded Windows Python bridge.
- 2. Encountered multiple Wine‑on‑Ubuntu failures (pkill script, winedbg modal, stale X11 lock, registry patch, config encoding, NumPy crash).
- 3. Identified the core issue: MT5’s polling loop stuck on status 1, causing IPC timeout.
- 4. Hooked CreateFileW, WriteFile, ReadFile via ctypes to log IPC traffic.
- 5. Disassembled _core.pyd with Capstone to understand the polling logic.
- 6. Implemented a ReadFile hook that, when a 12‑byte reply with status 1 is detected, changes the status byte to 2 before the extension processes it.
- 7. Loaded the hook before mt5.initialize() to ensure the patch takes effect in memory only.
- 8. Verified mt5.initialize() returns True and the system runs headlessly.
证据
MetaTrader5’s Python package delegates everything to a compiled extension, _core.cp311-win_amd64.pyd.
The terminal was stuck reporting status 1, “still initializing.”
I rewrote that one byte to 2 before the extension’s own code ever saw it.
- 记录日期: 2026-10-06T22:40:51.948Z