WTSFreeMemory在启动期间从服务调用时挂起-我应该省略吗

WTSFreeMemory hangs when called from service during startup - should I omit?

本文关键字:挂起 我应该省 调用 服务 启动 WTSFreeMemory      更新时间:2023-10-16

当系统在启动时启动我的服务时,它的状态在一段时间内保持为SERVICE_START_PENDING,然后终止(或者被终止,我不知道(。如果我在系统启动时手动启动服务,一切都会正常工作。

在寻找原因时,我发现在WTSFreeMemory中的某个地方发生了事情(仅供参考:我想检查用户当前是否通过WTSEnumeratureSessions登录(-函数永远不会返回。除此之外,只有在没有用户登录的情况下才会发生这种情况

现在我对WTSFreeMemory的用法感到困惑。目前我打算省略WTSFreeMemory(至少在没有用户交互登录的情况下(,但这会导致内存泄漏,不是吗?"备份"指针并稍后使用WTSFreeMemory也不是一个好的解决方案,因为"查找交互式用户"可能会发生多次(当用户登录或注销时,我会收到通知(。

您对WTSFreeMemory有什么建议吗?或者文档中没有(明确(说明有什么需要了解的吗?谢谢你。

// Look if the user is the interactive user
WTS_SESSION_INFOW *sessionData = nullptr;
DWORD numSessions;
DWORD sessionId = static_cast<DWORD>(UTILS_GENERIC_FAILURE);
if (!WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessionData, &numSessions))
{
return (UTILS_GENERIC_FAILURE);
}
for(quint32 loop = 0; loop < numSessions; loop++, sessionData++)
{
if (sessionData->State == WTSActive)
{
sessionId = sessionData->SessionId;
break;
}
}
// Calling WTSFreeMemory hangs for some reason if currently no user is logged on
if (sessionData)
{
WTSFreeMemory(sessionData);
}

这是我自己的一个错误:我修改了WTSEnumerateSessionsW返回的指针(请参阅代码中的sessionData++(,因此向WTSFreeMemory()传递了一个无效地址。

感谢RbMm的帮助。