首页
社区
课程
招聘
[求助]关于服务中的循环无法执行
发表于: 2008-5-25 21:50 3822

[求助]关于服务中的循环无法执行

2008-5-25 21:50
3822
学习服务的时候,引用老罗的一段代码学习时,碰到了一个奇怪的问题
服务已经成功登记,并且在重新启动后,成功运行(启动计算器)
但是服务中的一个循环不执行:(我觉得并没有执行到这一段似的)
.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直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习中,还看不懂
2008-5-26 14:50
0
游客
登录 | 注册 方可回帖
返回
//