为啥 WTSFreeMemoryExA 在传递 WTSTypeSessionInfoLevel1 的 WTSTypeClass 时总是返回 ERROR_INVALID_PARAMETER?

Posted

技术标签:

【中文标题】为啥 WTSFreeMemoryExA 在传递 WTSTypeSessionInfoLevel1 的 WTSTypeClass 时总是返回 ERROR_INVALID_PARAMETER?【英文标题】:Why does WTSFreeMemoryExA always return ERROR_INVALID_PARAMETER when passed a WTSTypeClass of WTSTypeSessionInfoLevel1?为什么 WTSFreeMemoryExA 在传递 WTSTypeSessionInfoLevel1 的 WTSTypeClass 时总是返回 ERROR_INVALID_PARAMETER? 【发布时间】:2021-05-07 00:31:59 【问题描述】:

根据the documentation,WTSFreeMemoryExA 可用于通过传递WTS_TYPE_CLASSWTSTypeSessionInfoLevel1 来释放WTS_SESSION_INFO_1A 结构。但是,任何尝试这样做都会失败,错误代码为 87(ERROR_INVALID_PARAMETER"The parameter is incorrect")。

如何让WTSFreeMemoryExA 工作?

【问题讨论】:

【参考方案1】:

这似乎是 Windows 中的一个错误(至少在 Windows 10 版本 2004 中)。与文档相反,WTSFreeMemoryExA 函数不接受 WTSTypeSessionInfoLevel1,而 WTSFreeMemoryExW 接受。这意味着不要使用返回WTS_SESSION_INFO_1A 结构的WTSEnumerateSessionsExA 函数,而需要使用返回WTS_SESSION_INFO_1WWTSEnumerateSessionsExW 函数。

这个错误实际上使WTSEnumerateSessionsExA 无法使用,除非您不关心由于无法释放其结果而导致的内存泄漏。这个错误appears 已经知道了一段时间。 (希望有一天,微软会解决这个问题。)

Some reports 声称即使使用WTSEnumerateSessionsExWWTSFreeMemoryExW 似乎也会泄漏内存,这意味着WTSEnumerateSessionsWTSQuerySessionInformation 组合可能是the better approach。但是,我自己一直无法重现该问题。我怀疑这曾经是一个真正的问题,但微软在最近的 Windows 版本中已修复。

【讨论】:

嗨,我现在可以重现此问题。我将与内部工程师确认,如果有任何更新,请在此处回复。感谢您的理解。 使用 WTS_SESSION_INFO_1A 可能是用户代码中的一个错误,因为,好吧,您不需要我解释为什么首选 Unicode API。所以修复这个缺陷并不是一个高优先级。 @DavidHeffernan 从历史上看,您所说的都是正确的,但随着 UTF-8 support in Win10 version 1903 的引入,W-over-A 首选项可能不再适用,因此此错误的优先级将比以前更高。使用 A apis 而不是 W 的 UTF-8 代码页应用程序不是错误。使用 UTF-8 代码页,现在 A api 也是 Unicode。 (W=UTF-16,A=UTF-8)。【参考方案2】:

感谢您提出这个问题。

我们查阅了相关源码,找到了与WTSFreeMemoryA相关的源码。它接受第一个参数WTSTypeClass 作为WTSTypeProcessInfoLevel0WTSTypeProcessInfoLevel1,但它不接受值WTSTypeSessionInfoLevel1,因此在此调用中返回ERROR_INVALID_PARAMETER 错误。

这与文档中的描述不同,我们会提交这个issue。您可以尝试使用WTSFreeMemoryW 来避免此问题。

【讨论】:

感谢您的回复。当您说WTSFreeMemoryA 时,您的意思是WTSFreeMemoryExA,对吗? (WTSFreeMemoryW 也是如此。)另外,我知道您是 Microsoft 员工?在您的回答中澄清这一点可能会很好。 (否则人们会想知道您是如何检查 Windows 源代码的。)

以上是关于为啥 WTSFreeMemoryExA 在传递 WTSTypeSessionInfoLevel1 的 WTSTypeClass 时总是返回 ERROR_INVALID_PARAMETER?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个代码在 w.show() 调用中会出现段错误?

为啥 torch.nn.MultiheadAttention 中的 W_q 矩阵是二次的

为啥 UART w/DMA 只接收发送数据的最后一个字节?

在 C# 中传递数组参数:为啥它是通过引用隐式传递的?

为啥没有在 Verilog 中正确传递参数?

为啥我要在 C 中按值传递函数参数?