win: 缓存 uv__windows10_version1709() 的结果并检查 RtlGetVersion 的返回值
小型硬化后继5107 ("赢:适当初始化OSVERSIONINFOW"). 首先,谢谢你的帮助。
上下文:我们独立地导致了#5107在长期生产节点服务(Node v24.1.5.0 bundling libuv 1.51.0,Windows 11 建造了 26200,反复出现的 " 0xC000409 " / " FAIL FAST STACK BUFER OVERRUN STACK COOKIE CHECK FAILURE " at " uv tcp connect " )中修复的崩溃。 三个独立的相撞垃圾场显示了帧/GS cookie 为字节所覆盖的字节,与机器的"RTL OSVERSIONINFOEXW"尾巴相接("wsuiteMask"/"wProductType"等)相接,我们在连接之前用被接受的"dwOSVersionInfoSize"的值来画出一个定型重塑. 在准备上游报告时,我们发现5107号已经着陆。 该分析得出的两个小观察仍然适用于v1.x头:
**1. `uv windows10 version1709 ()'在每次通话中都重复OS版本。 **
它运行在每条"uv tcp connect()"(src/win/tcp.c:860)上,领先于"uv is loopback()"短路,因此非loopback连接也会支付它)和守住路径(src/win/tcp.c:94)上. Windows 版本在进程运行时不能更改,因此可以一次性计算结果(一个"静态"一发,或折叠成已存在的一次性内接),每个接通时会节省一个syscall. 它也会缩小爆炸半径, 如果在这名帮助者中再次出现# 5107 前的bug : 由于调用坐在每一个连接上, 我们的服务将一个小的每个调用概率变成每天几个无声过程中止。
**2. `pRtlGetVersion'的回转值没有被检查。 **
结构地被无条件信任. 使用“ dwOSVersionInfoSize ” 现在已关闭, 这大多是带和套接字, 但允许API 失败,
乐于分享垃圾处理分析 或是我们调查的堆放纸 如果有用的话.
内容来源: libuv/libuv