📄 akcontrol.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务程序控制端
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
include /masm32/include/windows.inc
include /masm32/include/user32.inc
includelib /masm32/lib/user32.lib
include /masm32/include/kernel32.inc
includelib /masm32/lib/kernel32.lib
include /masm32/include/AdvApi32.inc
includelib /masm32/lib/AdvApi32.lib
ICO_MAIN equ 1000
DLG_MAIN equ 1000
IDC_INSTALL equ 1001
IDC_DELETE equ 1002
IDC_START equ 1003
IDC_STOP equ 1004
IDC_INFO equ 1005
IDC_FILE equ 1006
IDC_INFO_INSTALL equ 1007
IDC_INFO_STATUS equ 1008
IDC_REFRESH equ 1009
.data?
hWinMain dd ?
hInstance dd ?
hSCM dd ?
szServiceFile db MAX_PATH dup (?) ;全路径的服务 exe 文件名
.const
szInstalled db '已安装',0
szNotInstalled db '未安装',0
szStarted db '已启动',0
szStoped db '已停止',0
szOther db '其他状态',0
;********************************************************************
ERR_CREATE_OK equ 000000001h ;创建服务成功
ERR_CREATE equ 0c0000001h ;无法创建服务
ERR_CREATE_DUP equ 0c0000002h ;存在重名服务
ERR_DELETE_OK equ 000000003h ;删除服务成功
ERR_DELETE equ 0c0000003h ;无法删除服务
ERR_START_OK equ 000000004h ;启动成功
ERR_START equ 0c0000004h ;启动失败
ERR_STOP_OK equ 000000005h ;停止成功
ERR_STOP equ 0c0000005h ;停止失败
ERR_CONNECT equ 0c0000006h ;无法和服务相连接
;********************************************************************
szErrCreateOK db '创建服务成功!',0
szErrCreate db '无法创建服务!',0
szErrCreateDup db '重名服务已经存在!',0
szErrDeleteOK db '删除服务成功!',0
szErrDelete db '无法删除服务!',0
szErrStartOK db '启动服务成功!',0
szErrStart db '启动服务失败!',0
szErrStopOK db '停止服务成功!',0
szErrStop db '停止服务失败!',0
szErrSCM db '无法和服务管理器连接!',0
szErrConnect db '无法找到服务!',0
szErrUnknown db '未知错误!',0
include <Define.inc>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 显示错误信息
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowInfo proc _dwErrCode
mov eax,_dwErrCode
.if ! eax
mov eax,NULL
.elseif eax == ERR_CREATE
mov eax,offset szErrCreate
.elseif eax == ERR_CREATE_DUP
mov eax,offset szErrCreateDup
.elseif eax == ERR_CREATE_OK
mov eax,offset szErrCreateOK
.elseif eax == ERR_DELETE
mov eax,offset szErrDelete
.elseif eax == ERR_DELETE_OK
mov eax,offset szErrDeleteOK
.elseif eax == ERR_START_OK
mov eax,offset szErrStartOK
.elseif eax == ERR_START
mov eax,offset szErrStart
.elseif eax == ERR_STOP_OK
mov eax,offset szErrStopOK
.elseif eax == ERR_STOP
mov eax,offset szErrStop
.elseif eax == ERR_CONNECT
mov eax,offset szErrConnect
.else
mov eax,offset szErrUnknown
.endif
invoke SetDlgItemText,hWinMain,IDC_INFO,eax
ret
_ShowInfo endp
_ShowStatus proc _ErrCode
local @hService
local @stStatus:SERVICE_STATUS
local @lpInstall,@lpStatus
local @dwStatIns,@dwStatDel,@dwStatStart,@dwStatStop
invoke _ShowInfo,_ErrCode
invoke Sleep,500
;********************************************************************
; 打开服务
;********************************************************************
invoke OpenService,hSCM,addr szServiceName,SERVICE_ALL_ACCESS
.if eax
mov @hService,eax
mov @lpInstall,offset szInstalled
mov @dwStatIns,FALSE
mov @dwStatDel,TRUE
;********************************************************************
; 获取状态
;********************************************************************
invoke QueryServiceStatus,@hService,addr @stStatus
mov eax,@stStatus.dwCurrentState
.if eax == SERVICE_RUNNING
mov @lpStatus,offset szStarted
mov @dwStatStart,FALSE
mov @dwStatStop,TRUE
.elseif eax == SERVICE_STOPPED
mov @lpStatus,offset szStoped
mov @dwStatStart,TRUE
mov @dwStatStop,FALSE
.else
mov @lpStatus,offset szOther
mov @dwStatStart,FALSE
mov @dwStatStop,FALSE
.endif
invoke CloseServiceHandle,@hService
.else
invoke GetLastError
.if eax == ERROR_ACCESS_DENIED
mov @lpInstall,offset szInstalled
mov @dwStatIns,FALSE
mov @dwStatDel,TRUE
.else
mov @lpInstall,offset szNotInstalled
mov @dwStatIns,TRUE
mov @dwStatDel,FALSE
.endif
mov @dwStatStart,FALSE
mov @dwStatStop,FALSE
mov @lpStatus,offset szStoped
.endif
;********************************************************************
; 显示状态
;********************************************************************
invoke SetDlgItemText,hWinMain,IDC_INFO_INSTALL,@lpInstall
invoke SetDlgItemText,hWinMain,IDC_INFO_STATUS,@lpStatus
invoke GetDlgItem,hWinMain,IDC_INSTALL
invoke EnableWindow,eax,@dwStatIns
invoke GetDlgItem,hWinMain,IDC_DELETE
invoke EnableWindow,eax,@dwStatDel
invoke GetDlgItem,hWinMain,IDC_START
invoke EnableWindow,eax,@dwStatStart
invoke GetDlgItem,hWinMain,IDC_STOP
invoke EnableWindow,eax,@dwStatStop
ret
_ShowStatus endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 取当前服务的可执行文件名
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetServiceFile proc
local @szModule[MAX_PATH]:byte,@dwPtrFileName
invoke GetModuleFileName,NULL,addr @szModule,MAX_PATH
invoke GetFullPathName,addr @szModule,MAX_PATH,\
addr szServiceFile,addr @dwPtrFileName
mov eax,@dwPtrFileName
mov byte ptr [eax],0
invoke lstrcat,addr szServiceFile,addr szServiceEXE
ret
_GetServiceFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 安装服务
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_InstallService proc
local @hService,@dwReturn
mov @dwReturn,0
;********************************************************************
; 创建服务
;********************************************************************
invoke CreateService,hSCM,addr szServiceName,addr szDisplayName,\
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,\
SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,addr szServiceFile,\
NULL,NULL,NULL,NULL,NULL
.if ! eax
invoke GetLastError
.if eax == ERROR_DUP_NAME || eax == ERROR_SERVICE_EXISTS
mov @dwReturn,ERR_CREATE_DUP
.else
mov @dwReturn,ERR_CREATE
.endif
jmp @F
.endif
mov @hService,eax
mov @dwReturn,ERR_CREATE_OK
invoke CloseServiceHandle,@hService
@@:
mov eax,@dwReturn
ret
_InstallService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 删除服务
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DeleteService proc
local @hService,@dwReturn
local @stStatus:SERVICE_STATUS
mov @dwReturn,0
;********************************************************************
; 打开服务
;********************************************************************
invoke OpenService,hSCM,addr szServiceName,SERVICE_ALL_ACCESS
.if ! eax
mov @dwReturn,ERR_CONNECT
jmp @F
.endif
mov @hService,eax
;********************************************************************
; 停止服务并删除服务
;********************************************************************
call _StopService
invoke DeleteService,@hService
.if eax
mov @dwReturn,ERR_DELETE_OK
.else
mov @dwReturn,ERR_DELETE
.endif
invoke CloseServiceHandle,@hService
@@:
mov eax,@dwReturn
ret
_DeleteService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 启动服务
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_StartService proc
local @hService
invoke OpenService,hSCM,addr szServiceName,SERVICE_START
.if eax
mov @hService,eax
invoke StartService,@hService,0,NULL
.if eax
mov eax,ERR_START_OK
.else
mov eax,ERR_START
.endif
push eax
invoke CloseServiceHandle,@hService
pop eax
.else
mov eax,ERR_CONNECT
.endif
ret
_StartService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 停止服务
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_StopService proc
local @hService
local @stStatus:SERVICE_STATUS
invoke OpenService,hSCM,addr szServiceName,SERVICE_ALL_ACCESS
.if eax
mov @hService,eax
invoke QueryServiceStatus,@hService,addr @stStatus
invoke ControlService,@hService,SERVICE_CONTROL_STOP,addr @stStatus
.if eax
mov eax,ERR_STOP_OK
.else
mov eax,ERR_STOP
.endif
push eax
invoke CloseServiceHandle,@hService
pop eax
.else
mov eax,ERR_CONNECT
.endif
ret
_StopService endp
_Init proc
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWinMain,WM_SETICON,ICON_BIG,eax
invoke _GetServiceFile
invoke SetDlgItemText,hWinMain,IDC_FILE,addr szServiceFile
;********************************************************************
; 连接服务管理器
;********************************************************************
invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
.if ! eax
invoke MessageBox,hWinMain,addr szErrSCM,NULL,MB_OK
invoke EndDialog,hWinMain,NULL
ret
.endif
mov hSCM,eax
invoke _ShowStatus,NULL
ret
_Init endp
_Quit proc
invoke CloseServiceHandle,hSCM
invoke EndDialog,hWinMain,NULL
ret
_Quit endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
call _Quit
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
call _Init
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDC_INSTALL
invoke _InstallService
invoke _ShowStatus,eax
.elseif ax == IDC_DELETE
invoke _DeleteService
invoke _ShowStatus,eax
.elseif ax == IDC_START
invoke _StartService
invoke _ShowStatus,eax
.elseif ax == IDC_STOP
invoke _StopService
invoke _ShowStatus,eax
.elseif ax == IDC_REFRESH
invoke _ShowStatus,NULL
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -