|
|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
: c, k, {1 G0 [& x* B$ T [: P, D) w4 a; G
NTSYSAPI2 E4 i( T! m/ h1 Z$ R( R" \5 [% f& {
NTSTATUS5 x& C- q b! I- x9 S% Y
NTAPI/ `+ \2 @! h' i) e4 |8 V7 U2 K
NtShutdownSystem(SHUTDOWN_ACTION);8 k& T3 ~, x$ H4 ]* o, \
# G0 p# {6 M# T6 `2 {( I
SHUTDOWN_ACTION 结构定义:/ V( h% a7 D" y( b
typedef enum _SHUTDOWN_ACTION {
9 l. {# L& [& @& R" s. J" A' f6 WShutdownNoReboot,
& ~ e! n3 G; d" NShutdownReboot,2 G8 c: |" f# q/ r0 k4 I; h. C
ShutdownPowerOff
" v! e; w; h- H& N: ]3 @}SHUTDOWN_ACTION;% s1 ]0 F- l/ Y$ m
; C) d5 v* l6 [! V7 h4 M
下面是一段使用该函数的例子代码:" k, W, s2 S: m) A+ p/ F
! h" W" C5 H/ kHANDLE hToken;
3 ]1 n$ _! Y5 _6 ^7 v, R4 iif (OpenProcessToken(GetCurrentProcess(),
% J7 w, {; u& G0 d, a8 K2 dTOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken)). Y. A4 G# Q: x
{, y; J' o+ k' v$ @- ?- C
TOKEN_PRIVILEGES tkp;" K7 ?7 a) N7 {1 J+ z9 W# z7 j& }
1 Z& U! u/ h/ i4 {. I$ t
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
: l G( O2 _4 D ~% c$ v) [- X, Z q6 f' q0 r
tkp.PrivilegeCount = 1;
% I# K6 Y J4 L* @) _tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
5 h, B4 [+ }+ u7 |3 n$ |% M" J$ T% z, g& P. I! k8 Q0 S% [* T3 r0 L
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);* f4 O! M( }8 |) u7 J h2 [0 ]5 y9 t
CloseHandle(hToken);
7 ^% O+ D# L+ i& p+ X}
' P4 q$ F, I3 n2 G0 \) l& ?: A* ^, r# f
NtShutdownSystem(ShutdownNoReboot); |
|