再谈如何在WinNT以上系统通过程序快速关机

{  
    文章名   : 再谈如何在WinNT以上系统通过程序快速关机
    说明     : 无
    作者     : JJony
    QQ       : 254706028
    博客     : http://blog.csdn.net/jzj_jony
    空间     : http://jonychen,ys168.com
    测试环境 : WinXPSP2/Win2003SP1
    声明     : 您可以任意转载,但请注明文章作者和出处
}

    再谈如何在WinNT以上系统通过程序快速关机

    在上一篇"如何在WinNT以上通过程序快速关机"中我提到了用两种方法来关机,事实上
这两种方法并不是最快的,细心的朋友可能会注意到用这两种方法时,你是可以看到关
机过程的,先关掉你打开的程序,然后是关闭桌面、任务栏,再就是显示系统正在注销
正在关机之类的,今天给大家介绍的方法会从桌面直接关机而不会有关机过程。
    就是利用Windows Native API,他们由NTDLL.DLL导出,这些API函数是在Ring3模式最底
层的函数了,我们通常用的API最终都是通过他们来和系统内核Ring0模式打交道的,因此我
们可以绕过普通API而直接使用Windows Native API(注意使用Windows Native API一定要动
态加载),而实现关机的Native API就是NtShutDownSystem和ZwShutDownSystem这两个都可
以,在Ring3模式是一样的,以NtShutDownSystem为例,其原形为:
    function NtShutdownSystem( Action : SHUTDOWN_ACTION): Cardinal; stdcall;
只有一个枚举类型的参数Action:执行何种关机操作,其定义为:
type
  _SHUTDOWN_ACTION = (
    ShutdownNoReboot,//关机不重启
    ShutdownReboot,  //关机并重启
    ShutdownPowerOff);//关机并关闭电源
  SHUTDOWN_ACTION = _SHUTDOWN_ACTION;
  TShutdownAction = SHUTDOWN_ACTION;
下面为实现关机的完整源代码:

type
  _SHUTDOWN_ACTION = (
    ShutdownNoReboot,
    ShutdownReboot,
    ShutdownPowerOff);
  SHUTDOWN_ACTION = _SHUTDOWN_ACTION;
  TShutdownAction = SHUTDOWN_ACTION;
type
  TNtShutdownSystem=function( Action : SHUTDOWN_ACTION): Cardinal; stdcall;
var
  h:Hmodule;
  NtShutdownSystem:TNtShutdownSystem;

implementation

//获取指定权限
function EnableDebugPrivilege(PName:pchar):Boolean;
var
 TokenHandle:THandle;
 DebugNameValue:TLargeInteger;
 Privileges:TOKEN_PRIVILEGES;
 RetLen:Cardinal;
begin
 Result:=False;
 if not OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or

TOKEN_QUERY,TokenHandle) then Exit;
 if not LookupPrivilegeValue(nil,PName,DebugNameValue) then
 begin
  CloseHandle(TokenHandle);
  Exit;
 end;
 Privileges.PrivilegeCount:=1;
 Privileges.Privileges[0].Luid:=DebugNameValue;
 Privileges.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
 Result:=AdjustTokenPrivileges(TokenHandle,False,Privileges,SizeOf(Privileges),nil,RetLen);
 CloseHandle(TokenHandle);
end;
//动态加载NtShutdownSystem
function LoadNTDll:boolean;
begin
  result:=false;
  if h>0 then exit;
  h:=LoadLibrary('NTDLL.DLL');
  if h>0 then
  NtShutdownSystem:=GetProcAddress(h,'NtShutdownSystem');
  result:=assigned(NtShutdownSystem);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   h:=0;
if not LoadNTDll then
 begin
   MessageBoxA(handle,'加载NTShutDownSystem失败','错误',mb_ok);
   ExitProcess(0);
 end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   if h>0 then FreeLibrary(h);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
   EnableDebugPrivilege('SeShutdownPrivilege');//取关机权限
   NTShutDownSystem(ShutdownPowerOff);         //关机
end;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值