diff options
Diffstat (limited to 'private/windows/gina/userenv/sid.c')
-rw-r--r-- | private/windows/gina/userenv/sid.c | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/private/windows/gina/userenv/sid.c b/private/windows/gina/userenv/sid.c new file mode 100644 index 000000000..fef9ecdcb --- /dev/null +++ b/private/windows/gina/userenv/sid.c @@ -0,0 +1,249 @@ +//************************************************************* +// +// SID management functions. +// +// THESE FUNCTIONS ARE WINDOWS NT SPECIFIC!!!!! +// +// Microsoft Confidential +// Copyright (c) Microsoft Corporation 1995 +// All rights reserved +// +//************************************************************* + +#include "uenv.h" + +/***************************************************************************\ +* GetSidString +* +* Allocates and returns a string representing the sid of the current user +* The returned pointer should be freed using DeleteSidString(). +* +* Returns a pointer to the string or NULL on failure. +* +* History: +* 26-Aug-92 Davidc Created +* +\***************************************************************************/ +LPTSTR GetSidString(HANDLE UserToken) +{ + NTSTATUS NtStatus; + PSID UserSid; + UNICODE_STRING UnicodeString; + LPTSTR lpEnd; +#ifndef UNICODE + STRING String; +#endif + + // + // Get the user sid + // + + UserSid = GetUserSid(UserToken); + if (UserSid == NULL) { + DebugMsg((DM_WARNING, TEXT("GetSidString: GetUserSid returned NULL"))); + return NULL; + } + + // + // Convert user SID to a string. + // + + NtStatus = RtlConvertSidToUnicodeString( + &UnicodeString, + UserSid, + (BOOLEAN)TRUE // Allocate + ); + // + // We're finished with the user sid + // + + DeleteUserSid(UserSid); + + // + // See if the conversion to a string worked + // + + if (!NT_SUCCESS(NtStatus)) { + DebugMsg((DM_WARNING, TEXT("GetSidString: RtlConvertSidToUnicodeString failed, status = 0x%x"), + NtStatus)); + return NULL; + } + +#ifdef UNICODE + + + return(UnicodeString.Buffer); + +#else + + // + // Convert the string to ansi + // + + NtStatus = RtlUnicodeStringToAnsiString(&String, &UnicodeString, TRUE); + RtlFreeUnicodeString(&UnicodeString); + if (!NT_SUCCESS(NtStatus)) { + DebugMsg((DM_WARNING, TEXT("GetSidString: RtlUnicodeStringToAnsiString failed, status = 0x%x"), + status)); + return NULL; + } + + + return(String.Buffer); + +#endif + +} + + +/***************************************************************************\ +* DeleteSidString +* +* Frees up a sid string previously returned by GetSidString() +* +* Returns nothing. +* +* History: +* 26-Aug-92 Davidc Created +* +\***************************************************************************/ +VOID DeleteSidString(LPTSTR SidString) +{ + +#ifdef UNICODE + UNICODE_STRING String; + + RtlInitUnicodeString(&String, SidString); + + RtlFreeUnicodeString(&String); +#else + ANSI_STRING String; + + RtlInitAnsiString(&String, SidString); + + RtlFreeAnsiString(&String); +#endif + +} + + + +/***************************************************************************\ +* GetUserSid +* +* Allocs space for the user sid, fills it in and returns a pointer. Caller +* The sid should be freed by calling DeleteUserSid. +* +* Note the sid returned is the user's real sid, not the per-logon sid. +* +* Returns pointer to sid or NULL on failure. +* +* History: +* 26-Aug-92 Davidc Created. +\***************************************************************************/ +PSID GetUserSid (HANDLE UserToken) +{ + PTOKEN_USER pUser; + PSID pSid; + DWORD BytesRequired = 200; + NTSTATUS status; + + + // + // Allocate space for the user info + // + + pUser = (PTOKEN_USER)LocalAlloc(LMEM_FIXED, BytesRequired); + + + if (pUser == NULL) { + DebugMsg((DM_WARNING, TEXT("GetUserSid: Failed to allocate %d bytes"), + BytesRequired)); + return NULL; + } + + + // + // Read in the UserInfo + // + + status = NtQueryInformationToken( + UserToken, // Handle + TokenUser, // TokenInformationClass + pUser, // TokenInformation + BytesRequired, // TokenInformationLength + &BytesRequired // ReturnLength + ); + + if (status == STATUS_BUFFER_TOO_SMALL) { + + // + // Allocate a bigger buffer and try again. + // + + pUser = LocalReAlloc(pUser, BytesRequired, LMEM_MOVEABLE); + if (pUser == NULL) { + DebugMsg((DM_WARNING, TEXT("GetUserSid: Failed to allocate %d bytes"), + BytesRequired)); + return NULL; + } + + status = NtQueryInformationToken( + UserToken, // Handle + TokenUser, // TokenInformationClass + pUser, // TokenInformation + BytesRequired, // TokenInformationLength + &BytesRequired // ReturnLength + ); + + } + + if (!NT_SUCCESS(status)) { + DebugMsg((DM_WARNING, TEXT("GetUserSid: Failed to query user info from user token, status = 0x%x"), + status)); + LocalFree(pUser); + return NULL; + } + + + BytesRequired = RtlLengthSid(pUser->User.Sid); + pSid = LocalAlloc(LMEM_FIXED, BytesRequired); + if (pSid == NULL) { + DebugMsg((DM_WARNING, TEXT("GetUserSid: Failed to allocate %d bytes"), + BytesRequired)); + LocalFree(pUser); + return NULL; + } + + + status = RtlCopySid(BytesRequired, pSid, pUser->User.Sid); + + LocalFree(pUser); + + if (!NT_SUCCESS(status)) { + DebugMsg((DM_WARNING, TEXT("GetUserSid: RtlCopySid Failed. status = %d"), + status)); + LocalFree(pSid); + pSid = NULL; + } + + + return pSid; +} + + +/***************************************************************************\ +* DeleteUserSid +* +* Deletes a user sid previously returned by GetUserSid() +* +* Returns nothing. +* +* History: +* 26-Aug-92 Davidc Created +* +\***************************************************************************/ +VOID DeleteUserSid(PSID Sid) +{ + LocalFree(Sid); +} |