if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return 0;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
InitiateSystemShutdown(
NULL,
NULL,
0,
TRUE,
FALSE
);
---------------
.386p
.model flat,stdcall
option casemap:none
include C:/masm32/bin/ALLDLL
DlgProc proto :dword,:dword,:dword,:dword
.data
hInstance dd ?
privilege db "SeShutdownPrivilege",0
.code
AdjustToken proc
local hdlProcessHandle
local hdlTokenHandle
local @tp:TOKEN_PRIVILEGES
local lBufferNeeded
local @os:OSVERSIONINFO
mov @os.dwOSVersionInfoSize,sizeof OSVERSIONINFO
invoke GetVersionExA,addr @os
cmp @os.dwPlatformId,VER_PLATFORM_WIN32_NT
jne @F
invoke GetCurrentProcess
mov hdlProcessHandle,eax
invoke OpenProcessToken,hdlProcessHandle,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hdlTokenHandle
invoke LookupPrivilegeValue,0,addr privilege,addr @tp.Privileges.Luid
mov @tp.PrivilegeCount,1
mov @tp.Privileges.Attributes,SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges,hdlTokenHandle,FALSE,addr @tp,sizeof TOKEN_PRIVILEGES,addr @tp,addr lBufferNeeded
@@: ret
AdjustToken endp
;===========================================
ResetNow proc iCode
local buf[256],pClose,pAdjust,hNtDll
invoke LoadLibrary,CTXT("NtDll.dll")
.if eax
mov hNtDll,eax
invoke GetProcAddress,hNtDll,CTXT("ZwShutdownSystem")
mov pClose,eax
invoke GetProcAddress,hNtDll,CTXT("RtlAdjustPrivilege")
mov pAdjust,eax
.if eax && pClose
lea eax,buf
push eax
push 1
push 1
push 13H
mov eax,pAdjust
call eax
.if eax==0C000007CH
lea eax,buf
push eax
push 0
push 1
push 13H
mov eax,pAdjust
call eax
.endif
push iCode
mov eax,pClose
call eax
.endif
.endif
ret
ResetNow endp
;===============关机========================
Close_Click proc
invoke ResetNow,0
ret
Close_Click endp
;===============注销========================
Relog_Click proc
invoke AdjustToken
invoke ExitWindowsEx,EWX_LOGOFF or EWX_FORCE,0FFFFh
ret
Relog_Click endp
;===============重新启动====================
cq_Click proc
invoke ResetNow,1
ret
cq_Click endp
;===============待机========================
Standby_Click proc
invoke AdjustToken
invoke SetSystemPowerState,1,1
ret
Standby_Click endp
;===============休眠========================
xm_Click proc
invoke AdjustToken
invoke SetSystemPowerState,0,1
ret
xm_Click endp
;-----------------------------------------------------------------------------------------------------------------
start: ;程序入口
invoke GetModuleHandle,0
mov hInstance,eax
invoke DialogBoxParam,hInstance,9999,0,addr DlgProc,0
invoke ExitProcess,eax
;-----------------------------------------------------------------------------------------------------------------
DlgProc proc hWnd,uMsg,wParam,lParam
mov eax,uMsg
.IF eax==WM_INITDIALOG
invoke LoadIcon,hInstance,1001
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.ELSEIF uMsg==WM_CLOSE
MsgBox 0,"欢迎下次在来,谢谢光临。","关于",48
invoke EndDialog,hWnd,0
.ELSEIF eax==WM_COMMAND
mov edx,hWnd
mov eax,wParam
.if eax==1009
invoke Close_Click
.elseif eax==1010
invoke Relog_Click
.elseif eax==1011
invoke Standby_Click
.elseif eax==1012
invoke xm_Click
.elseif eax==1013
invoke cq_Click
.elseif eax==1014
invoke Sleep,1000
invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_MONITORPOWER,2
.endif
.ELSE
xor eax,eax
ret
.ENDIF
mov eax,TRUE
ret
DlgProc endp
;-----------------------------------------------------------------------------------------------------------------
end start
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include res/shutdown.inc
.data
szMutex db "_Me?",0
.data?
g_hInst dd ?
g_hDatePicker dd ?
g_hTimePicker dd ?
g_hCombobar dd ?
g_hTime dd ?
g_hFont dd ?
g_systime SYSTEMTIME <?> ;保存设定关机的时间
g_nid NOTIFYICONDATA <?>
g_bTiming dd ? ;标志是否开始定时
g_bSysNT dd ? ;是不是 NT 系统
g_iCount dd ?
icex INITCOMMONCONTROLSEX <?>
g_buf db 128 dup (?)
g_hIconMain dd ?
g_hIconStart dd ?
hMutex dd ?
WM_TASKBARCREATE dd ?
.code
start:
invoke GetModuleHandle,NULL
mov g_hInst,eax
invoke CreateMutex,NULL,TRUE,offset szMutex
mov hMutex,eax
invoke GetLastError ; 获得最后发生的错误编号
cmp eax,ERROR_ALREADY_EXISTS ;已经存在
jz @F
invoke RtlZeroMemory, addr icex, sizeof INITCOMMONCONTROLSEX
mov icex.dwSize, sizeof INITCOMMONCONTROLSEX
mov icex.dwICC, ICC_DATE_CLASSES
invoke InitCommonControlsEx, addr icex
invoke DialogBoxParam,g_hInst,DLG_MAIN,NULL,addr MainDlgProc,NULL
@@:
invoke ExitProcess,0
;########################################################################
MainDlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL systime : SYSTEMTIME
mov eax,uMsg
.if eax==WM_INITDIALOG
invoke _Init, hWnd
.elseif eax==WM_COMMAND
mov eax, wParam
and eax, 0ffffh
.if eax==IDC_APPLY ;“应用”按钮
mov g_bTiming, TRUE
;定时,每隔 1000 毫秒产生一个 WM_TIMER 消息
invoke SetTimer, hWnd, ID_TIMER1, 1000, NULL
invoke SendMessage, g_hDatePicker, DTM_GETSYSTEMTIME, 0, addr systime
invoke SendMessage, g_hTimePicker, DTM_GETSYSTEMTIME, 0, addr g_systime
m2m g_systime.wYear, systime.wYear
m2m g_systime.wMonth, systime.wMonth
m2m g_systime.wDay, systime.wDay
pushad ;保存寄存器
movzx eax, g_systime.wYear
movzx ebx, g_systime.wMonth
movzx ecx, g_systime.wDay
movzx edx, g_systime.wHour
movzx esi, g_systime.wMinute
movzx edi, g_systime.wSecond
invoke wsprintf, addr g_buf, CTXT(" [%d-%d-%d %d:%d:%d]"), eax, ebx, ecx, edx, esi, edi
popad
invoke SetWindowText, g_hTime, addr g_buf
invoke _ModifyTrayIcon, hWnd, 1
.elseif eax==IDC_MINIMIZE ;“最小化”按钮
invoke ShowWindow, hWnd, SW_HIDE
.endif
;每隔一秒就判断一次是否到了时间关机
.elseif eax==WM_TIMER
invoke GetLocalTime, addr systime
.if !g_bTiming
jmp lexit
.endif
movzx eax, g_systime.wYear
.if ax != systime.wYear ;比较年
jmp lexit
.endif
movzx eax, g_systime.wMonth
.if ax != systime.wMonth ;比较月
jmp lexit
.endif
movzx eax, g_systime.wDay
.if ax != systime.wDay ;比较日
jmp lexit
.endif
movzx eax, g_systime.wHour
.if ax != systime.wHour ;比较小时
jmp lexit
.endif
movzx eax, g_systime.wMinute
.if ax != systime.wMinute ;比较分钟
jmp lexit
.endif
invoke KillTimer, hWnd, ID_TIMER1
invoke DialogBoxParam,g_hInst,DLG_COUNT,NULL,addr CountDlgProc,NULL
.if eax==0
jmp lkill
.endif
invoke SendMessage, g_hCombobar, CB_GETCURSEL, 0, 0
.if eax==0
invoke _ShutDown, 0 ;关机
.elseif eax==1
invoke _ShutDown, 1 ;休眠
.endif
lkill:
invoke RtlZeroMemory, addr g_systime, sizeof SYSTEMTIME
mov g_bTiming, FALSE
invoke RtlZeroMemory, addr g_buf, 128
invoke SetWindowText, g_hTime, addr g_buf
invoke _ModifyTrayIcon, hWnd, 2
lexit:
;每次激活窗口时获得正确的时间,填充到时间框
.elseif eax==WM_ACTIVATE
invoke GetLocalTime, addr systime
invoke SendMessage, g_hDatePicker, DTM_SETSYSTEMTIME, 0, addr systime
invoke SendMessage, g_hTimePicker, DTM_SETSYSTEMTIME, 0, addr systime
.elseif eax==WM_PAINT
invoke _Paint, hWnd
.elseif uMsg==WM_CTLCOLORSTATIC
invoke GetDlgCtrlID, lParam
.if eax==IDC_TIME
invoke SetTextColor, wParam, COLOR(255,0,0)
invoke GetSysColor, COLOR_BTNFACE
push eax
invoke SetBkColor, wParam, eax
call CreateSolidBrush
ret
.else
mov eax,FALSE
ret
.endif
.elseif eax==WM_ICONNOTIFY
mov eax, lParam
.if eax==WM_LBUTTONDOWN
invoke ShowWindow, hWnd, SW_SHOW
invoke SetForegroundWindow, hWnd
.endif
.elseif eax==WM_TASKBARCREATE
invoke _ModifyTrayIcon, hWnd, 2
.elseif eax==WM_CLOSE
invoke Shell_NotifyIcon, NIM_DELETE, addr g_nid
invoke KillTimer, hWnd, ID_TIMER1
invoke EndDialog, hWnd, 0
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
MainDlgProc endp
;对话框初始化过程
_Init proc hWnd:HWND
LOCAL systime : SYSTEMTIME
LOCAL osvi : OSVERSIONINFO
pushad
invoke LoadIcon, g_hInst, IDI_START
mov g_hIconStart, eax
invoke LoadIcon, g_hInst, IDI_MAIN
mov g_hIconMain, eax
invoke SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax
invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
;判断操作系统
invoke RtlZeroMemory, addr osvi, sizeof OSVERSIONINFO
mov osvi.dwOSVersionInfoSize, sizeof OSVERSIONINFO
invoke GetVersionEx, addr osvi
.if osvi.dwPlatformId==VER_PLATFORM_WIN32_NT
mov g_bSysNT, TRUE
.else
mov g_bSysNT, FALSE
.endif
invoke _ModifyTrayIcon, hWnd, 0
invoke GetDlgItem, hWnd, IDC_DATEPICKER
mov g_hDatePicker, eax
invoke GetDlgItem, hWnd, IDC_TIMEPICKER
mov g_hTimePicker, eax
invoke GetDlgItem, hWnd, IDC_TIME
mov g_hTime, eax
;取得当前时间,设置时间框
invoke GetLocalTime, addr systime
invoke SendMessage, g_hDatePicker, DTM_SETSYSTEMTIME, 0, addr systime
invoke SendMessage, g_hTimePicker, DTM_SETSYSTEMTIME, 0, addr systime
invoke RtlZeroMemory, addr g_systime, sizeof SYSTEMTIME
;创建一个字体,后面绘制左下角的标志时用到
invoke CreateFont, 16, 6, 0, 0, FW_NORMAL, FALSE, FALSE, 0, 0, 0, 0, 0, 0, CTXT("新宋体")
mov g_hFont, eax
;填充组合框,设定“休眠”和“关机”两个选项
invoke GetDlgItem, hWnd, IDC_SHUTDOWNTYPE
mov g_hCombobar, eax
invoke SendMessage, g_hCombobar, CB_ADDSTRING, 0, CTXT("关机")
.if g_bSysNT
invoke SendMessage, g_hCombobar, CB_ADDSTRING, 0, CTXT("休眠")
.endif
invoke SendMessage, g_hCombobar, CB_SETCURSEL, 0, 0
;没有设定时间
mov g_bTiming, FALSE
;Shell 在创建 Taskbar 时会发出 TaskbarCreated 消息
invoke RegisterWindowMessage, CTXT("TaskbarCreated")
mov WM_TASKBARCREATE, eax
popad
ret
_Init endp
;在左下角画一个标志
_Paint proc hWnd:HWND
LOCAL hdc : HDC
LOCAL ps : PAINTSTRUCT
LOCAL rect : RECT
LOCAL pt : POINT
pushad
;根据最左边的一个控件和最下边的一个控件来计算左下角的位置
invoke BeginPaint, hWnd, addr ps
mov hdc, eax
invoke GetDlgItem, hWnd, IDC_GROUP
mov ebx, eax
invoke GetWindowRect, ebx, addr rect
mov ebx, rect.left
invoke GetDlgItem, hWnd, IDC_MINIMIZE
mov esi, eax
invoke GetWindowRect, esi, addr rect
m2m pt.x, rect.left
m2m pt.y, rect.bottom
invoke ScreenToClient, hWnd, addr pt
m2m rect.right, pt.x
m2m rect.bottom, pt.y
m2m pt.x, ebx
m2m pt.y, rect.top
invoke ScreenToClient, hWnd, addr pt
m2m rect.left, pt.x
m2m rect.top, pt.y
;画上标志,用不同的颜色画两次,产生立体效果
invoke SetBkMode, hdc, TRANSPARENT
invoke SelectObject, hdc, g_hFont
invoke GetSysColor, COLOR_3DHILIGHT
invoke SetTextColor, hdc, eax
invoke DrawText, hdc, CTXT("版权所有 (C) 2000-2005 水手"), 27, addr rect, DT_VCENTER or DT_LEFT or DT_SINGLELINE
invoke GetSysColor, COLOR_3DSHADOW
invoke SetTextColor, hdc, eax
invoke OffsetRect, addr rect, -1, -1
invoke DrawText, hdc, CTXT("版权所有 (C) 2000-2005 水手"), 27, addr rect, DT_VCENTER or DT_LEFT or DT_SINGLELINE
invoke EndPaint, hWnd, addr ps
popad
ret
_Paint endp
;关机判断函数
_ShutDown proc iflag:DWORD
pushad
.if g_bSysNT ;Windows NT/2000/XP
.if iflag==0
;关机
invoke ResetNow,6
.else ;休眠
invoke ResetNow,3
.endif
.else ;Windows 98/95;关机
invoke ExitWindowsEx, EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF, 0
.endif
popad
ret
_ShutDown endp
CountDlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax, uMsg
.if eax==WM_INITDIALOG
invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
mov g_iCount, 15
invoke SetTimer, hWnd, ID_TIMER2, 1000, NULL
invoke SetDlgItemInt, hWnd, IDC_COUNT, g_iCount, FALSE
.elseif eax==WM_COMMAND
mov eax, wParam
and eax, 0ffffh
.if eax==IDC_START
invoke KillTimer, hWnd, ID_TIMER2
invoke EndDialog, hWnd, 1
.elseif eax==IDC_CANCEL
invoke KillTimer, hWnd, ID_TIMER2
invoke EndDialog, hWnd, 0
.endif
.elseif eax==WM_TIMER
dec g_iCount
invoke SetDlgItemInt, hWnd, IDC_COUNT, g_iCount, FALSE
.if g_iCount==0
invoke KillTimer, hWnd, ID_TIMER2
invoke EndDialog, hWnd, 1
.endif
.elseif eax==WM_CTLCOLORSTATIC
invoke GetDlgCtrlID, lParam
.if eax==IDC_COUNT
invoke SetTextColor, wParam, COLOR(255,0,0)
invoke GetSysColor, COLOR_BTNFACE
push eax
invoke SetBkColor, wParam, eax
call CreateSolidBrush
ret
.else
mov eax,FALSE
ret
.endif
.elseif eax==WM_CLOSE
invoke KillTimer, hWnd, ID_TIMER2
invoke EndDialog, hWnd, 1
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
CountDlgProc endp
;添加程序图标到系统托盘中
_ModifyTrayIcon proc hWnd:HWND, iFlag:DWORD
mov g_nid.cbSize, sizeof NOTIFYICONDATA
m2m g_nid.hwnd, hWnd
mov g_nid.uID, 0
mov g_nid.uFlags, NIF_ICON+NIF_MESSAGE+NIF_TIP
mov g_nid.uCallbackMessage, WM_ICONNOTIFY
.if iFlag==0 ;添加图标
.if g_bTiming
m2m g_nid.hIcon, g_hIconStart
invoke lstrcpy, addr g_nid.szTip, CTXT("定时关机小工具 ")
invoke lstrcat, addr g_nid.szTip, addr g_buf
.else
m2m g_nid.hIcon, g_hIconMain
invoke lstrcpy, addr g_nid.szTip, CTXT("定时关机小工具")
.endif
invoke Shell_NotifyIcon, NIM_ADD, addr g_nid
.elseif iFlag==1 ;修改图标,标志已定时
m2m g_nid.hIcon, g_hIconStart
invoke lstrcpy, addr g_nid.szTip, CTXT("定时关机小工具 ")
invoke lstrcat, addr g_nid.szTip, addr g_buf
invoke Shell_NotifyIcon, NIM_MODIFY, addr g_nid
.elseif iFlag==2 ;修改图标,标志未定时
m2m g_nid.hIcon, g_hIconMain
invoke lstrcpy, addr g_nid.szTip, CTXT("定时关机小工具")
invoke Shell_NotifyIcon, NIM_MODIFY, addr g_nid
.endif
ret
_ModifyTrayIcon endp
;关机函数
ResetNow proc iCode
local buf[256],pClose,pAdjust,hNtDll
invoke LoadLibrary,CTXT("NtDll.dll")
.if eax
mov hNtDll,eax
invoke GetProcAddress,hNtDll,CTXT("ZwInitiatePowerAction")
mov pClose,eax
invoke GetProcAddress,hNtDll,CTXT("RtlAdjustPrivilege")
mov pAdjust,eax
.if eax && pClose
lea eax,buf
push eax
push 1
push 1
push 13H
mov eax,pAdjust
call eax
.if eax==0C000007CH
lea eax,buf
push eax
push 0
push 1
push 13H
mov eax,pAdjust
call eax
.endif
push 0
push 0
push 5
push iCode ;关机方式:3 - 休眠, 6 - 关机
mov eax,pClose
call eax
.endif
.endif
ret
ResetNow endp
end start
#include "c:/masm32/include/resource.h"
;================================================================================
; 常量
;================================================================================
#define DLG_MAIN 1000
#define IDC_STATIC -1
#define IDC_GROUP 1001
#define IDC_DATEPICKER 1002
#define IDC_TIMEPICKER 1003
#define IDC_SHUTDOWNTYPE 1004
#define IDC_APPLY 1005
#define IDC_TIME 1006
#define IDC_MINIMIZE 1007
#define DLG_COUNT 1100
#define IDC_COUNT 1101
#define IDC_CANCEL 1102
#define IDC_START 1103
;================================================================================
; 图标资源
;================================================================================
#define IDI_MAIN 900
#define IDI_START 901
IDI_MAIN ICON "res//main.ico"
IDI_START ICON "res//start.ico"
1 24 "res//xptheme.xml"
;================================================================================
; 对话框资源
;================================================================================
DLG_MAIN DIALOG DISCARDABLE 0, 0, 202, 126
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "定时关机 v3.1 QQ:32301665"
FONT 9, "宋体"
BEGIN
GROUPBOX "设定关机参数",IDC_GROUP,9,9,184,86
LTEXT "日 期:",IDC_STATIC,20,28,28,8
CONTROL "DateTimePicker1",IDC_DATEPICKER,"SysDateTimePick32",
DTS_RIGHTALIGN | DTS_UPDOWN | WS_TABSTOP,60,25,58,13
LTEXT "时 间:",IDC_STATIC,20,52,28,8
CONTROL "DateTimePicker1",IDC_TIMEPICKER,"SysDateTimePick32",
DTS_RIGHTALIGN | DTS_UPDOWN | WS_TABSTOP | 0x8,60,50,58,
13
COMBOBOX IDC_SHUTDOWNTYPE,129,25,52,33,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "应用(&A)",IDC_APPLY,129,50,52,14
LTEXT "已设定:",IDC_STATIC,20,75,28,8
LTEXT "",IDC_TIME,62,75,121,8
DEFPUSHBUTTON "最小化(&M)",IDC_MINIMIZE,141,104,52,14
END
DLG_COUNT DIALOGEX 0, 0, 181, 85
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "关机倒计时"
FONT 9, "宋体"
BEGIN
ICON IDI_MAIN,IDC_STATIC,11,13,21,21
LTEXT "马上就要关机,如果你不想关机的话请按“取消”按钮。",
IDC_STATIC,51,11,120,17
LTEXT "倒计时:",IDC_STATIC,53,35,28,8
LTEXT "15",IDC_COUNT,87,35,14,8
LTEXT "秒",IDC_STATIC,104,35,10,8
LTEXT "",IDC_STATIC,9,52,164,1,SS_SUNKEN
DEFPUSHBUTTON "取消",IDC_CANCEL,129,64,44,14
PUSHBUTTON "立刻执行",IDC_START,9,64,44,14
END
1 VERSIONINFO
FILEVERSION 3,0,0,1
PRODUCTVERSION 3,0,0,1
FILEOS 0x10004
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "080404b0"
{
VALUE "Comments", "定时关机 v3.1"
VALUE "FileDescription", "定时关机 v3.1"
VALUE "InternalName", "定时关机/0"
VALUE "FileVersion", "3, 0, 0, 1"
VALUE "LegalCopyright", "版权所有 (c) 2000-2005年 水手 "
VALUE "ProductName", "定时关机"
VALUE "LegalTrademarks", "金盾 acactus QQ:32301665"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0804 0x04B0
}
}