|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
2 P2 ^+ e; h, v8 z. {- }/ D8 R2 K# I7 q- r2 H& O% l4 p3 H! ^
NTSYSAPI/ m" e9 Y& Z7 D: o
NTSTATUS- v5 M' I& m+ N8 L
NTAPI8 ]% G6 w [0 g$ P* C
NtShutdownSystem(SHUTDOWN_ACTION); ~* r e$ A e* V" e8 o! e
4 W7 e6 v3 y+ j1 d! i3 z
SHUTDOWN_ACTION 结构定义:9 [ P- I$ o- o g3 B
typedef enum _SHUTDOWN_ACTION {7 W# `. W* z8 I6 r- _4 m
ShutdownNoReboot,
& B8 f, o. H& ~+ j& a6 FShutdownReboot,
, ]0 H( }+ A' @* C8 q! HShutdownPowerOff8 @+ o8 }2 a& L2 a+ R, s4 h% w
}SHUTDOWN_ACTION;
) Y5 Z- Y, i3 m, R0 u1 o! }5 f- ~; P; ?1 i7 e
下面是一段使用该函数的例子代码:7 r3 H7 P4 @8 V4 U! c- V
, n3 [3 e* ]$ Y! A) p1 UHANDLE hToken;1 f# c- V/ W! h6 T4 }) g
if (OpenProcessToken(GetCurrentProcess(), 1 s. J, C/ V2 o) B! B+ Z: P
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
4 k/ q7 f6 o7 U" i# z{
j% Y9 X) D/ [$ e: g9 ITOKEN_PRIVILEGES tkp;
2 q( W6 F/ ^& @# E9 o% I
* u& C8 j* l6 aLookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
+ r* E; v8 k9 U1 L+ G& U G0 f" y1 l! A4 Y. U- W- W9 s
tkp.PrivilegeCount = 1;( ~& X3 b: r8 R2 ?" i
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 4 A' k7 X6 z/ Z1 }# \+ |
% A3 ~( X6 ^: {3 ^
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);3 ^) i% q7 [; d) i
CloseHandle(hToken);- x7 ^$ z0 o/ S+ r
}
2 }4 ]8 ]5 T+ c' h) H& k' X! p$ j' A' z7 H! s8 q
NtShutdownSystem(ShutdownNoReboot); |
|