Reputation: 5258
According to the documentation, WTSFreeMemoryExA
can be used to free a WTS_SESSION_INFO_1A
structure by passing a WTS_TYPE_CLASS
of WTSTypeSessionInfoLevel1
. However, any attempt to do so fails with error code 87 (ERROR_INVALID_PARAMETER
, "The parameter is incorrect"
).
How to get WTSFreeMemoryExA
to work?
Upvotes: 1
Views: 240
Reputation: 3890
thank you for raising this question.
We checked the relevant source code and found the source code related to WTSFreeMemoryA
. It accepts the first parameter WTSTypeClass
as WTSTypeProcessInfoLevel0
or WTSTypeProcessInfoLevel1
, but it doesn’t accept the value WTSTypeSessionInfoLevel1
and therefore return the ERROR_INVALID_PARAMETER
error on this call.
This is different from the description in the document, we will submit this issue. And you can try to use WTSFreeMemoryW
to avoid this issue.
Upvotes: 2
Reputation: 5258
This appears to be a bug in Windows (at least in Windows 10 version 2004). Contrary to the documentation, the WTSFreeMemoryExA
function does not accept WTSTypeSessionInfoLevel1
, whereas WTSFreeMemoryExW
does. This means that instead of using the WTSEnumerateSessionsExA
function which returns WTS_SESSION_INFO_1A
structures, you need to instead use the WTSEnumerateSessionsExW
function which returns WTS_SESSION_INFO_1W
.
This bug effectively makes WTSEnumerateSessionsExA
unusable, unless you don't care about the memory leak caused by the inability to free its results. This bug appears to have been known about for some time. (Hopefully, some day, Microsoft will fix this.)
Some reports claim that even using WTSEnumerateSessionsExW
and WTSFreeMemoryExW
appears to leak memory, which implies that WTSEnumerateSessions
combined with WTSQuerySessionInformation
may be the better approach. However, I myself have been unable to reproduce that issue. I suspect it was a real issue at one point, but has been fixed by Microsoft in more recent Windows versions.
Upvotes: 2