| // 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. | |
| // func servicemain(argc uint32, argv **uint16) | |
| TEXT ·servicemain(SB),7,$0 | |
| MOVL argc+0(FP), AX | |
| MOVL AX, ·sArgc(SB) | |
| MOVL argv+4(FP), AX | |
| MOVL AX, ·sArgv(SB) | |
| PUSHL BP | |
| PUSHL BX | |
| PUSHL SI | |
| PUSHL DI | |
| SUBL $12, SP | |
| MOVL ·sName(SB), AX | |
| MOVL AX, (SP) | |
| MOVL $·servicectlhandler(SB), AX | |
| MOVL AX, 4(SP) | |
| // Set context to 123456 to test issue #25660. | |
| MOVL $123456, 8(SP) | |
| MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX | |
| MOVL SP, BP | |
| CALL AX | |
| MOVL BP, SP | |
| CMPL AX, $0 | |
| JE exit | |
| MOVL AX, ·ssHandle(SB) | |
| MOVL ·goWaitsH(SB), AX | |
| MOVL AX, (SP) | |
| MOVL ·cSetEvent(SB), AX | |
| MOVL SP, BP | |
| CALL AX | |
| MOVL BP, SP | |
| MOVL ·cWaitsH(SB), AX | |
| MOVL AX, (SP) | |
| MOVL $-1, AX | |
| MOVL AX, 4(SP) | |
| MOVL ·cWaitForSingleObject(SB), AX | |
| MOVL SP, BP | |
| CALL AX | |
| MOVL BP, SP | |
| exit: | |
| ADDL $12, SP | |
| POPL DI | |
| POPL SI | |
| POPL BX | |
| POPL BP | |
| MOVL 0(SP), CX | |
| ADDL $12, SP | |
| JMP CX | |
| // 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 | |
| MOVL ·ctlHandlerExProc(SB), CX | |
| JMP CX |