"Ge van Geldorp" <ge(a)thinstall.com> writes:
+static PSID _GetUserFromToken(HANDLE Token) +{ + char InfoBuffer[64]; + PTOKEN_USER UserInfo; + DWORD InfoSize; + PSID Sid; + DWORD SidSize; + + UserInfo = (PTOKEN_USER) InfoBuffer; + if (! GetTokenInformation(Token, TokenUser, InfoBuffer, sizeof(InfoBuffer), + &InfoSize)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + return NULL; + UserInfo = HeapAlloc(GetProcessHeap(), 0, InfoSize); + if (UserInfo == NULL) + return NULL; + if (! GetTokenInformation(Token, TokenUser, UserInfo, InfoSize, + &InfoSize)) + { + HeapFree(GetProcessHeap(), 0, UserInfo); + return NULL; + } + } + + SidSize = GetLengthSid(UserInfo->User.Sid); + Sid = HeapAlloc(GetProcessHeap(), 0, SidSize); + if (Sid == NULL) + { + if (UserInfo != (PTOKEN_USER) InfoBuffer) + HeapFree(GetProcessHeap(), 0, UserInfo); + return NULL; + } + + if (! CopySid(SidSize, Sid, UserInfo->User.Sid)) + { + HeapFree(GetProcessHeap(), 0, Sid); + Sid = NULL; + }
You should return a string directly, there's no reason to make a copy of the SID. -- Alexandre Julliard julliard(a)winehq.org