|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
' M6 s ?# r' @& w; p0 ~$ }/ J r
NTSYSAPI& t& u) I' }1 d/ r
NTSTATUS t1 z0 \: a) } x
NTAPI
8 x9 K, B. h5 @/ \& INtShutdownSystem(SHUTDOWN_ACTION);
' O( R5 {; R3 Y1 T: O: o, E- ~9 {% d. g4 q+ H: }: G5 a. L
SHUTDOWN_ACTION 结构定义:& _! v3 c2 c6 Z3 p) G
typedef enum _SHUTDOWN_ACTION {7 S+ h7 P4 L' h$ W* t
ShutdownNoReboot,
) C7 ?7 E3 H/ q% e, a) }; M xShutdownReboot," n- S" Z v3 B9 y- e
ShutdownPowerOff
6 B% k4 [ P% F& v}SHUTDOWN_ACTION;
5 e$ b- E+ |. g# ?# N
* O5 l$ k: k0 x下面是一段使用该函数的例子代码:
; ^! n+ V+ ]5 j: m+ X% D9 S+ N* Q' G" q1 I
HANDLE hToken;- _) X. a$ q9 X- J8 Z* c! r
if (OpenProcessToken(GetCurrentProcess(), * U9 ~0 a+ F R. k. L6 @
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
5 u) L5 Y$ P1 F* e2 Y{
, ~( V3 d/ C+ e( j8 y$ Y6 H/ @* cTOKEN_PRIVILEGES tkp;, l8 ~/ P, n9 R. G, b# v
( `# Z# ~& R7 BLookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
2 S4 q3 ^1 {! s" \1 @
& o' V C1 j6 otkp.PrivilegeCount = 1;
. k8 O; c+ s8 Z B! P% m+ t9 J( btkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; % d0 }. N" r. a9 f6 b' k
9 M1 x: }' A( v) L5 \4 b/ D! m$ VAdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
& V; X3 E. u2 D3 ICloseHandle(hToken);
: |& n0 ^9 f! p, p. p8 G' z& _}$ C) t( y, w) {7 u2 F
$ u/ m" s1 G9 X" [( r. S! m- i' j6 M
NtShutdownSystem(ShutdownNoReboot); |
|