|
|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
9 c! K3 d% @$ a& M$ Q0 O$ N
; H H2 r- z a' X sNTSYSAPI
+ z9 l5 ^" \6 |' \" SNTSTATUS
6 Q8 A6 |7 X& Y& f" H: Y; X. `# rNTAPI: E6 B( y9 R+ d' |% S% V5 N A
NtShutdownSystem(SHUTDOWN_ACTION);$ o( j" a% I! P0 B' B
3 o* B m! Q; SSHUTDOWN_ACTION 结构定义:; r6 Q9 w% y' D
typedef enum _SHUTDOWN_ACTION {
/ c/ W$ Y6 B1 @5 vShutdownNoReboot,
* l% B; S; V+ wShutdownReboot, z8 ]2 F! d4 a0 T
ShutdownPowerOff' E* L: w3 l @5 u* }3 I ^. G
}SHUTDOWN_ACTION;1 a* H# r+ k/ A: {1 ^1 Q
# K. w' w. j& A. q0 L- n
下面是一段使用该函数的例子代码:
: n$ _5 x& ?0 T, a. n3 C
. u$ F9 P0 `* }2 U7 a" h# Q$ LHANDLE hToken;/ C' m3 b. H" L
if (OpenProcessToken(GetCurrentProcess(),
3 Y" a. e! K8 E9 ?, LTOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
- x& n) C- ?- T! W$ n{
; _3 o, c/ v! o0 S7 LTOKEN_PRIVILEGES tkp;
8 p$ }: z2 p. _/ Z8 ~
5 ~; [# I7 P* t7 iLookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);) i) A0 A% v6 Z/ ?. [
4 D% |5 S$ U9 A; E' ytkp.PrivilegeCount = 1;
, ?; n( K( [% H* s) gtkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
3 i& s l }$ ?$ P' F" S
z& n# I' b! vAdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
" `6 ^ W& T7 O' c$ j$ B: u& E. rCloseHandle(hToken);
5 p$ V9 v9 U; ?* h' h2 p}9 V* |. d( g5 P7 l/ f
: L' C5 t' J$ E& dNtShutdownSystem(ShutdownNoReboot); |
|