Chuyu-Team / YY-Thunks

Fix DecodePointer, EncodePointer,RegDeleteKeyEx etc. APIs not found in Windows XP RTM.
MIT License
567 stars 103 forks source link

让rust程序支持Windows XP RTM(rust程序兼容性问题请统一在此帖回复) #80

Open han1548772930 opened 4 months ago

han1548772930 commented 4 months ago

背景

rust也放弃了兼容Windows 7或者XP,需要YY-Thunks统一支持。如果您遇到rust相关项目API缺失,请在此帖统一回复。

如果你的程序提示找不到API,请使用YY-Thunk内置的YY.Depends.Analyzer扫描你的应用程序。扫描程序将检查所有缺失的API,并且整理成报告,这样可以极减少遗漏的概率。

当API不存在时往往存在其他API缺失,如果依靠系统的弹窗,这个处理效率是非常堪忧的。

; 比如分析Google浏览器 XP系统上缺失的API,可以输入以下命令,YY.Depends.Analyzer在Release产物中提供。
YY.Depends.Analyzer  "C:\Program Files\Google\Chrome\Application\125.0.6422.113" /IgnoreReady

缺失或者功能不全的函数

Ws2_32.dll

KERNEL32.DLL

mingkuang-Chuyu commented 4 months ago

新版本已经发布 https://github.com/Chuyu-Team/YY-Thunks/releases/tag/v1.0.10-Beta6

mingkuang-Chuyu commented 3 months ago

@wapznw 请在这里回复,如果需要进一步处理,至少提供导致失败的API。

wapznw commented 3 months ago

好像是mio中调用WSAIoctl传递的SIO_BASE_HANDLE在Windows XP中不支持。 https://github.com/tokio-rs/mio/blob/1a738f9d751eabf4c136e782a423ce4ef2661c81/src/sys/windows/selector.rs#L651

mingkuang-Chuyu commented 3 months ago

好像是mio中调用WSAIoctl传递的SIO_BASE_HANDLE在Windows XP中不支持。 https://github.com/tokio-rs/mio/blob/1a738f9d751eabf4c136e782a423ce4ef2661c81/src/sys/windows/selector.rs#L651

已经更新需求,因为rust的人比较少所以暂时只记录问题(目前也还有很多其他API缺失问题需要处理,人力不足)。

如果你有解决方案也可以提交PR到YY-Thunks。

huiminghao commented 3 months ago

好像是mio中调用WSAIoctl传递的SIO_BASE_HANDLE在Windows XP中不支持。 https://github.com/tokio-rs/mio/blob/1a738f9d751eabf4c136e782a423ce4ef2661c81/src/sys/windows/selector.rs#L651

mio不支持xp系统。目前也没有人做这方面的移植工作,所以所有与async相关的net io库都不能用。std的应该还是可以用的。

mingkuang-Chuyu commented 3 months ago

mio不支持xp系统。目前也没有人做这方面的移植工作,所以所有与async相关的net io库都不能用。std的应该还是可以用的。

这些信息我们知道,所以需要做的是在yY-Thunks里重新支持上那些不支持的功能,这样mio就可以正常在XP使用了。

zhuxiujia commented 2 months ago

mio不支持xp系统。目前也没有人做这方面的移植工作,所以所有与async相关的net io库都不能用。std的应该还是可以用的。

这些信息我们知道,所以需要做的是在yY-Thunks里重新支持上那些不支持的功能,这样mio就可以正常在XP使用了。

原因: 我检查了 @wapznw 说的问题,直接运行tokio编译的exe 并调用绑定http端口会提示calledResult::unwrap()on anErrvalue: Os { code: 10022, kind: InvalidIn t, message: "提供了一个无效的参数。" } 原因是mio调用的WSAIoctl 操作只支持vista以上。

如何解决: 我强制修改了mio的源码 注释掉所有的WSAIoctl 调用后,在windows server 2003系统(应该和xp同个内核)上正常运行。 YY-Thunk 可以做到 在xp上检测到调用WSAIoctl 则返回Ok(socket)。

副作用: 开始的几次请求没有问题,正常响应,过了一段时间会报错

unexpected error when polling the I/O driver: Os { code: 995, kind: TimedOut,
ssage: "由于线程退出或应用程序请求,已放弃 I/O 操作。" }
muyu1944 commented 2 months ago

@zhuxiujia 注释掉肯定是不行的,wsaloctl相当于是获取一个可异步操作的socket句柄,如果没有这一步,等于是在异步环境中使用一个同步的socket。 你可以试试把mio执行的设置SIO_BASE_HANDLE控制码改为设置FIONBIO

zhuxiujia commented 2 months ago

@zhuxiujia 注释掉肯定是不行的,wsaloctl相当于是获取一个可异步操作的socket句柄,如果没有这一步,等于是在异步环境中使用一个同步的socket。 你可以试试把mio执行的设置SIO_BASE_HANDLE控制码改为设置FIONBIO

用ioctlsocket 调用FIONBIO 还是不行的,tokio还是会出现 “由于线程退出或应用程序请求,已放弃 I/O 操作。”

zhuxiujia commented 1 month ago

好像是mio中调用WSAIoctl传递的SIO_BASE_HANDLE在Windows XP中不支持。 https://github.com/tokio-rs/mio/blob/1a738f9d751eabf4c136e782a423ce4ef2661c81/src/sys/windows/selector.rs#L651

应该和SIO_BASE_HANDLE 没关系,在win11上 注释掉SIO_BASE_HANDLE 这些代码直接使用base_socket 也不影响正常运行

zhuxiujia commented 1 month ago

我的测试步骤是 1 修改tokio依赖的mio库源码,使其调用SIO_BASE_HANDLE 的时候 直接返回它提供的base socket。(这一步没问题,win11完全正常) 2 用YY-Thunks编译到xp/2003系统上后,发现服务能起来,但是http请求2-3次后 ,http请求就卡死在请求状态没有响应。 3 初步怀疑是mio源码中 IOCP的 GetQueuedCompletionStatusEx 导致,我修改rust源码改成了GetQueuedCompletionStatus 后编译到xp/2003 运行 还是一样http请求2-3次后 ,请求就卡死在请求状态没有响应。win11却是正常的,因此这个原因基本可以排除掉 4 第二次搜索mio的源码,发现以Ex结尾的系统函数中就 怀疑是mio中调用NtCancelIoFileEx 导致(YY-Thunks暴力的直接链接到了NtCancelIoFile),于是反过来验证能否在win11上能复现xp上的卡死情况。 于是我把mio中 NtCancelIoFileEx 改成了 NtCancelIoFile ,发现在win11上也出现了 请求2-3次后 ,http请求就卡死在请求状态没有响应。

结论: 1.SIO_BASE_HANDLE 问题可以直接返回参数传递的base socket 的handle来解决。 2.NtCancelIoFileEx 的替代品 暂时没有找到解决方案,而YY-Thunks链接的 NtCancelIoFile功能又不一样,因为前者是取消未完成I/O操作,后者是取消所有I/O操作(猜测链接到了NtCancelIoFile 取消所有IO操作大概率就是导致请求无响应的元凶)