From 396d9d97d2a57776e75380917763d4a6bad11003 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 30 Jan 2017 15:22:20 -0800 Subject: [PATCH] tst: passthrough: enable backup/restore privileges if able --- tst/passthrough/passthrough.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tst/passthrough/passthrough.c b/tst/passthrough/passthrough.c index 5a0d5385..a667fca0 100644 --- a/tst/passthrough/passthrough.c +++ b/tst/passthrough/passthrough.c @@ -726,6 +726,34 @@ static VOID PtfsDelete(PTFS *Ptfs) free(Ptfs); } +static NTSTATUS EnableBackupRestorePrivileges(VOID) +{ + union + { + TOKEN_PRIVILEGES P; + UINT B[sizeof(TOKEN_PRIVILEGES) + sizeof(LUID_AND_ATTRIBUTES)]; + } Privileges; + HANDLE Token; + + Privileges.P.PrivilegeCount = 2; + Privileges.P.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + Privileges.P.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED; + + if (!LookupPrivilegeValueW(0, SE_BACKUP_NAME, &Privileges.P.Privileges[0].Luid) || + !LookupPrivilegeValueW(0, SE_RESTORE_NAME, &Privileges.P.Privileges[1].Luid)) + return FspNtStatusFromWin32(GetLastError()); + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &Token)) + return FspNtStatusFromWin32(GetLastError()); + + if (!AdjustTokenPrivileges(Token, FALSE, &Privileges.P, 0, 0, 0)) + return FspNtStatusFromWin32(GetLastError()); + + CloseHandle(Token); + + return STATUS_SUCCESS; +} + static ULONG wcstol_deflt(wchar_t *w, ULONG deflt) { wchar_t *endp; @@ -803,6 +831,8 @@ static NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) if (0 == PassThrough || 0 == MountPoint) goto usage; + EnableBackupRestorePrivileges(); + if (0 != DebugLogFile) { if (0 == wcscmp(L"-", DebugLogFile))