找回密码
 加入
搜索
查看: 4955|回复: 9

关于Ctrl+任务管理器快速关机DLL调用方法,怎么用?(有资料)

[复制链接]
发表于 2009-7-8 13:01:24 | 显示全部楼层 |阅读模式
本帖最后由 AUFS 于 2009-7-11 13:53 编辑

win.exit(0); --保留函数
win.exit(1); --关机
win.exit(2); --重启
win.exit(3); --注销
win.exit(4); --待机
win.exit((5); --休眠

win.exec()函数是调用正常的关机程序,先退出其他程序,然后保存设置,最后再关闭系统。

NtShutdownSystem()直接关闭系统,没有前面的步骤,相当于再任务管理器里按Ctrl的同时

再点关机菜单,这样速度快。因特殊需要,只能通过NtShutdownSystem实现。


--声明NtShutdownSystem要用到的常量
ShutdownNoReboot = 0;
ShutdownReboot = 1;
ShutdownPowerOff = 2;

--导入NtShutdownSystem函数
NtShutdownSystem = dll.open("ntdll.dll", "NtShutdownSystem", "i(i)");

--用win.exit(1)做关机前的准备,获得关机权限
win.exit(1)

--直接调用NtShutdownSystem函数硬关机,不等待系统保存设置
NtShutdownSystem(ShutdownNoReboot)

调用一次win.exit(1)以获得关机权限这是个很绝妙的技巧

下面的是易语言的代码...
DLL申明: .DLL命令 NtShutdownSystem, , "ntdll.dll", "NtShutdownSystem" .参数 关机参数, 整数型 .DLL命令 RtlAdjustPrivilege, , "ntdll.dll", "RtlAdjustPrivilege" .参数 Privilege, 整数型 .参数 NewValue, 整数型 .参数 NewThread, 整数型 .参数 OldValue, 整数型 常量: .常量 SE_SHUTDOWN_PRIVILEGE=19 .常量 ShutDown= 0 .常量 RESTART=1 .常量 POWEROFF=2 代码: .子程序 _关机_被单击 RtlAdjustPrivilege (#SE_SHUTDOWN_PRIVILEGE, 1, 0, 0) NTSHUTDOWNSYSTEM(0) .子程序 _重启_被单击 RtlAdjustPrivilege (#SE_SHUTDOWN_PRIVILEGE, 1, 0, 0) NtShutdownSystem (1) .子程序 _关机_被单击 RtlAdjustPrivilege (#SE_SHUTDOWN_PRIVILEGE, 1, 0, 0) NtShutdownSystem (2)


这里还有一个例:

#Include "windows.bi"

Enum _SHUTDOWN_ACTION
    ShutdownNoReboot
    ShutdownReboot
    ShutdownPowerOff
End Enum
#Define SE_SHUTDOWN_PRIVILEGE   &H13
#Define AdjustCurrentProcess    0

Declare Function RtlAdjustPrivilege Lib "ntdll" Alias "RtlAdjustPrivilege" (ByVal Privilege As ULong,ByVal Enable As BOOLEAN,ByVal Client As BOOLEAN,ByVal WasEnabled As PBOOLEAN) As DWORD
Declare Function NtShutdownSystem Lib "ntdll" Alias "NtShutdownSystem" (ByVal shutdown As _SHUTDOWN_ACTION) As DWORD

Dim bprev As BOOLEAN = FALSE

RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,TRUE,AdjustCurrentProcess,@bprev)
NtShutdownSystem(ShutdownNoReboot Or ShutdownPowerOff)
If GetLastError<>0 Then
    MessageBox(NULL,Hex(GetLastError()),"",MB_OK)
    SetLastError(0)
EndIf


C++例:


//********************************************************************
//      Filename: Main.cpp
//        Author: Chinafish
//      Modifier: Chinafish
//       Created: 2008-5-15 15:07
//       Updated: 2008-5-15 15:07
//            QQ: 149200849
//           MSN: china_fish@msn.com   
//       Purpose: 紧急关机不保存数据, 硬盘无损害(需要Win2000及以上)
//=====================================================
//  Copyright(C) 2004-2008 by Chinafish. All Rights Reserved.
//********************************************************************

#include "windows.h"

typedef enum _SHUTDOWN_ACTION
{
    ShutdownNoReboot,    // 关机
    ShutdownReboot,        // 重启
    ShutdownPowerOff    // 关闭电源
}SHUTDOWN_ACTION;

DWORD (__stdcall *NtShutdownSystem)(SHUTDOWN_ACTION);

void QShutdown();

// 发布版本使用MiniPE (1.5KB)
#ifndef _DEBUG

#pragma comment(linker, "/ENTRY:EntryPoint")
#pragma comment(linker, "/SECTION:QShutPE,")
#pragma comment(linker, "/MERGE:.data=QShutPE")
#pragma comment(linker, "/MERGE:.text=QShutPE")
#pragma comment(linker, "/MERGE:.rdata=QShutPE")

void EntryPoint()
{
    QShutdown();
    return;
}

#else

int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
{
    QShutdown();
    return 0;
}

#endif

void QShutdown()
{
    HANDLE hToken;

    // 得到关机权限
    if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
            &hToken))
    {
        TOKEN_PRIVILEGES tkp;
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
        CloseHandle(hToken);
    }

    // 执行快速关机
    HMODULE hMod;
    hMod = LoadLibrary("ntdll.dll");
    if(hMod)
    {
        NtShutdownSystem = (DWORD(__stdcall *)(SHUTDOWN_ACTION))GetProcAddress(hMod, "NtShutdownSystem");
        NtShutdownSystem(ShutdownNoReboot);
    }
    return;
}

这个是收集到的资料...望有高手可以在AU3里实行调用.
发表于 2009-7-9 08:37:27 | 显示全部楼层
有那么复杂吗?
2003以下
即时关机:

DllCall("ntdll.dll","long","RtlAdjustPrivilege",  "int",19,  "int",1,  "int",0,  "int*",0)
DllCall("ntdll.dll","str","NtShutdownSystem",  "int",2)

即时重启:

DllCall("ntdll.dll","long","RtlAdjustPrivilege",  "int",19,  "int",1,  "int",0,  "int*",0)
DllCall("ntdll.dll","str","NtShutdownSystem",  "int",1)
发表于 2009-7-9 13:29:39 | 显示全部楼层
提权最后一个参数是指针的。


关机:
_WinAPI_NtShutdownSystem(2)
重启:
_WinAPI_NtShutdownSystem(1)

Func _WinAPI_NtShutdownSystem($flags)        
        DllCall("ntdll.dll","int","RtlAdjustPrivilege","long",0x13,"int",True,"int",False,"ptr",DllStructGetPtr(DllStructCreate("int 0")))
        DllCall("ntdll.dll","int","NtShutdownSystem","int",$flags)
EndFunc
发表于 2009-7-9 13:53:38 | 显示全部楼层
看到ByVal WasEnabled As PBOOLEAN这句中的PBOOLEAN,大概可以猜到最后一个参数是用于输出的参数,关键看这个输出型的指针参数指向什么类结构,int型可以用int*代替,dword;dword或者byte[8]、ushort[4]可以用int64*代替,但如果是2个以上4字节或4字节以上的成员聚合在一起,类似于这样的ulong;ptr;hWnd,必须用DllStructCreate定义,因为ulong;ptr;hWnd这个结构占用了12字节,autoit定义只有单个成员的结构时,这个结构大小最多只能是8字节int64。
又说了一些无聊的话,无视之。
发表于 2009-7-11 00:45:44 | 显示全部楼层
哈,知道了
就是不知道为什么用勾上了使用upx压缩,编译出来的就被小红伞杀掉?
发表于 2009-7-11 01:05:17 | 显示全部楼层
这种东西本来就可以说是病毒。。。
误报的
 楼主| 发表于 2009-7-11 13:59:30 | 显示全部楼层
难得三恨兄大架光临问题得已解决...多谢楼上的几位热心朋友.
发表于 2009-9-8 12:17:02 | 显示全部楼层
确实很强大~~
发表于 2011-4-3 18:33:31 | 显示全部楼层
路过 学习~
发表于 2011-4-3 19:46:34 | 显示全部楼层
#Include <WinAPIEx.au3>
Global $hToken, $flags
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_SHUTDOWN_NAME, 1)
DllCall("ntdll.dll","int","NtShutdownSystem","int",$flags)
_WinAPI_CloseHandle($hToken)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-27 16:44 , Processed in 0.076056 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表