diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 359b1e22063..a77bad499de 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -611,8 +611,9 @@ AdjustTokenPrivileges( HANDLE TokenHandle, BOOL DisableAllPrivileges, { NTSTATUS status; - TRACE("\n"); - + TRACE("(%p %d %p %d %p %p)\n", TokenHandle, DisableAllPrivileges, NewState, BufferLength, + PreviousState, ReturnLength); + status = NtAdjustPrivilegesToken(TokenHandle, DisableAllPrivileges, NewState, BufferLength, PreviousState, ReturnLength); diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index fe31b5cdcd6..4de588fdca1 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -4760,6 +4760,41 @@ static void test_default_dacl_owner_sid(void) CloseHandle( handle ); } +static void test_AdjustTokenPrivileges(void) +{ + TOKEN_PRIVILEGES tp, prev; + HANDLE token; + DWORD len; + LUID luid; + BOOL ret; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) + return; + + if (!LookupPrivilegeValueA(NULL, SE_BACKUP_NAME, &luid)) + { + CloseHandle(token); + return; + } + + tp.PrivilegeCount = 1; + tp.Privileges[0].Luid = luid; + tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + len = 0xdeadbeef; + ret = AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, &len); + ok(ret, "got %d\n", ret); + ok(len == 0xdeadbeef, "got length %d\n", len); + + /* revert */ + tp.PrivilegeCount = 1; + tp.Privileges[0].Luid = luid; + tp.Privileges[0].Attributes = 0; + AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &prev, NULL); + + CloseHandle(token); +} + START_TEST(security) { init(); @@ -4800,4 +4835,5 @@ START_TEST(security) test_CreateRestrictedToken(); test_TokenIntegrityLevel(); test_default_dacl_owner_sid(); + test_AdjustTokenPrivileges(); } diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index db8272fd593..ce648de843e 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -223,7 +223,7 @@ NTSTATUS WINAPI NtAdjustPrivilegesToken( ret = wine_server_call( req ); if (PreviousState) { - *ReturnLength = reply->len + FIELD_OFFSET( TOKEN_PRIVILEGES, Privileges ); + if (ReturnLength) *ReturnLength = reply->len + FIELD_OFFSET( TOKEN_PRIVILEGES, Privileges ); PreviousState->PrivilegeCount = reply->len / sizeof(LUID_AND_ATTRIBUTES); } }