⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 natservice.asm

📁 Socket转发的后台服务ASM源代码
💻 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 + -