|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:4 i# C( I$ s, x; D3 G c) {
% j& M+ [7 q9 N0 p* E5 A: e
NTSYSAPI( k8 J3 L8 ?4 F4 l
NTSTATUS8 e4 ?1 J: }$ `- x6 @' G
NTAPI
D- f9 D* [. u: r. x/ E5 `2 `2 t6 SNtShutdownSystem(SHUTDOWN_ACTION);
" K( M: j- `* \: Y* p# b5 q P$ p: o" `! ?
SHUTDOWN_ACTION 结构定义:
F/ T% o( `1 k. b& ztypedef enum _SHUTDOWN_ACTION {6 q0 ^( @2 Z& g* Q) Y% g1 ~' r
ShutdownNoReboot,6 \( C+ G- e) c1 E3 e# t- n
ShutdownReboot,9 _' w& O, t/ o( B' V4 h6 u
ShutdownPowerOff
2 z8 |+ V% P( o& e}SHUTDOWN_ACTION;1 I, ? p) Q U) S
! s! C5 M/ {- ~
下面是一段使用该函数的例子代码:! C: @# x4 i1 l9 x% Q) ]
2 g% \) l0 Z+ o( G# ~
HANDLE hToken;
) |' r* ~- y3 N! q! \if (OpenProcessToken(GetCurrentProcess(),
, `7 y8 |) { Y. X" wTOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))% s) ~/ g3 O4 d5 b# Y2 K: r! z! k
{
# p# T: n' }! h5 w# F" q3 GTOKEN_PRIVILEGES tkp;7 l' Y; f6 A2 G; V+ \3 p
4 I) W' y/ R6 X3 f5 H; N
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);& |! F* E' |2 p$ q ?' C
: j* k$ g: F/ A& ^$ a9 A0 P
tkp.PrivilegeCount = 1;3 `, ?! I3 J$ P( i+ D0 E, _ u
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 8 M- _/ O& N* N# Y! J4 p4 s* g
2 p% T' ^, j6 }8 ^* \1 ]. @
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
f* X4 C2 F7 s9 A# GCloseHandle(hToken);+ O5 Z3 y+ C, \3 S, S9 T- l
}- ^$ t" T. t8 Z6 w( v+ u: \ B. h, w
* s8 B* e2 P( J' _) O: d7 M" V- |
NtShutdownSystem(ShutdownNoReboot); |
|