예전에 제가 시스템을 학실히(?) 죽일려고 했던적이 있었는데,
실력이 딸려서 포기한 적이 있습니다.
우연히 인터넷에서 관련 자료가 있어서 올립니다.
시스템을 도저히 살려둘수가 없는분은 참고하시기 바랍니다.
Some programs require Windows to be restarted once it is installed
on the system for the first time. If your program has a similar need,
you could use the following function -- WinExit() -- to shut down
Windows, restart Windows, or log off the current user from Windows.
function SetPrivilege(
sPrivilegeName : string;
bEnabled : boolean )
: boolean;
var
TPPrev,
TP : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
OpenProcessToken(
GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY,
@Token );
TP.PrivilegeCount := 1;
if( LookupPrivilegeValue(
Nil,
PChar( sPrivilegeName ),
TP.Privileges[ 0 ].LUID ) )then
begin
if( bEnabled )then
begin
TP.Privileges[ 0 ].Attributes :=
SE_PRIVILEGE_ENABLED;
end else
begin
TP.Privileges[ 0 ].Attributes :=
0;
end;
dwRetLen := 0;
Result := AdjustTokenPrivileges(
Token,
False,
TP,
SizeOf( TPPrev ),
TPPrev,
dwRetLen );
end;
CloseHandle( Token );
end;
//
// iFlags:
//
// one of the following must be
// specified
//
// EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
//
// following attributes may be
// combined with above flags
//
// EWX_POWEROFF
// EWX_FORCE : terminate processes
//
function WinExit( iFlags : integer ) : boolean;
begin
Result := True;
if( SetPrivilege( 'SeShutdownPrivilege', True ) )then
begin
if( not ExitWindowsEx( iFlags, 0 ) )then
begin
// handle errors...
Result := False;
end;
SetPrivilege( 'SeShutdownPrivilege', False )
end else
begin
// handle errors...
Result := False;
end;
end;
WinExit() function was desinged to be used with 32 bit Windows
programs (Win32) and it does not support restarting Windows without
rebooting or logging off. If you're writing a program that will be run
under Windows 3.x or Windows 95 and you want to restart windows
without rebooting the machine (after installing device drivers, for
example), you can use ExitWindows() Win16 function (don't forget to
add WinProcs and WinTypes units to your uses section):
ExitWindows( EW_RESTARTWINDOWS, 0 );
.
|