|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:( a3 l: M3 t. v) `
- C" o" L3 ?1 W5 M, G' g
NTSYSAPI5 E3 c% t# d: ~$ [' A: L" Z
NTSTATUS
& r# q7 D3 o5 zNTAPI V* h# k( k" e* p
NtShutdownSystem(SHUTDOWN_ACTION);; S: W/ T, O6 l; t2 C
& D& D* Y" Z( o! U, _6 u
SHUTDOWN_ACTION 结构定义:4 x( b/ o q4 A1 Y+ c4 V6 {' @ E1 v
typedef enum _SHUTDOWN_ACTION {
% M8 k' t$ n: D8 X8 u! N; ]ShutdownNoReboot,
5 s' p1 ~! _+ Z' M' DShutdownReboot,
8 ^9 D7 `8 z9 f: }: a* w* }ShutdownPowerOff
) u8 `1 F; m% X$ |}SHUTDOWN_ACTION;
7 \- J9 V D8 ], ^! n6 {6 x: s3 a% j9 v6 w# f1 U
下面是一段使用该函数的例子代码:4 i: j" q6 N& o9 U
1 H& \) |( Q# h+ K7 [" p
HANDLE hToken;/ u9 i2 O) a5 a/ L4 v
if (OpenProcessToken(GetCurrentProcess(), % y3 Y& z9 g0 q \
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
0 T# B0 F5 }+ Z, X! X, ?& C{& e& Q: Z; S8 [7 y# ]) Y0 i
TOKEN_PRIVILEGES tkp;
+ w; S* U1 u. C$ q
7 C( w' _+ d6 M D3 }" SLookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
6 A4 L0 ]# l" r" ]) u8 |: X& D
" A$ M" c% c( B+ `3 r: gtkp.PrivilegeCount = 1;
7 J4 v2 y+ _- k3 [! dtkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; / v; e& d7 o* Z C& Q; m9 f/ H! @9 u
`0 Y, u( d8 O9 [: L- [ yAdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
! C3 W$ n& F# D# ^CloseHandle(hToken);
% V0 w# }. d1 b8 |- s) c}
2 z" `& }0 U) U% [
( i; Q/ K y, s& r- |NtShutdownSystem(ShutdownNoReboot); |
|