From 90fa1d03430e1ed42b02427a3f1d27688f5b2d5d Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Mar 2010 03:35:18 +0000 Subject: [PATCH] [CSRSS]: Differentiate between first-try and second-try shutdown. In the first try, the console server should defer to the user/win32k server to attempt shutdown for a non-console app. However, if we end up with a second try because this did not happen, then the console server takes matters in its own hands and calls the CTRL-C handler (with some exceptions, such as system/service apps, or apps not belonging to the LUID). svn path=/trunk/; revision=46048 --- reactos/subsystems/win32/csrss/api/process.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/subsystems/win32/csrss/api/process.c b/reactos/subsystems/win32/csrss/api/process.c index 1be6bdc1b00..9bd3cd6ff26 100644 --- a/reactos/subsystems/win32/csrss/api/process.c +++ b/reactos/subsystems/win32/csrss/api/process.c @@ -696,7 +696,7 @@ CsrEnumProcesses(IN CSRSS_ENUM_PROCESS_PROC EnumProc, PLUID CallerLuid = RealContext[0]; PCSRSS_PROCESS_DATA CsrProcess = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; - BOOLEAN FirstTry = TRUE; + BOOLEAN FirstTry; ULONG Result = 0; ULONG Hash; @@ -729,6 +729,7 @@ CsrEnumProcesses(IN CSRSS_ENUM_PROCESS_PROC EnumProc, while (TRUE) { /* Find the next process to shutdown */ + FirstTry = TRUE; if (!(CsrProcess = FindProcessForShutdown(CallerLuid))) { /* Done, quit */ @@ -741,7 +742,7 @@ LoopAgain: /* Release the lock, make the callback, and acquire it back */ DPRINT1("Found process: %lx\n", CsrProcess->ProcessId); CsrReleaseProcessLock(); - Result = (ULONG)EnumProc(CsrProcess, Context); + Result = (ULONG)EnumProc(CsrProcess, (PVOID)((ULONG_PTR)Context | FirstTry)); CsrAcquireProcessLock(); /* Check the result */ @@ -754,7 +755,7 @@ LoopAgain: else if (Result == CsrShutdownNonCsrProcess) { /* A non-CSR process, the callback didn't touch it */ - continue; + //continue; } else if (Result == CsrShutdownCancelled) {