--- /dev/null
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS User API Server DLL
+ * FILE: win32ss/user/winsrv/init.c
+ * PURPOSE: Initialization
+ * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru)
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "winsrv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+#define DEFAULT_AUTO_END_TASKS FALSE
+#define DEFAULT_HUNG_APP_TIMEOUT 5000
+#define DEFAULT_WAIT_TO_KILL_APP_TIMEOUT 20000
+#define DEFAULT_PROCESS_TERMINATE_TIMEOUT 90000
+
+SHUTDOWN_SETTINGS ShutdownSettings =
+{
+ DEFAULT_AUTO_END_TASKS,
+ DEFAULT_HUNG_APP_TIMEOUT,
+ DEFAULT_WAIT_TO_KILL_APP_TIMEOUT,
+ DEFAULT_WAIT_TO_KILL_APP_TIMEOUT,
+ DEFAULT_PROCESS_TERMINATE_TIMEOUT
+};
+
+/* FUNCTIONS ******************************************************************/
+
+static ULONG
+GetRegIntFromID(IN HANDLE KeyHandle,
+ IN PWCHAR ValueName,
+ IN ULONG DefaultValue)
+{
+ UNICODE_STRING ValueString;
+ ULONG Length;
+ UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 32 * sizeof(WCHAR)];
+ PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)Buffer;
+ NTSTATUS Status;
+ ULONG Value;
+
+ /* Open the key */
+ RtlInitUnicodeString(&ValueString, ValueName);
+ Status = NtQueryValueKey(KeyHandle,
+ &ValueString,
+ KeyValuePartialInformation,
+ PartialInfo,
+ sizeof(Buffer),
+ &Length);
+ if (NT_SUCCESS(Status))
+ {
+ if (PartialInfo->Type == REG_SZ)
+ {
+ /* Convert to integer */
+ RtlInitUnicodeString(&ValueString, (PWCHAR)PartialInfo->Data);
+ Status = RtlUnicodeStringToInteger(&ValueString, 10, &Value);
+ }
+ else if (PartialInfo->Type == REG_DWORD)
+ {
+ /* Directly retrieve the data */
+ Value = *(PULONG)PartialInfo->Data;
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ DPRINT1("Unexpected registry type %d for setting %S\n", PartialInfo->Type, ValueName);
+ Status = STATUS_UNSUCCESSFUL;
+ }
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* Use default value instead */
+ Value = DefaultValue;
+ }
+
+ /* Return the value */
+ return Value;
+}
+
+VOID FASTCALL
+GetTimeouts(IN PSHUTDOWN_SETTINGS ShutdownSettings)
+{
+ NTSTATUS Status;
+ UNICODE_STRING RegistryString;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ HANDLE CurrentUserKeyHandle;
+ HANDLE KeyHandle;
+
+ /* Initialize with defaults first */
+ ShutdownSettings->AutoEndTasks = DEFAULT_AUTO_END_TASKS;
+ ShutdownSettings->HungAppTimeout = DEFAULT_HUNG_APP_TIMEOUT;
+ ShutdownSettings->WaitToKillAppTimeout = DEFAULT_WAIT_TO_KILL_APP_TIMEOUT;
+ ShutdownSettings->WaitToKillServiceTimeout = ShutdownSettings->WaitToKillAppTimeout;
+ ShutdownSettings->ProcessTerminateTimeout = DEFAULT_PROCESS_TERMINATE_TIMEOUT;
+
+ /* Open the per-user desktop key */
+ Status = RtlOpenCurrentUser(MAXIMUM_ALLOWED, &CurrentUserKeyHandle);
+ if (NT_SUCCESS(Status))
+ {
+ RtlInitUnicodeString(&RegistryString,
+ L"Control Panel\\Desktop");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &RegistryString,
+ OBJ_CASE_INSENSITIVE,
+ CurrentUserKeyHandle,
+ NULL);
+ Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
+ if (NT_SUCCESS(Status))
+ {
+ /* Read timeouts */
+ ShutdownSettings->HungAppTimeout = GetRegIntFromID(KeyHandle,
+ L"HungAppTimeout",
+ DEFAULT_HUNG_APP_TIMEOUT);
+ ShutdownSettings->WaitToKillAppTimeout = GetRegIntFromID(KeyHandle,
+ L"WaitToKillAppTimeout",
+ DEFAULT_WAIT_TO_KILL_APP_TIMEOUT);
+ ShutdownSettings->AutoEndTasks = GetRegIntFromID(KeyHandle,
+ L"AutoEndTasks",
+ DEFAULT_AUTO_END_TASKS);
+ /* Done */
+ NtClose(KeyHandle);
+ }
+
+ /* Done */
+ NtClose(CurrentUserKeyHandle);
+ }
+
+ /* Now open the control key */
+ RtlInitUnicodeString(&RegistryString,
+ L"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &RegistryString,
+ OBJ_CASE_INSENSITIVE,
+ NULL, NULL);
+ Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
+ if (NT_SUCCESS(Status))
+ {
+ /* Read the services timeout */
+ ShutdownSettings->WaitToKillServiceTimeout = GetRegIntFromID(KeyHandle,
+ L"WaitToKillServiceTimeout",
+ ShutdownSettings->WaitToKillAppTimeout);
+
+ /*
+ * Retrieve the process terminate timeout.
+ * See ftp://ftp.microsoft.com/MISC1/BUSSYS/WINNT/KB/Q234/6/06.TXT
+ * and https://web.archive.org/web/20050216235758/http://support.microsoft.com/kb/234606/EN-US/
+ * for more details.
+ *
+ * NOTE: Unused at the moment...
+ */
+ ShutdownSettings->ProcessTerminateTimeout = GetRegIntFromID(KeyHandle,
+ L"ProcessTerminateTimeout",
+ DEFAULT_PROCESS_TERMINATE_TIMEOUT);
+ if (ShutdownSettings->ProcessTerminateTimeout < DEFAULT_HUNG_APP_TIMEOUT)
+ ShutdownSettings->ProcessTerminateTimeout = DEFAULT_HUNG_APP_TIMEOUT;
+
+ /* Done */
+ NtClose(KeyHandle);
+ }
+}
+
+/* ENTRY-POINT ****************************************************************/
+
+BOOL
+WINAPI
+DllMain(IN HINSTANCE hInstanceDll,
+ IN DWORD dwReason,
+ IN LPVOID lpReserved)
+{
+ UNREFERENCED_PARAMETER(hInstanceDll);
+ UNREFERENCED_PARAMETER(dwReason);
+ UNREFERENCED_PARAMETER(lpReserved);
+
+ return TRUE;
+}
+
+/* EOF */