首页
社区
课程
招聘
[求助]为何服务启动一段时间后就停止了?
发表于: 2008-6-8 19:58 3371

[求助]为何服务启动一段时间后就停止了?

2008-6-8 19:58
3371
如题,怎么样才能让服务一直保持开启状态?
以下是本人修改老罗的代码得到的,可是达不到想要的效果,望高手相助!
完整代码在附件中

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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                ;停止服务
hSC           dd        ?
hService   dd   ?

       
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
include        Control.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务控制程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcHandler        proc        _dwControl

                pushad
                mov        eax,_dwControl
                ;SERVICE_STATUS结构含有七个成员,它们反映服务的现行状态。下面仅例举三个
                ;我看不出另外几个状态对启动的影响,是不是我的想法错了
                .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

                .if     eax==SERVICE_CONTROL_CONTINUE
                mov     stSS.dwCurrentState,SERVICE_RUNNING     ;这里设置当前服务状态
                invoke        SetServiceStatus,hSS,addr stSS
                .endif
               
                popad
                ret

_ProcHandler        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;_ServiceMain        proc        _dwArgc,_lpszArgv不知道这两个参数用来干什么,也不见在子程序用到
_ServiceMain        proc       
                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
;********************************************************************
; 服务的具体执行代码
; 在这里是每隔1秒种让喇叭发声
;********************************************************************
                .repeat
                        invoke        MessageBeep,-1
                        invoke        Sleep,1000
                .until        dwOption & F_STOP
                popad
                ret

_ServiceMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain        proc
                local        @stSTE[0]:SERVICE_TABLE_ENTRY

                invoke        RtlZeroMemory,addr @stSTE,sizeof @stSTE
                mov        @stSTE[0].lpServiceName,offset szServiceName
                mov        @stSTE[0].lpServiceProc,offset _ServiceMain    ;指向_ServiceMain子程序
                invoke        StartServiceCtrlDispatcher,addr @stSTE         ;运行_ServiceMain子程序
                ret

_WinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
mov  hSC,eax
; 创建服务
;###################################################################################
invoke _InstallService
invoke _StartService                       ;启动服务
                invoke        _WinMain
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//