1// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// func servicemain(argc uint32, argv **uint16)
6TEXT ·servicemain(SB),7,$0
7	MOVL	argc+0(FP), AX
8	MOVL	AX, ·sArgc(SB)
9	MOVL	argv+4(FP), AX
10	MOVL	AX, ·sArgv(SB)
11
12	PUSHL	BP
13	PUSHL	BX
14	PUSHL	SI
15	PUSHL	DI
16
17	SUBL	$12, SP
18
19	MOVL	·sName(SB), AX
20	MOVL	AX, (SP)
21	MOVLservicectlhandler(SB), AX
22	MOVL	AX, 4(SP)
23	// Set context to 123456 to test issue #25660.
24	MOVL	$123456, 8(SP)
25	MOVL	·cRegisterServiceCtrlHandlerExW(SB), AX
26	MOVL	SP, BP
27	CALL	AX
28	MOVL	BP, SP
29	CMPL	AX, $0
30	JE	exit
31	MOVL	AX, ·ssHandle(SB)
32
33	MOVL	·goWaitsH(SB), AX
34	MOVL	AX, (SP)
35	MOVL	·cSetEvent(SB), AX
36	MOVL	SP, BP
37	CALL	AX
38	MOVL	BP, SP
39
40	MOVL	·cWaitsH(SB), AX
41	MOVL	AX, (SP)
42	MOVL	$-1, AX
43	MOVL	AX, 4(SP)
44	MOVL	·cWaitForSingleObject(SB), AX
45	MOVL	SP, BP
46	CALL	AX
47	MOVL	BP, SP
48
49exit:
50	ADDL	$12, SP
51
52	POPL	DI
53	POPL	SI
54	POPL	BX
55	POPL	BP
56
57	MOVL	0(SP), CX
58	ADDL	$12, SP
59	JMP	CX
60
61// I do not know why, but this seems to be the only way to call
62// ctlHandlerProc on Windows 7.
63
64// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr {
65TEXT ·servicectlhandler(SB),7,$0
66	MOVL	·ctlHandlerExProc(SB), CX
67	JMP	CX
68