📄 natservice.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Windows NT 服务程序模板
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\AdvApi32.inc
include <..\DLL\Common\ftNetwork.inc>
include <..\DLL\Common\ftService.inc>
include \masm32\include\user32.inc
include <..\DLL\Normal\macro.inc>
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\AdvApi32.lib
includelib <..\DLL\Common\ftNetwork.lib>
includelib <..\DLL\Common\ftService.lib>
includelib \masm32\lib\user32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
dwIsRunning dd 0
szServiceName db 'NetRPC',0 ;在这里定义服务的名称
szDisplayName db 'Network RPC',0 ;在这里定义服务显示的名称
szInstall db '/Install',0
szUnInstall db '/UnInstall',0
szCmdLine db 128 dup (0) ;程序参数
.data?
stSS SERVICE_STATUS <> ;服务的状态
hSS dd ? ;服务的状态句柄
dwOption dd ?
F_STOP equ 0001h ;停止服务
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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
;********************************************************************
; 服务的具体执行代码
; 在这里是每隔10秒钟检查一次服务状态
;********************************************************************
.repeat
.if !dwIsRunning
mov dwIsRunning,TRUE
invoke _StartServer
.endif
invoke Sleep,10000
.until dwOption & F_STOP
invoke _StopServer
mov dwIsRunning,FALSE
popad
ret
_ServiceMain endp
_GetArgv PROC _szCmdLine:DWORD,_szArgv:DWORD
mov esi,_szCmdLine
mov al,'A'
.while al!=20h && al!=0
mov al,byte ptr [esi]
inc esi
.endw
mov edi,_szArgv
.while al!=0
mov al,byte ptr [esi]
mov byte ptr [edi],al
inc esi
inc edi
.endw
ret
_GetArgv endp
_InstallSrv PROC
LOCAL @szModule[MAX_PATH]:byte,@dwPtrFileName
invoke GetModuleFileName,NULL,addr @szModule,MAX_PATH
invoke _InitService
invoke _DeleteService,addr szServiceName
invoke _InstallService,addr szServiceName,addr szDisplayName,addr @szModule
.if eax==1
invoke MessageBox,NULL,CTEXT("服务安装成功!"),CTEXT("提示"),MB_OK
.elseif eax==0c0000001h
invoke MessageBox,NULL,CTEXT("无法创建服务!"),CTEXT("提示"),MB_OK
.elseif eax==0c0000002h
invoke MessageBox,NULL,CTEXT("存在重名服务!"),CTEXT("提示"),MB_OK
.endif
invoke _QuitService
ret
_InstallSrv endp
_UnInstallSrv PROC
LOCAL @szModule[MAX_PATH]:byte,@dwPtrFileName
invoke GetModuleFileName,NULL,addr @szModule,MAX_PATH
invoke _InitService
invoke _DeleteService,addr szServiceName
.if eax==0c0000006h
invoke MessageBox,NULL,CTEXT("无法和服务相连接!"),CTEXT("提示"),MB_OK
.elseif eax==000000003h
invoke MessageBox,NULL,CTEXT("删除服务成功!"),CTEXT("提示"),MB_OK
.elseif eax==0c0000003h
invoke MessageBox,NULL,CTEXT("无法删除服务!"),CTEXT("提示"),MB_OK
.endif
invoke _QuitService
ret
_UnInstallSrv endp
_WinMain PROC ;主程序
LOCAL @stSTE[2]:SERVICE_TABLE_ENTRY
mov dwIsRunning,FALSE
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 GetCommandLine
invoke _GetArgv,eax,addr szCmdLine
invoke lstrcmpi,addr szInstall,addr szCmdLine
.if eax==0
invoke _InstallSrv
jmp @F
.else
invoke lstrcmpi,addr szUnInstall,addr szCmdLine
.if eax==0
invoke _UnInstallSrv
jmp @F
.endif
.endif
invoke _WinMain
@@:
invoke ExitProcess,NULL
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -