From e839b37ee2cf91c8b41bd2e36777f88ab539ba50 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 17 Oct 2026 13:20:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(desk):=20=E4=BA=8B=E4=BB=B6=E7=8E=AF?= =?UTF-8?q?=E8=B6=8A=E7=95=8C=20=E2=80=94=E2=80=94=2064=20=E6=A7=BD?= =?UTF-8?q?=E8=B6=85=E5=87=BA=E6=AF=8F=20pid=200x1000=20=E5=8C=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 每 pid 事件环按 0x1000=4096B 间隔排布,而环总大小 = RingCtrl(16) + 64 × DeskMsg(64) = 4112B:第 63 号槽的最后 16 字节正好覆盖下一个 pid 的 RingCtrl(head/tail/size/_pad 被写成消息尾部)。后果:下一个 pid 的环 size=0、head==tail ⇒ 该进程的键盘/鼠标事件永远收不到;再对它 ring_push 会算 (tail+1)%0,除零异常直接打死 explorer —— 这就是'多窗口关闭后容易卡死/键盘无效'的根因之一。改为 63 槽(4048B),落在区间内。 --- vpsdk/desk.vp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vpsdk/desk.vp b/vpsdk/desk.vp index 059f15a..b458175 100644 --- a/vpsdk/desk.vp +++ b/vpsdk/desk.vp @@ -32,7 +32,10 @@ define DESK_VERSION = 1 define DESK_MAX_WIN = 8 define DESK_TITLE_MAX = 32 -define DESK_RING_SLOTS = 64 +# 每 pid 事件环间隔 0x1000;环总大小 = RingCtrl(16) + SLOTS × DeskMsg(64),必须 ≤ 0x1000。 +# 64 槽会占 4112B,第 63 号槽的尾部覆盖下一个 pid 的 RingCtrl(size 被写 0 ⇒ 该 pid 收不到事件, +# 且 ring_push 的 (tail+1)%0 会除零打死图形壳),所以取 63(4048B)。 +define DESK_RING_SLOTS = 63 # 固定偏移 define DESK_OFF_HEADER = 0x000000