2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/advapi32/misc/shutdown.c
5 * PURPOSE: System shutdown functions
6 * PROGRAMMER: Lee Schroeder <spaceseel at gmail dot com>
11 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
13 /**********************************************************************
14 * AbortSystemShutdownW
19 AbortSystemShutdownW(LPCWSTR lpMachineName
)
21 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
26 /**********************************************************************
27 * AbortSystemShutdownA
29 * see AbortSystemShutdownW
32 AbortSystemShutdownA(LPCSTR lpMachineName
)
34 ANSI_STRING MachineNameA
;
35 UNICODE_STRING MachineNameW
;
39 RtlInitAnsiString(&MachineNameA
, (LPSTR
)lpMachineName
);
40 Status
= RtlAnsiStringToUnicodeString(&MachineNameW
, &MachineNameA
, TRUE
);
41 if (STATUS_SUCCESS
!= Status
)
43 SetLastError(RtlNtStatusToDosError(Status
));
47 rv
= AbortSystemShutdownW(MachineNameW
.Buffer
);
48 RtlFreeUnicodeString(&MachineNameW
);
49 SetLastError(ERROR_SUCCESS
);
53 /**********************************************************************
54 * InitiateSystemShutdownW
59 InitiateSystemShutdownW(LPWSTR lpMachineName
,
62 BOOL bForceAppsClosed
,
63 BOOL bRebootAfterShutdown
)
65 return InitiateSystemShutdownExW(lpMachineName
,
70 SHTDN_REASON_MAJOR_OTHER
|
71 SHTDN_REASON_MINOR_OTHER
|
72 SHTDN_REASON_FLAG_PLANNED
73 /* SHTDN_REASON_MAJOR_LEGACY_API */);
76 /**********************************************************************
77 * InitiateSystemShutdownA
83 InitiateSystemShutdownA(LPSTR lpMachineName
,
86 BOOL bForceAppsClosed
,
87 BOOL bRebootAfterShutdown
)
89 return InitiateSystemShutdownExA(lpMachineName
,
94 SHTDN_REASON_MAJOR_OTHER
|
95 SHTDN_REASON_MINOR_OTHER
|
96 SHTDN_REASON_FLAG_PLANNED
97 /* SHTDN_REASON_MAJOR_LEGACY_API */);
100 /******************************************************************************
101 * InitiateSystemShutdownExW [ADVAPI32.@]
106 InitiateSystemShutdownExW(LPWSTR lpMachineName
,
109 BOOL bForceAppsClosed
,
110 BOOL bRebootAfterShutdown
,
113 SHUTDOWN_ACTION action
;
117 /* Convert to milliseconds so we can use the value later on */
118 Timeout_ms
= dwTimeout
* 1000;
120 if (lpMachineName
!= NULL
)
122 /* FIXME: Remote system shutdown not supported yet */
123 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
126 else /* The local system is being used */
128 /* FIXME: Right now, only basic shutting down and rebooting
130 if(bRebootAfterShutdown
== TRUE
)
132 action
= ShutdownReboot
;
136 action
= ShutdownNoReboot
;
139 Status
= NtShutdownSystem(action
);
142 SetLastError(RtlNtStatusToDosError(Status
));
143 return (Status
== STATUS_SUCCESS
);
146 /******************************************************************************
147 * InitiateSystemShutdownExA [ADVAPI32.@]
149 * see InitiateSystemShutdownExW
152 InitiateSystemShutdownExA(LPSTR lpMachineName
,
155 BOOL bForceAppsClosed
,
156 BOOL bRebootAfterShutdown
,
159 ANSI_STRING MachineNameA
, MessageA
;
160 UNICODE_STRING MachineNameW
, MessageW
;
165 MachineNameW
.Buffer
= NULL
;
166 MessageW
.Buffer
= NULL
;
170 RtlInitAnsiString(&MachineNameA
, lpMachineName
);
171 Status
= RtlAnsiStringToUnicodeString(&MachineNameW
, &MachineNameA
, TRUE
);
172 if (STATUS_SUCCESS
!= Status
)
174 if(MachineNameW
.Buffer
)
175 RtlFreeUnicodeString(&MachineNameW
);
177 SetLastError(RtlNtStatusToDosError(Status
));
184 RtlInitAnsiString(&MessageA
, lpMessage
);
185 Status
= RtlAnsiStringToUnicodeString(&MessageW
, &MessageA
, TRUE
);
186 if (STATUS_SUCCESS
!= Status
)
189 RtlFreeUnicodeString(&MessageW
);
191 SetLastError(RtlNtStatusToDosError(Status
));
196 rv
= InitiateSystemShutdownExW(MachineNameW
.Buffer
,
200 bRebootAfterShutdown
,
202 LastError
= GetLastError();
204 /* Clear the values of both strings */
206 RtlFreeUnicodeString(&MachineNameW
);
209 RtlFreeUnicodeString(&MessageW
);
211 SetLastError(LastError
);
215 /******************************************************************************
216 * InitiateShutdownW [ADVAPI32.@]
221 InitiateShutdownW(LPWSTR lpMachineName
,
224 DWORD dwShutdownFlags
,
228 return ERROR_SUCCESS
;
231 /******************************************************************************
232 * InitiateShutdownA [ADVAPI32.@]
234 * see InitiateShutdownW
237 InitiateShutdownA(LPSTR lpMachineName
,
240 DWORD dwShutdownFlags
,
243 ANSI_STRING MachineNameA
, MessageA
;
244 UNICODE_STRING MachineNameW
, MessageW
;
249 MachineNameW
.Buffer
= NULL
;
250 MessageW
.Buffer
= NULL
;
254 RtlInitAnsiString(&MachineNameA
, lpMachineName
);
255 Status
= RtlAnsiStringToUnicodeString(&MachineNameW
, &MachineNameA
, TRUE
);
256 if (STATUS_SUCCESS
!= Status
)
258 if(MachineNameW
.Buffer
)
259 RtlFreeUnicodeString(&MachineNameW
);
261 SetLastError(RtlNtStatusToDosError(Status
));
268 RtlInitAnsiString(&MessageA
, lpMessage
);
269 Status
= RtlAnsiStringToUnicodeString(&MessageW
, &MessageA
, TRUE
);
270 if (STATUS_SUCCESS
!= Status
)
273 RtlFreeUnicodeString(&MessageW
);
275 SetLastError(RtlNtStatusToDosError(Status
));
280 rv
= InitiateShutdownW(MachineNameW
.Buffer
,
285 LastError
= GetLastError();
287 /* Clear the values of both strings */
289 RtlFreeUnicodeString(&MachineNameW
);
292 RtlFreeUnicodeString(&MessageW
);
294 SetLastError(LastError
);