2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User API Server DLL
4 * FILE: win32ss/user/winsrv/init.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru)
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
17 /* GLOBALS ********************************************************************/
19 #define DEFAULT_AUTO_END_TASKS FALSE
20 #define DEFAULT_HUNG_APP_TIMEOUT 5000
21 #define DEFAULT_WAIT_TO_KILL_APP_TIMEOUT 20000
22 #define DEFAULT_PROCESS_TERMINATE_TIMEOUT 90000
24 SHUTDOWN_SETTINGS ShutdownSettings
=
26 DEFAULT_AUTO_END_TASKS
,
27 DEFAULT_HUNG_APP_TIMEOUT
,
28 DEFAULT_WAIT_TO_KILL_APP_TIMEOUT
,
29 DEFAULT_WAIT_TO_KILL_APP_TIMEOUT
,
30 DEFAULT_PROCESS_TERMINATE_TIMEOUT
33 /* FUNCTIONS ******************************************************************/
36 GetRegIntFromID(IN HANDLE KeyHandle
,
38 IN ULONG DefaultValue
)
40 UNICODE_STRING ValueString
;
42 UCHAR Buffer
[sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 32 * sizeof(WCHAR
)];
43 PKEY_VALUE_PARTIAL_INFORMATION PartialInfo
= (PVOID
)Buffer
;
48 RtlInitUnicodeString(&ValueString
, ValueName
);
49 Status
= NtQueryValueKey(KeyHandle
,
51 KeyValuePartialInformation
,
55 if (NT_SUCCESS(Status
))
57 if (PartialInfo
->Type
== REG_SZ
)
59 /* Convert to integer */
60 RtlInitUnicodeString(&ValueString
, (PWCHAR
)PartialInfo
->Data
);
61 Status
= RtlUnicodeStringToInteger(&ValueString
, 10, &Value
);
63 else if (PartialInfo
->Type
== REG_DWORD
)
65 /* Directly retrieve the data */
66 Value
= *(PULONG
)PartialInfo
->Data
;
67 Status
= STATUS_SUCCESS
;
71 DPRINT1("Unexpected registry type %d for setting %S\n", PartialInfo
->Type
, ValueName
);
72 Status
= STATUS_UNSUCCESSFUL
;
76 if (!NT_SUCCESS(Status
))
78 /* Use default value instead */
82 /* Return the value */
87 GetTimeouts(IN PSHUTDOWN_SETTINGS ShutdownSettings
)
90 UNICODE_STRING RegistryString
;
91 OBJECT_ATTRIBUTES ObjectAttributes
;
92 HANDLE CurrentUserKeyHandle
;
95 /* Initialize with defaults first */
96 ShutdownSettings
->AutoEndTasks
= DEFAULT_AUTO_END_TASKS
;
97 ShutdownSettings
->HungAppTimeout
= DEFAULT_HUNG_APP_TIMEOUT
;
98 ShutdownSettings
->WaitToKillAppTimeout
= DEFAULT_WAIT_TO_KILL_APP_TIMEOUT
;
99 ShutdownSettings
->WaitToKillServiceTimeout
= ShutdownSettings
->WaitToKillAppTimeout
;
100 ShutdownSettings
->ProcessTerminateTimeout
= DEFAULT_PROCESS_TERMINATE_TIMEOUT
;
102 /* Open the per-user desktop key */
103 Status
= RtlOpenCurrentUser(MAXIMUM_ALLOWED
, &CurrentUserKeyHandle
);
104 if (NT_SUCCESS(Status
))
106 RtlInitUnicodeString(&RegistryString
,
107 L
"Control Panel\\Desktop");
108 InitializeObjectAttributes(&ObjectAttributes
,
110 OBJ_CASE_INSENSITIVE
,
111 CurrentUserKeyHandle
,
113 Status
= NtOpenKey(&KeyHandle
, KEY_READ
, &ObjectAttributes
);
114 if (NT_SUCCESS(Status
))
117 ShutdownSettings
->HungAppTimeout
= GetRegIntFromID(KeyHandle
,
119 DEFAULT_HUNG_APP_TIMEOUT
);
120 ShutdownSettings
->WaitToKillAppTimeout
= GetRegIntFromID(KeyHandle
,
121 L
"WaitToKillAppTimeout",
122 DEFAULT_WAIT_TO_KILL_APP_TIMEOUT
);
123 ShutdownSettings
->AutoEndTasks
= GetRegIntFromID(KeyHandle
,
125 DEFAULT_AUTO_END_TASKS
);
131 NtClose(CurrentUserKeyHandle
);
134 /* Now open the control key */
135 RtlInitUnicodeString(&RegistryString
,
136 L
"\\Registry\\Machine\\System\\CurrentControlSet\\Control");
137 InitializeObjectAttributes(&ObjectAttributes
,
139 OBJ_CASE_INSENSITIVE
,
141 Status
= NtOpenKey(&KeyHandle
, KEY_READ
, &ObjectAttributes
);
142 if (NT_SUCCESS(Status
))
144 /* Read the services timeout */
145 ShutdownSettings
->WaitToKillServiceTimeout
= GetRegIntFromID(KeyHandle
,
146 L
"WaitToKillServiceTimeout",
147 ShutdownSettings
->WaitToKillAppTimeout
);
150 * Retrieve the process terminate timeout.
151 * See ftp://ftp.microsoft.com/MISC1/BUSSYS/WINNT/KB/Q234/6/06.TXT
152 * and https://web.archive.org/web/20050216235758/http://support.microsoft.com/kb/234606/EN-US/
155 * NOTE: Unused at the moment...
157 ShutdownSettings
->ProcessTerminateTimeout
= GetRegIntFromID(KeyHandle
,
158 L
"ProcessTerminateTimeout",
159 DEFAULT_PROCESS_TERMINATE_TIMEOUT
);
160 if (ShutdownSettings
->ProcessTerminateTimeout
< DEFAULT_HUNG_APP_TIMEOUT
)
161 ShutdownSettings
->ProcessTerminateTimeout
= DEFAULT_HUNG_APP_TIMEOUT
;
168 /* ENTRY-POINT ****************************************************************/
172 DllMain(IN HINSTANCE hInstanceDll
,
174 IN LPVOID lpReserved
)
176 UNREFERENCED_PARAMETER(hInstanceDll
);
177 UNREFERENCED_PARAMETER(dwReason
);
178 UNREFERENCED_PARAMETER(lpReserved
);