为啥 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_CLASS
的WTSTypeSessionInfoLevel1
来释放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_1W
的WTSEnumerateSessionsExW
函数。
这个错误实际上使WTSEnumerateSessionsExA
无法使用,除非您不关心由于无法释放其结果而导致的内存泄漏。这个错误appears 已经知道了一段时间。 (希望有一天,微软会解决这个问题。)
Some reports 声称即使使用WTSEnumerateSessionsExW
和WTSFreeMemoryExW
似乎也会泄漏内存,这意味着WTSEnumerateSessions
与WTSQuerySessionInformation
组合可能是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
作为WTSTypeProcessInfoLevel0
或WTSTypeProcessInfoLevel1
,但它不接受值WTSTypeSessionInfoLevel1
,因此在此调用中返回ERROR_INVALID_PARAMETER
错误。
这与文档中的描述不同,我们会提交这个issue。您可以尝试使用WTSFreeMemoryW
来避免此问题。
【讨论】:
感谢您的回复。当您说WTSFreeMemoryA
时,您的意思是WTSFreeMemoryExA
,对吗? (WTSFreeMemoryW
也是如此。)另外,我知道您是 Microsoft 员工?在您的回答中澄清这一点可能会很好。 (否则人们会想知道您是如何检查 Windows 源代码的。)以上是关于为啥 WTSFreeMemoryExA 在传递 WTSTypeSessionInfoLevel1 的 WTSTypeClass 时总是返回 ERROR_INVALID_PARAMETER?的主要内容,如果未能解决你的问题,请参考以下文章