reactos/win32ss/user/winsrv/init.c

183 lines
6.5 KiB
C

/*
* 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 */