From: Sir Richard Date: Sat, 29 May 2010 19:21:08 +0000 (+0000) Subject: [NTOS]: Fix Implementation of BreakOnTermination -- Process Flags should be accessed... X-Git-Tag: backups/header-work@57446~11^2~191 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=27957c22127afa7d72127b768cf63384f18a0e78;hp=c5cc4a4bd77cb3c8b2cf1d7a9e54c68a839de18d [NTOS]: Fix Implementation of BreakOnTermination -- Process Flags should be accessed with interlocked bit semantics, not through C bitfield extension. [NTOS]: Revert 47425 and apply a better fix. svn path=/trunk/; revision=47426 --- diff --git a/reactos/ntoskrnl/ps/query.c b/reactos/ntoskrnl/ps/query.c index d27ff3e4dfe..342c818945e 100644 --- a/reactos/ntoskrnl/ps/query.c +++ b/reactos/ntoskrnl/ps/query.c @@ -753,8 +753,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, PreviousMode, (PVOID*)&Process, NULL); - if (!NT_SUCCESS(Status)) - break; + if (!NT_SUCCESS(Status)) break; /* Enter SEH for writing back data */ _SEH2_TRY @@ -869,6 +868,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, PROCESS_SESSION_INFORMATION SessionInfo = {0}; PROCESS_PRIORITY_CLASS PriorityClass = {0}; PVOID ExceptionPort; + ULONG Break; PAGED_CODE(); /* Verify Information Class validity */ @@ -927,11 +927,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Get the LPC Port */ Status = ObReferenceObjectByHandle(PortHandle, 0, @@ -973,11 +972,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Assign the actual token */ Status = PspSetPrimaryToken(Process, TokenHandle, NULL); break; @@ -1027,11 +1025,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Setting the session id requires the SeTcbPrivilege */ if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode)) { @@ -1096,11 +1093,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, { /* Return the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Check for invalid PriorityClass value */ if (PriorityClass.PriorityClass > PROCESS_PRIORITY_CLASS_ABOVE_NORMAL) { @@ -1201,24 +1197,37 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, break; } - /* Setting 'break on termination' requires the SeDebugPrivilege */ - if (!SeSinglePrivilegeCheck(SeDebugPrivilege, PreviousMode)) - { - Status = STATUS_PRIVILEGE_NOT_HELD; - break; - } - /* Enter SEH for direct buffer read */ _SEH2_TRY { - Process->BreakOnTermination = *(PULONG)ProcessInformation; + Break = *(PULONG)ProcessInformation; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { /* Get exception code */ + Break = 0; Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; + + /* Setting 'break on termination' requires the SeDebugPrivilege */ + if (!SeSinglePrivilegeCheck(SeDebugPrivilege, PreviousMode)) + { + Status = STATUS_PRIVILEGE_NOT_HELD; + break; + } + + /* Set or clear the flag */ + if (Break) + { + PspSetProcessFlag(Process, PSF_BREAK_ON_TERMINATION_BIT); + } + else + { + PspClearProcessFlag(Process, PSF_BREAK_ON_TERMINATION_BIT); + } + break; /* We currently don't implement any of these */ @@ -1328,11 +1337,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Validate it */ if ((Priority > HIGH_PRIORITY) || (Priority <= LOW_PRIORITY)) @@ -1365,11 +1373,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Validate it */ if ((Priority > THREAD_BASE_PRIORITY_MAX) || (Priority < THREAD_BASE_PRIORITY_MIN)) @@ -1479,11 +1486,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Assign the actual token */ Status = PsAssignImpersonationToken(Thread, TokenHandle); break; @@ -1507,11 +1513,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Set the address */ Thread->Win32StartAddress = Address; break; @@ -1535,11 +1540,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Validate it */ if (IdealProcessor > MAXIMUM_PROCESSORS) { @@ -1584,11 +1588,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* Call the kernel */ KeSetDisableBoostThread(&Thread->Tcb, (BOOLEAN)DisableBoost); break; @@ -1612,11 +1615,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle, { /* Get the exception code */ Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; - if (!NT_SUCCESS(Status)) break; - /* This is only valid for the current thread */ if (Thread != PsGetCurrentThread()) {