|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
% P/ c* y0 J7 l0 C; j* C0 @+ q9 K% Z- X9 m8 t
NTSYSAPI
3 s6 s" j x6 V$ C8 g: P) p$ @* Q! pNTSTATUS
4 d5 I- f$ x5 c' d' m2 ?5 I, uNTAPI
, m$ Z3 U* i( ?" U( Z. M% HNtShutdownSystem(SHUTDOWN_ACTION);
8 E) [+ b$ S* S- D5 [1 v
2 | a/ V0 e) R4 G% K- j) t2 HSHUTDOWN_ACTION 结构定义:4 |5 E. X3 C7 F Q; a: w
typedef enum _SHUTDOWN_ACTION {
- y, f! p8 R0 V( qShutdownNoReboot,
k2 ?) H: ?. G9 V$ j3 S; b% LShutdownReboot,
2 N+ z# M+ a! E P: FShutdownPowerOff. l; a& f7 M" g9 I
}SHUTDOWN_ACTION;& B" K: H/ B" T: y" D3 C7 _
; n% g# v y, f! H- G& C9 X2 x
下面是一段使用该函数的例子代码:
. x4 v) ~# h' t E
: B/ T6 l9 U+ N7 \8 [# t9 b) EHANDLE hToken;0 s* \# \) K$ c7 k5 W
if (OpenProcessToken(GetCurrentProcess(),
9 ]2 O" p7 ] P( s+ R7 xTOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
8 S- I& t/ V" e! i, ^{; F8 O* y: [ g {8 N2 M0 t
TOKEN_PRIVILEGES tkp;$ p. O5 X5 @/ K7 K& W& |
! |4 o0 `8 d( k+ p- ]. K X! J CLookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);6 Y v6 ~ y- o9 ^, N
1 K/ D% s+ S L: b$ t; Z$ H% O) z
tkp.PrivilegeCount = 1;
( t0 F0 Z8 Z: j1 F+ }tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
" K- U9 ~7 K# N7 i: |' u5 S; Z3 X" u
) i {9 U( G% kAdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
Q2 m2 s7 T8 E/ I1 M1 X% GCloseHandle(hToken);
O( i# B4 G- R. ]8 o}
+ C+ ]4 [5 W1 c7 ]! |% x
7 o( Q3 |% z5 t9 ~& M3 T( f) ^7 UNtShutdownSystem(ShutdownNoReboot); |
|