dnscrypt-proxy/vendor/github.com/hectane/go-acl/api/secinfo.go

85 lines
2.4 KiB
Go

//+build windows
package api
import (
"golang.org/x/sys/windows"
"unsafe"
)
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379593.aspx
const (
SE_UNKNOWN_OBJECT_TYPE = iota
SE_FILE_OBJECT
SE_SERVICE
SE_PRINTER
SE_REGISTRY_KEY
SE_LMSHARE
SE_KERNEL_OBJECT
SE_WINDOW_OBJECT
SE_DS_OBJECT
SE_DS_OBJECT_ALL
SE_PROVIDER_DEFINED_OBJECT
SE_WMIGUID_OBJECT
SE_REGISTRY_WOW64_32KEY
)
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379573.aspx
const (
OWNER_SECURITY_INFORMATION = 0x00001
GROUP_SECURITY_INFORMATION = 0x00002
DACL_SECURITY_INFORMATION = 0x00004
SACL_SECURITY_INFORMATION = 0x00008
LABEL_SECURITY_INFORMATION = 0x00010
ATTRIBUTE_SECURITY_INFORMATION = 0x00020
SCOPE_SECURITY_INFORMATION = 0x00040
PROCESS_TRUST_LABEL_SECURITY_INFORMATION = 0x00080
BACKUP_SECURITY_INFORMATION = 0x10000
PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000
PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000
UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000
UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000
)
var (
procGetNamedSecurityInfoW = advapi32.MustFindProc("GetNamedSecurityInfoW")
procSetNamedSecurityInfoW = advapi32.MustFindProc("SetNamedSecurityInfoW")
)
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446645.aspx
func GetNamedSecurityInfo(objectName string, objectType int32, secInfo uint32, owner, group **windows.SID, dacl, sacl, secDesc *windows.Handle) error {
ret, _, err := procGetNamedSecurityInfoW.Call(
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(objectName))),
uintptr(objectType),
uintptr(secInfo),
uintptr(unsafe.Pointer(owner)),
uintptr(unsafe.Pointer(group)),
uintptr(unsafe.Pointer(dacl)),
uintptr(unsafe.Pointer(sacl)),
uintptr(unsafe.Pointer(secDesc)),
)
if ret != 0 {
return err
}
return nil
}
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379579.aspx
func SetNamedSecurityInfo(objectName string, objectType int32, secInfo uint32, owner, group *windows.SID, dacl, sacl windows.Handle) error {
ret, _, err := procSetNamedSecurityInfoW.Call(
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(objectName))),
uintptr(objectType),
uintptr(secInfo),
uintptr(unsafe.Pointer(owner)),
uintptr(unsafe.Pointer(group)),
uintptr(dacl),
uintptr(sacl),
)
if ret != 0 {
return err
}
return nil
}