+static ULONG NrCtrlHandlers = 0;
+
+/* Default Console Control Handler *******************************************/
+
+BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event)
+{
+ switch(Event)
+ {
+ case CTRL_C_EVENT:
+ DPRINT("Ctrl-C Event\n");
+ ExitProcess(0);
+ break;
+
+ case CTRL_BREAK_EVENT:
+ DPRINT("Ctrl-Break Event\n");
+ ExitProcess(0);
+ break;
+
+ case CTRL_SHUTDOWN_EVENT:
+ DPRINT("Ctrl Shutdown Event\n");
+ break;
+
+ case CTRL_CLOSE_EVENT:
+ DPRINT("Ctrl Close Event\n");
+ break;
+
+ case CTRL_LOGOFF_EVENT:
+ DPRINT("Ctrl Logoff Event\n");
+ break;
+ }
+// ExitProcess((UINT)&ExitCode);
+ return TRUE;
+}
+
+
+__declspec(noreturn) VOID CALLBACK ConsoleControlDispatcher(DWORD CodeAndFlag)
+{
+DWORD nExitCode = 0;
+DWORD nCode = CodeAndFlag & MAXLONG;
+UINT i;
+
+SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
+
+ switch(nCode)
+ {
+ case CTRL_C_EVENT:
+ case CTRL_BREAK_EVENT:
+ {
+ if(IsDebuggerPresent())
+ {
+ EXCEPTION_RECORD erException;
+ erException.ExceptionCode =
+ (nCode == CTRL_C_EVENT ? DBG_CONTROL_C : DBG_CONTROL_BREAK);
+ erException.ExceptionFlags = 0;
+ erException.ExceptionRecord = NULL;
+ erException.ExceptionAddress = &DefaultConsoleCtrlHandler;
+ erException.NumberParameters = 0;
+ RtlRaiseException(&erException);
+ }
+ RtlEnterCriticalSection(&ConsoleLock);
+
+ if(!(nCode == CTRL_C_EVENT &&
+ NtCurrentPeb()->ProcessParameters->ProcessGroup & 1))
+ {
+ for(i = NrCtrlHandlers; i > 0; -- i)
+ if(CtrlHandlers[i - 1](nCode)) break;
+ }
+ RtlLeaveCriticalSection(&ConsoleLock);
+ ExitThread(0);
+ }
+ case CTRL_CLOSE_EVENT:
+ case CTRL_LOGOFF_EVENT:
+ case CTRL_SHUTDOWN_EVENT:
+ break;
+
+ default: ExitThread(0);
+ }
+
+ RtlEnterCriticalSection(&ConsoleLock);
+
+ if(!(nCode == CTRL_C_EVENT &&
+ NtCurrentPeb()->ProcessParameters->ProcessGroup & 1))
+ {
+ i = NrCtrlHandlers;
+ while(i > 0)
+ {
+ if (i == 1 && (CodeAndFlag & MINLONG) &&
+ (nCode == CTRL_LOGOFF_EVENT || nCode == CTRL_SHUTDOWN_EVENT))
+ break;
+
+ if(CtrlHandlers[i - 1](nCode))
+ {
+ switch(nCode)
+ {
+ case CTRL_CLOSE_EVENT:
+ case CTRL_LOGOFF_EVENT:
+ case CTRL_SHUTDOWN_EVENT:
+ nExitCode = CodeAndFlag;
+ }
+ break;
+ }
+ --i;
+ }
+ }
+ RtlLeaveCriticalSection(&ConsoleLock);
+ ExitThread(nExitCode);
+}
+