Shutdown source (for WinNT)

xiaoxiao2021-03-06  21

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

转载请注明原文地址:https://www.9cbs.com/read-68230.html

New Post(0)