| // Copyright 2012 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build windows |
| |
| // func servicemain(argc uint32, argv **uint16) |
| TEXT ·servicemain(SB),7,$0 |
| MOVL CX, ·sArgc(SB) |
| MOVQ DX, ·sArgv(SB) |
| |
| SUBQ $32, SP // stack for the first 4 syscall params |
| |
| MOVQ ·sName(SB), CX |
| MOVQ $·servicectlhandler(SB), DX |
| // BUG(pastarmovj): Figure out a way to pass in context in R8. |
| // Set context to 123456 to test issue #25660. |
| MOVQ $123456, R8 |
| MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX |
| CALL AX |
| CMPQ AX, $0 |
| JE exit |
| MOVQ AX, ·ssHandle(SB) |
| |
| MOVQ ·goWaitsH(SB), CX |
| MOVQ ·cSetEvent(SB), AX |
| CALL AX |
| |
| MOVQ ·cWaitsH(SB), CX |
| MOVQ $4294967295, DX |
| MOVQ ·cWaitForSingleObject(SB), AX |
| CALL AX |
| |
| exit: |
| ADDQ $32, SP |
| RET |
| |
| // I do not know why, but this seems to be the only way to call |
| // ctlHandlerProc on Windows 7. |
| |
| // func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { |
| TEXT ·servicectlhandler(SB),7,$0 |
| MOVQ ·ctlHandlerExProc(SB), AX |
| JMP AX |