1package api
2
3import (
4	"golang.org/x/sys/windows"
5
6	"unsafe"
7)
8
9// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379284.aspx
10const (
11	NO_MULTIPLE_TRUSTEE = iota
12	TRUSTEE_IS_IMPERSONATE
13)
14
15// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379638.aspx
16const (
17	TRUSTEE_IS_SID = iota
18	TRUSTEE_IS_NAME
19	TRUSTEE_BAD_FORM
20	TRUSTEE_IS_OBJECTS_AND_SID
21	TRUSTEE_IS_OBJECTS_AND_NAME
22)
23
24// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379639.aspx
25const (
26	TRUSTEE_IS_UNKNOWN = iota
27	TRUSTEE_IS_USER
28	TRUSTEE_IS_GROUP
29	TRUSTEE_IS_DOMAIN
30	TRUSTEE_IS_ALIAS
31	TRUSTEE_IS_WELL_KNOWN_GROUP
32	TRUSTEE_IS_DELETED
33	TRUSTEE_IS_INVALID
34	TRUSTEE_IS_COMPUTER
35)
36
37// https://msdn.microsoft.com/en-us/library/windows/desktop/aa374899.aspx
38const (
39	NOT_USED_ACCESS = iota
40	GRANT_ACCESS
41	SET_ACCESS
42	DENY_ACCESS
43	REVOKE_ACCESS
44	SET_AUDIT_SUCCESS
45	SET_AUDIT_FAILURE
46)
47
48// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446627.aspx
49const (
50	NO_INHERITANCE                     = 0x0
51	SUB_OBJECTS_ONLY_INHERIT           = 0x1
52	SUB_CONTAINERS_ONLY_INHERIT        = 0x2
53	SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3
54	INHERIT_NO_PROPAGATE               = 0x4
55	INHERIT_ONLY                       = 0x8
56
57	OBJECT_INHERIT_ACE       = 0x1
58	CONTAINER_INHERIT_ACE    = 0x2
59	NO_PROPAGATE_INHERIT_ACE = 0x4
60	INHERIT_ONLY_ACE         = 0x8
61)
62
63var (
64	procSetEntriesInAclW = advapi32.MustFindProc("SetEntriesInAclW")
65)
66
67// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379636.aspx
68type Trustee struct {
69	MultipleTrustee          *Trustee
70	MultipleTrusteeOperation int32
71	TrusteeForm              int32
72	TrusteeType              int32
73	Name                     *uint16
74}
75
76// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446627.aspx
77type ExplicitAccess struct {
78	AccessPermissions uint32
79	AccessMode        int32
80	Inheritance       uint32
81	Trustee           Trustee
82}
83
84// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379576.aspx
85func SetEntriesInAcl(entries []ExplicitAccess, oldAcl windows.Handle, newAcl *windows.Handle) error {
86	ret, _, err := procSetEntriesInAclW.Call(
87		uintptr(len(entries)),
88		uintptr(unsafe.Pointer(&entries[0])),
89		uintptr(oldAcl),
90		uintptr(unsafe.Pointer(newAcl)),
91	)
92	if ret != 0 {
93		return err
94	}
95	return nil
96}
97