学习服务的时候,引用老罗的一段代码学习时,碰到了一个奇怪的问题
服务已经成功登记,并且在重新启动后,成功运行(启动计算器)
但是服务中的一个循环不执行:(我觉得并没有执行到这一段似的)
.repeat
invoke MessageBox,NULL,addr szhh,addr szcc,MB_YESNO
invoke Sleep,1000
.until dwOption & F_STOP
-----------------------------------------------------------------------------------------
以下是代码:
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include AdvApi32.inc
includelib AdvApi32.lib
; 数据段
.data?
stSS SERVICE_STATUS <> ;服务的状态
hSS dd ? ;服务的状态句柄
dwOption dd ?
F_STOP equ 0001h ;停止服务
@dwReturn dd ?
@hService dd ?
hSCM dd ?
.const
szhh db 'asd',0
szcc db 'cvcx',0
szServiceEXE db 'Service.exe',0 ;在这里定义运行服务的 exe 文件名
szServiceName db 'ServiceTemplate',0 ;在这里定义服务的名称
szDisplayName db 'Service Template for test',0 ;在这里定义服务显示的名称
szServiceFile db 'C:\\WINDOWS\\system32\\calc.exe',0 ;打开计算器
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务控制程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcHandler proc _dwControl
pushad
mov eax,_dwControl
.if eax == SERVICE_CONTROL_STOP
;or dwOption,F_STOP
mov stSS.dwCurrentState,SERVICE_STOPPED
invoke SetServiceStatus,hSS,addr stSS
.elseif eax == SERVICE_CONTROL_INTERROGATE
invoke SetServiceStatus,hSS,addr stSS
.endif
popad
ret
_ProcHandler endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ServiceMain proc _dwArgc,_lpszArgv
pushad
invoke RegisterServiceCtrlHandler,addr szServiceName,offset _ProcHandler
mov hSS,eax
mov stSS.dwServiceType,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS
mov stSS.dwCurrentState,SERVICE_START_PENDING
mov stSS.dwControlsAccepted,SERVICE_ACCEPT_STOP
mov stSS.dwWin32ExitCode,NO_ERROR
invoke SetServiceStatus,hSS,addr stSS
;********************************************************************
; 如果初始化代码比较多,那么需要首先把状态设置为 pending,等完成以后
; 再设置为 Running。(在这里加入初始化代码)
;********************************************************************
mov stSS.dwCurrentState,SERVICE_RUNNING
invoke SetServiceStatus,hSS,addr stSS
;********************************************************************
; 服务的具体执行代码
;********************************************************************
.repeat
invoke MessageBox,NULL,addr szhh,addr szcc,MB_YESNO
invoke Sleep,1000
.until dwOption & F_STOP
popad
ret
_ServiceMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stSTE[2]:SERVICE_TABLE_ENTRY
invoke RtlZeroMemory,addr @stSTE,sizeof @stSTE
mov @stSTE[0].lpServiceName,offset szServiceName
mov @stSTE[0].lpServiceProc,offset _ServiceMain
invoke StartServiceCtrlDispatcher,addr @stSTE
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
mov hSCM,eax
; 创建服务
;********************************************************************
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,TRUE
.else
mov @dwReturn,FALSE
.endif
jmp @F
.endif
mov @hService,eax
mov @dwReturn,TRUE
invoke CloseServiceHandle,@hService
@@:
mov eax,@dwReturn
;invoke MessageBox,NULL,addr szhh,addr szcc,MB_YESNO
invoke _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
大家帮看看是哪有问题呢?
先谢谢拉
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课