|
|
使用 NtShutdownSystem 可以强制关闭 Windows 系统。这个函数是众多的未归档的 Windows NT/2000 Native API 函数之一,它在关闭系统时不会事先通知系统服务程序和用户程序。行为很是粗鲁,除非迫不得已,最好不要使用这个函数。msgina.dll 中用到了这个函数。该函数由 ntdll.dll 输出,其原型如下:
* f8 H; Q5 m6 g4 {6 C1 c( k3 A [8 D0 [3 B0 w
NTSYSAPI# s: o8 n# d- d6 H! x( e
NTSTATUS
3 k1 B8 V2 j8 l% ]/ O: \NTAPI* q7 ^" i9 L" v
NtShutdownSystem(SHUTDOWN_ACTION);
1 H/ Z, C1 {/ T- v
. Y/ l# t* j6 y5 u, CSHUTDOWN_ACTION 结构定义:
. X7 g7 H7 f6 _8 v4 S' M+ utypedef enum _SHUTDOWN_ACTION {
+ B3 g! K" j; t, _, S- T! |/ sShutdownNoReboot,
- D& h k2 G$ p& bShutdownReboot,( p8 G3 `5 y% L: W" a9 ~
ShutdownPowerOff% a/ f# g8 C5 q$ F
}SHUTDOWN_ACTION;
* y( p( }9 `$ i& p0 s( a0 p
; b1 T8 x8 l# i9 y& p6 J下面是一段使用该函数的例子代码:! F4 U, Q; \! [
" e% K: D' ~! X" RHANDLE hToken;
7 L& S9 z% q! c. R( K* e, oif (OpenProcessToken(GetCurrentProcess(), 5 g2 _4 w; P/ a% P
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))7 a* v) W. U4 z. _& y4 @' ?
{
9 B5 X) E" Y! d1 h' a5 l3 TTOKEN_PRIVILEGES tkp;+ d9 O: A5 n1 s: l
2 G) q6 @3 m; T& |! Q8 X( v
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);' I z! b. s. n8 E
! b" l8 T) u0 H% u& Y; \tkp.PrivilegeCount = 1;
5 U. N6 \9 H) {, U$ Itkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; q% o' x. H+ b' S. `# r' a" X# j
4 h# q; s- Z5 v+ [5 g
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);5 B3 @; D0 j- ~3 n
CloseHandle(hToken);
8 u) ?+ X7 ^+ |/ C* e}# w! C2 y) c7 R' w8 z2 B8 R
! t/ D: n! R; L2 \& vNtShutdownSystem(ShutdownNoReboot); |
|