diff --git a/reactos/ntoskrnl/ps/security.c b/reactos/ntoskrnl/ps/security.c index 4a9c0916d82..7532cbe0703 100644 --- a/reactos/ntoskrnl/ps/security.c +++ b/reactos/ntoskrnl/ps/security.c @@ -820,10 +820,10 @@ PsDereferencePrimaryToken(IN PACCESS_TOKEN PrimaryToken) BOOLEAN NTAPI PsDisableImpersonation(IN PETHREAD Thread, - IN PSE_IMPERSONATION_STATE ImpersonationState) + OUT PSE_IMPERSONATION_STATE ImpersonationState) { PPS_IMPERSONATION_INFORMATION Impersonation = NULL; - LONG NewValue, OldValue; + LONG OldFlags; PAGED_CODE(); PSTRACE(PS_SECURITY_DEBUG, "Thread: %p State: %p\n", Thread, ImpersonationState); @@ -835,19 +835,11 @@ PsDisableImpersonation(IN PETHREAD Thread, PspLockThreadSecurityExclusive(Thread); /* Disable impersonation */ - OldValue = Thread->CrossThreadFlags; - do - { - /* Attempt to change the flag */ - NewValue = - InterlockedCompareExchange((PLONG)&Thread->CrossThreadFlags, - OldValue &~ - CT_ACTIVE_IMPERSONATION_INFO_BIT, - OldValue); - } while (NewValue != OldValue); + OldFlags = PspClearCrossThreadFlag(Thread, + CT_ACTIVE_IMPERSONATION_INFO_BIT); /* Make sure nobody disabled it behind our back */ - if (NewValue & CT_ACTIVE_IMPERSONATION_INFO_BIT) + if (OldFlags & CT_ACTIVE_IMPERSONATION_INFO_BIT) { /* Copy the old state */ Impersonation = Thread->ImpersonationInfo; diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 8d6e350041f..7a14c967291 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1065,7 +1065,7 @@ NtQueryInformationToken(IN HANDLE TokenHandle, PTOKEN Token; ULONG RequiredLength; KPROCESSOR_MODE PreviousMode; - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status; PAGED_CODE(); @@ -2429,6 +2429,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, PACL Dacl = NULL; KPROCESSOR_MODE PreviousMode; NTSTATUS Status; + BOOLEAN RestoreImpersonation = FALSE; PAGED_CODE(); @@ -2482,7 +2483,8 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, if (OpenAsSelf) { - PsDisableImpersonation(PsGetCurrentThread(), &ImpersonationState); + RestoreImpersonation = PsDisableImpersonation(PsGetCurrentThread(), + &ImpersonationState); } if (CopyOnOpen) @@ -2533,7 +2535,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, if (Dacl) ExFreePoolWithTag(Dacl, TAG_TOKEN_ACL); - if (OpenAsSelf) + if (RestoreImpersonation) { PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState); }