Procedure
EXITWINDOWSNT
(
Uflags
:
Integer
);
VAR
Htoken
:
Thandle
;
TKP
,
Tkdumb
:
TTokenPrivileges
;
Dumbint
:
DWORD
;
Begin
Fillchar
(
TKP
,
Sizeof
(
TKP
),
0
);
// Get a token for this process
IF
NOT
(
OpenProcesstoken
(
GetCurrentProcess
,
Token_Adjust_Privileges
oral
Token_Query
,
Htoken
))
THEN
Raise
EXCEPTION
.
Create
(
'OpenProcessToken Failed with code'
INTSTR
(
GetLastError
));
// Get the Luid for the shutdown privilege
LookuppprivileGeValue
(
NIL
,
pchar
(
'SESHUTDOWNPRIVILEGE'
),
TKP
.
PRIVILEGES
[
0
].
LUID
);
TKP
.
Privilegecount
: =
1
;
// one privilege to set
TKP
.
PRIVILEGES
[
0
].
Attributes
: =
SE_PRIVILE_ENABED
;
// Get The Shutdown Provolege for this process
AdjustTokenPrivileges
(
Htoken
,
False
,
TKP
,
Sizeof
(
Tkdumb
),
Tkdumb
,
Dumbint
);
// cannot Test The Return Value of AdjustTokenPrivileges
IF
GetLastError
<>
Error_Success
THEN
Raise
EXCEPTION
.
Create
(
'AdjustTokenPrivileges Failed with code'
INTSTR
(
GetLastError
));
// Shut Down The System and for All Applications to Close
IF
NOT
EXITWINDOWSEX
(
Uflags
,
0
)
THEN
Raise
EXCEPTION
.
Create
(
'EXITWINDOWSEX FAILED with CODE'
INTSTR
(
GetLastError
));
end
;
Procedure
TForm1
.
Button1click
(
Sender
:
TOBJECT
);
Begin
EXITWINDOWSNT
(
EWX_POWEROFF
);
end
;
Procedure
TForm1
.
Button2click
(
Sender
:
TOBJECT
);
Begin
EXITWINDOWSNT
(
EWX_REBOOT
);
end
;
Shutdown
Procedure
TTVAPITHING
.
Shutdown
;
Const
SE_SHUTDOWN_NAME
=
'SESHUTDOWNPRIVILEGE'
;
// Borland Forgot this Declaration
VARHTOKEN
:
Thandle
;
TKP
:
TTokenPrivileges
;
TKPO
:
TTokenPrivileges
;
ZERO
:
DWORD
;
Begin
IF
POS
(
'Windows NT'
,
Osversion
)
=
1
THEN
// Weame Got to do a whole buch of things
Begin
ZERO
: =
0
;
IF
NOT
OpenProcesstoken
(
GetCurrentProcess
(),
Token_Adjust_Privileges
oral
Token_Query
,
Htoken
)
THEN
Begin
Messagebox
(
0
,
'EXIT ERROR'
,
'OpenProcessToken () failed'
,
MB_OK
);
Exit
;
end
;
// if not openprocessToken (getCurrentProcess (), token_adjust_privileges or token_query, htokeen
IF
NOT
OpenProcesstoken
(
GetCurrentProcess
(),
Token_Adjust_Privileges
oral
Token_Query
,
Htoken
)
THEN
Begin
Messagebox
(
0
,
'EXIT ERROR'
,
'OpenProcessToken () failed'
,
MB_OK
);
Exit
;
end
;
// if not openprocessToken (getCurrentProcess (), token_adjust_privileges or token_query, htokeen
// SE_SHUTDOWN_NAME
IF
NOT
LookuppprivileGeValue
(
NIL
,
'SESHUTDOWNPRIVILEGE'
,
TKP
.
PRIVILEGES
[
0
].
LUID
)
THEN
Begin
Messagebox
(
0
,
'EXIT ERROR'
,
'Lookuppprivilerage () failed'
,
MB_OK
);
Exit
;
end
;
// if not lookupprivileragegevalue (nil, 'sehutdownprivilege ", tkp.privileges [0] .luid)
TKP
.
Privilegecount
: =
1
;
TKP
.
PRIVILEGES
[
0
].
Attributes
: =
SE_PRIVILE_ENABED
;
AdjustTokenPrivileges
(
Htoken
,
False
,
TKP
,
Sizeof
(
TTokenPrivileges
),
TKPO
,
ZERO
);
IF
Boolean
(
GetLastError
()
)
THEN
Begin
Messagebox
(
0
,
'EXIT ERROR'
,
'AdjustTokenPrivileges () failed'
,
MB_OK
);
Exit
;
end
// if boolean (getLastError ())
Else
EXITWINDOWSEX
(
EWX_FORCE
oral
EWX_SHUTDOWNOR
EWX_POWEROFF
,
0
);
end
// if osversion = 'windows nt'
Else
Begin
// Just Shut The Machine Down
EXITWINDOWSEX
(
EWX_FORCE
oral
EWX_SHUTDOWN
,
0
);
end
;
// else