From 40dce42fd7db063db98bafe9b556690da6915fc2 Mon Sep 17 00:00:00 2001 From: chenjiangqun Date: Thu, 2 Jul 2026 10:58:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84A=E5=8D=A1=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E4=B8=8D=E7=A8=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WinISP/FormISP_MSI.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/WIN10_WinISP_SrcCode_For_MOKA_20250416_1/WinISP/FormISP_MSI.cs b/WIN10_WinISP_SrcCode_For_MOKA_20250416_1/WinISP/FormISP_MSI.cs index 12a876e..83a8b89 100644 --- a/WIN10_WinISP_SrcCode_For_MOKA_20250416_1/WinISP/FormISP_MSI.cs +++ b/WIN10_WinISP_SrcCode_For_MOKA_20250416_1/WinISP/FormISP_MSI.cs @@ -308,7 +308,32 @@ namespace WinISP continue; } - int reportedDataLen = recv[1] & 0x7F; // DDC响应头中声明的数据长度 + // ── DDC XOR 校验和验证 ────────────────────────────── + // DDC/CI 协议: XOR(recv[0]..recv[checksumPos]) 必须 = 0x00。 + // AMD ADL 偶尔返回损坏的响应头(reportedDataLen 被放大), + // 导致 recv[1] 和后续字节与实际数据不匹配,校验和必定失败。 + // 校验成功 = 数据完整可信;校验失败 = 丢弃此轮读取。 + int reportedDataLen = recv[1] & 0x7F; + int checksumPos = 2 + reportedDataLen; + bool checksumOk = false; + if (recv.Length > checksumPos) + { + byte xor = 0; + for (int i = 0; i <= checksumPos; i++) + xor ^= recv[i]; + checksumOk = (xor == 0); + } + // 如果 recv 太短不包含校验和(如 N卡截断),仍继续使用数据 + if (!checksumOk && recv.Length > checksumPos) + { + frmISP.WriteLog( + $"[DDC] cmd=0x{subCmd:X2} checksum FAIL, reportedDataLen={reportedDataLen}, " + + $"recvLen={recv.Length} — corrupted response discarded", + "debug"); + WinIOLib.DelayMs(20); + continue; + } + // ── End 校验和验证 ────────────────────────────────── // 先按原始方式扫描整个buffer找\0(用于完整性判断) // 然后截断到 reportedDataLen,排除末尾DDC校验和字节