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>
12 #include <ndk/exfuncs.h>
14 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
16 /**********************************************************************
17 * AbortSystemShutdownW
22 AbortSystemShutdownW(LPCWSTR lpMachineName
)
24 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
29 /**********************************************************************
30 * AbortSystemShutdownA
32 * see AbortSystemShutdownW
35 AbortSystemShutdownA(LPCSTR lpMachineName
)
37 ANSI_STRING MachineNameA
;
38 UNICODE_STRING MachineNameW
;
42 RtlInitAnsiString(&MachineNameA
, (LPSTR
)lpMachineName
);
43 Status
= RtlAnsiStringToUnicodeString(&MachineNameW
, &MachineNameA
, TRUE
);
44 if (STATUS_SUCCESS
!= Status
)
46 SetLastError(RtlNtStatusToDosError(Status
));
50 rv
= AbortSystemShutdownW(MachineNameW
.Buffer
);
51 RtlFreeUnicodeString(&MachineNameW
);
52 SetLastError(ERROR_SUCCESS
);
56 /**********************************************************************
57 * InitiateSystemShutdownW
62 InitiateSystemShutdownW(LPWSTR lpMachineName
,
65 BOOL bForceAppsClosed
,
66 BOOL bRebootAfterShutdown
)
68 return InitiateSystemShutdownExW(lpMachineName
,
73 SHTDN_REASON_MAJOR_OTHER
|
74 SHTDN_REASON_MINOR_OTHER
|
75 SHTDN_REASON_FLAG_PLANNED
76 /* SHTDN_REASON_MAJOR_LEGACY_API */);
79 /**********************************************************************
80 * InitiateSystemShutdownA
86 InitiateSystemShutdownA(LPSTR lpMachineName
,
89 BOOL bForceAppsClosed
,
90 BOOL bRebootAfterShutdown
)
92 return InitiateSystemShutdownExA(lpMachineName
,
97 SHTDN_REASON_MAJOR_OTHER
|
98 SHTDN_REASON_MINOR_OTHER
|
99 SHTDN_REASON_FLAG_PLANNED
100 /* SHTDN_REASON_MAJOR_LEGACY_API */);
103 /******************************************************************************
104 * InitiateSystemShutdownExW [ADVAPI32.@]
109 InitiateSystemShutdownExW(LPWSTR lpMachineName
,
112 BOOL bForceAppsClosed
,
113 BOOL bRebootAfterShutdown
,
116 SHUTDOWN_ACTION action
;
120 /* Convert to milliseconds so we can use the value later on */
121 Timeout_ms
= dwTimeout
* 1000;
123 if (lpMachineName
!= NULL
)
125 /* FIXME: Remote system shutdown not supported yet */
126 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
129 else /* The local system is being used */
131 /* FIXME: Right now, only basic shutting down and rebooting
133 if(bRebootAfterShutdown
== TRUE
)
135 action
= ShutdownReboot
;
139 action
= ShutdownNoReboot
;
142 Status
= NtShutdownSystem(action
);
145 SetLastError(RtlNtStatusToDosError(Status
));
146 return (Status
== STATUS_SUCCESS
);
149 /******************************************************************************
150 * InitiateSystemShutdownExA [ADVAPI32.@]
152 * see InitiateSystemShutdownExW
155 InitiateSystemShutdownExA(LPSTR lpMachineName
,
158 BOOL bForceAppsClosed
,
159 BOOL bRebootAfterShutdown
,
162 ANSI_STRING MachineNameA
, MessageA
;
163 UNICODE_STRING MachineNameW
, MessageW
;
168 MachineNameW
.Buffer
= NULL
;
169 MessageW
.Buffer
= NULL
;
173 RtlInitAnsiString(&MachineNameA
, lpMachineName
);
174 Status
= RtlAnsiStringToUnicodeString(&MachineNameW
, &MachineNameA
, TRUE
);
175 if (STATUS_SUCCESS
!= Status
)
177 if(MachineNameW
.Buffer
)
178 RtlFreeUnicodeString(&MachineNameW
);
180 SetLastError(RtlNtStatusToDosError(Status
));
187 RtlInitAnsiString(&MessageA
, lpMessage
);
188 Status
= RtlAnsiStringToUnicodeString(&MessageW
, &MessageA
, TRUE
);
189 if (STATUS_SUCCESS
!= Status
)
192 RtlFreeUnicodeString(&MessageW
);
194 SetLastError(RtlNtStatusToDosError(Status
));
199 rv
= InitiateSystemShutdownExW(MachineNameW
.Buffer
,
203 bRebootAfterShutdown
,
205 LastError
= GetLastError();
207 /* Clear the values of both strings */
209 RtlFreeUnicodeString(&MachineNameW
);
212 RtlFreeUnicodeString(&MessageW
);
214 SetLastError(LastError
);
218 /******************************************************************************
219 * InitiateShutdownW [ADVAPI32.@]
224 InitiateShutdownW(LPWSTR lpMachineName
,
227 DWORD dwShutdownFlags
,
231 return ERROR_SUCCESS
;
234 /******************************************************************************
235 * InitiateShutdownA [ADVAPI32.@]
237 * see InitiateShutdownW
240 InitiateShutdownA(LPSTR lpMachineName
,
243 DWORD dwShutdownFlags
,
246 ANSI_STRING MachineNameA
, MessageA
;
247 UNICODE_STRING MachineNameW
, MessageW
;
252 MachineNameW
.Buffer
= NULL
;
253 MessageW
.Buffer
= NULL
;
257 RtlInitAnsiString(&MachineNameA
, lpMachineName
);
258 Status
= RtlAnsiStringToUnicodeString(&MachineNameW
, &MachineNameA
, TRUE
);
259 if (STATUS_SUCCESS
!= Status
)
261 if(MachineNameW
.Buffer
)
262 RtlFreeUnicodeString(&MachineNameW
);
264 SetLastError(RtlNtStatusToDosError(Status
));
271 RtlInitAnsiString(&MessageA
, lpMessage
);
272 Status
= RtlAnsiStringToUnicodeString(&MessageW
, &MessageA
, TRUE
);
273 if (STATUS_SUCCESS
!= Status
)
276 RtlFreeUnicodeString(&MessageW
);
278 SetLastError(RtlNtStatusToDosError(Status
));
283 rv
= InitiateShutdownW(MachineNameW
.Buffer
,
288 LastError
= GetLastError();
290 /* Clear the values of both strings */
292 RtlFreeUnicodeString(&MachineNameW
);
295 RtlFreeUnicodeString(&MessageW
);
297 SetLastError(LastError
);