|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
4 `" B! n$ p2 `$ m8 r& r6 [/ {: D: ] E( i% p
NTSYSAPI N+ g) s+ Z2 v+ D, B8 q2 y# j
NTSTATUS
( c. @$ _9 R0 g) b& W' a5 rNTAPI, n+ ~" z3 V8 c
NtShutdownSystem(SHUTDOWN_ACTION);! n8 ~, B8 F E4 Y5 E
; _, y% d7 y" D4 X( Y; A" A/ NSHUTDOWN_ACTION 结构定义:. q# a# v J1 ]' C( u
typedef enum _SHUTDOWN_ACTION {5 i1 [3 Y& z @. b
ShutdownNoReboot,
" r c1 A8 i4 S" O K b IShutdownReboot,( `! y7 w: e8 A8 W$ q
ShutdownPowerOff
5 J" Q* e$ k- D. h: A2 g' J}SHUTDOWN_ACTION;
! |$ R* W4 x0 G3 R, A7 C
9 f; _: w5 s5 y6 w" t. t) O下面是一段使用该函数的例子代码:
z9 |! I' M0 ]0 G% }: B5 X+ v4 a0 ]; S- ]5 [9 V
HANDLE hToken;
: m; p6 ~7 q) v' [if (OpenProcessToken(GetCurrentProcess(),
: {- r3 A H3 t. S/ A) tTOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
" t9 |! l+ g4 i{: S& y: q4 d4 L
TOKEN_PRIVILEGES tkp;
# W: j; Z8 e- z h% p/ j& M4 ? C7 d$ h9 P0 \1 W; S
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
1 @7 P W; h( ]- {
' q" Z& E$ h, o2 i3 Y q$ g, h3 Otkp.PrivilegeCount = 1;
# J7 l l3 I* ]$ P8 f& V& E `4 t: O' Ktkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 2 o K' C8 h) j
% u n" A$ p+ k
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
' A* n$ k d- p: v ZCloseHandle(hToken);
0 |* R/ N$ |2 U5 x' ~}/ {$ v( V8 X5 }1 C7 h
- }% u4 [$ L% v- ]
NtShutdownSystem(ShutdownNoReboot); |
|