From 6b2dcaef962abb2f5603aa46a53fd545615e1b76 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 19 Jul 2017 16:05:49 -0700 Subject: [PATCH] fsptool: getuid, getgid --- src/fsptool/fsptool.c | 146 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 134 insertions(+), 12 deletions(-) diff --git a/src/fsptool/fsptool.c b/src/fsptool/fsptool.c index d30863d9..0b088669 100644 --- a/src/fsptool/fsptool.c +++ b/src/fsptool/fsptool.c @@ -58,7 +58,6 @@ static void usage(void) " lsvol list file system devices (volumes)\n" //" list list running file system processes\n" //" kill kill file system process\n" - " getsid get current SID\n" " getuid get current POSIX UID\n" " getgid get current POSIX GID\n" " uidtosid get SID from POSIX UID\n" @@ -129,6 +128,102 @@ static WCHAR FspToolGetDriveLetter(PDWORD PLogicalDrives, PWSTR VolumeName) return 0; } +NTSTATUS FspToolGetUid(HANDLE Token, PUINT32 PUid) +{ + UINT32 Uid; + union + { + TOKEN_USER V; + UINT8 B[128]; + } UserInfoBuf; + PTOKEN_USER UserInfo = &UserInfoBuf.V; + DWORD Size; + NTSTATUS Result; + + if (!GetTokenInformation(Token, TokenUser, UserInfo, sizeof UserInfoBuf, &Size)) + { + if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + UserInfo = MemAlloc(Size); + if (0 == UserInfo) + { + Result = STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + + if (!GetTokenInformation(Token, TokenUser, UserInfo, Size, &Size)) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + } + + Result = FspPosixMapSidToUid(UserInfo->User.Sid, &Uid); + if (!NT_SUCCESS(Result)) + goto exit; + + *PUid = Uid; + Result = STATUS_SUCCESS; + +exit: + if (UserInfo != &UserInfoBuf.V) + MemFree(UserInfo); + + return Result; +} + +NTSTATUS FspToolGetGid(HANDLE Token, PUINT32 PGid) +{ + UINT32 Gid; + union + { + TOKEN_PRIMARY_GROUP V; + UINT8 B[128]; + } GroupInfoBuf; + PTOKEN_PRIMARY_GROUP GroupInfo = &GroupInfoBuf.V; + DWORD Size; + NTSTATUS Result; + + if (!GetTokenInformation(Token, TokenPrimaryGroup, GroupInfo, sizeof GroupInfoBuf, &Size)) + { + if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + GroupInfo = MemAlloc(Size); + if (0 == GroupInfo) + { + Result = STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + + if (!GetTokenInformation(Token, TokenPrimaryGroup, GroupInfo, Size, &Size)) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + } + + Result = FspPosixMapSidToUid(GroupInfo->PrimaryGroup, &Gid); + if (!NT_SUCCESS(Result)) + goto exit; + + *PGid = Gid; + Result = STATUS_SUCCESS; + +exit: + if (GroupInfo != &GroupInfoBuf.V) + MemFree(GroupInfo); + + return Result; +} + static NTSTATUS lsvol_dev(PWSTR DeviceName) { NTSTATUS Result; @@ -147,7 +242,6 @@ static NTSTATUS lsvol_dev(PWSTR DeviceName) if (L'\0' == *P) { Drive[0] = FspToolGetDriveLetter(&LogicalDrives, VolumeName); - info("%-4S%S", Drive[0] ? Drive : L"", VolumeName); VolumeName = P + 1; } @@ -175,19 +269,50 @@ static int lsvol(int argc, wchar_t **argv) return 0; } -static int getsid(int argc, wchar_t **argv) -{ - return 1; -} - static int getuid(int argc, wchar_t **argv) { - return 1; + if (1 != argc) + usage(); + + HANDLE Token; + UINT32 Uid; + NTSTATUS Result; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token)) + return GetLastError(); + + Result = FspToolGetUid(Token, &Uid); + if (!NT_SUCCESS(Result)) + return FspWin32FromNtStatus(Result); + + CloseHandle(Token); + + info("%u", Uid); + + return 0; } static int getgid(int argc, wchar_t **argv) { - return 1; + if (1 != argc) + usage(); + + HANDLE Token; + UINT32 Gid; + NTSTATUS Result; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token)) + return GetLastError(); + + Result = FspToolGetGid(Token, &Gid); + if (!NT_SUCCESS(Result)) + return FspWin32FromNtStatus(Result); + + CloseHandle(Token); + + info("%u", Gid); + + return 0; } static int uidtosid(int argc, wchar_t **argv) @@ -221,9 +346,6 @@ int wmain(int argc, wchar_t **argv) if (0 == invariant_wcscmp(L"lsvol", argv[0])) return lsvol(argc, argv); else - if (0 == invariant_wcscmp(L"getsid", argv[0])) - return getsid(argc, argv); - else if (0 == invariant_wcscmp(L"getuid", argv[0])) return getuid(argc, argv); else