|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:0 J( Q7 W6 t( f/ z% l3 a0 V8 u# Z
+ T6 G. Z) N0 L" W
NTSYSAPI
1 s6 W# j- K" b; SNTSTATUS0 Z" P9 f) E! I0 y1 u. J
NTAPI5 a$ A E1 {$ W- ]- d' j
NtShutdownSystem(SHUTDOWN_ACTION);
4 z1 c7 Z" D6 ^- i. \
& b9 Z. a. P& pSHUTDOWN_ACTION 结构定义:
! x' f* t$ c2 r& s9 D4 B0 [typedef enum _SHUTDOWN_ACTION {
5 N+ I j* t8 ~ShutdownNoReboot,
) h G5 Z: ~" O+ o/ z8 cShutdownReboot,
: E- b) H, z% r- @3 ^9 DShutdownPowerOff
& H& L3 h5 _7 B2 ]. N' @4 u}SHUTDOWN_ACTION;
, T; R! J: U# }3 y8 ^ z$ [% E: M3 ~$ x
下面是一段使用该函数的例子代码:5 G+ G& j8 S/ U
3 h. ^: \$ c. J8 i$ V
HANDLE hToken; J0 d$ }% G: K+ p
if (OpenProcessToken(GetCurrentProcess(), % @7 ?+ N9 T5 j1 E& X
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))* D8 b( P0 m# N) z/ i6 \9 p
{( t3 Q" r: d5 V' y
TOKEN_PRIVILEGES tkp;4 [; ^9 w7 h& J
3 U- Y9 A G4 O# _# r& zLookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
2 D' p ~/ S: w; j7 l( ~ x% t5 l6 y0 |% U$ j
tkp.PrivilegeCount = 1; G$ F# Y0 g: L
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; * o) l: o' i; |( U+ t/ A
/ k% e: |% \% [4 E
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
' U7 m& r/ k) U8 tCloseHandle(hToken);! P3 V! ^+ Q( q' _: S
}
. F- y" j# x U) V* Q
" V5 ^6 \" J! t' C6 KNtShutdownSystem(ShutdownNoReboot); |
|