| // Copyright 2016 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. | 
 |  | 
 | package windows | 
 |  | 
 | import ( | 
 | 	"syscall" | 
 | 	"unsafe" | 
 | ) | 
 |  | 
 | const ( | 
 | 	SecurityAnonymous      = 0 | 
 | 	SecurityIdentification = 1 | 
 | 	SecurityImpersonation  = 2 | 
 | 	SecurityDelegation     = 3 | 
 | ) | 
 |  | 
 | //sys	ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf | 
 | //sys	RevertToSelf() (err error) = advapi32.RevertToSelf | 
 |  | 
 | const ( | 
 | 	TOKEN_ADJUST_PRIVILEGES = 0x0020 | 
 | 	SE_PRIVILEGE_ENABLED    = 0x00000002 | 
 | ) | 
 |  | 
 | type LUID struct { | 
 | 	LowPart  uint32 | 
 | 	HighPart int32 | 
 | } | 
 |  | 
 | type LUID_AND_ATTRIBUTES struct { | 
 | 	Luid       LUID | 
 | 	Attributes uint32 | 
 | } | 
 |  | 
 | type TOKEN_PRIVILEGES struct { | 
 | 	PrivilegeCount uint32 | 
 | 	Privileges     [1]LUID_AND_ATTRIBUTES | 
 | } | 
 |  | 
 | //sys	OpenThreadToken(h syscall.Handle, access uint32, openasself bool, token *syscall.Token) (err error) = advapi32.OpenThreadToken | 
 | //sys	LookupPrivilegeValue(systemname *uint16, name *uint16, luid *LUID) (err error) = advapi32.LookupPrivilegeValueW | 
 | //sys	adjustTokenPrivileges(token syscall.Token, disableAllPrivileges bool, newstate *TOKEN_PRIVILEGES, buflen uint32, prevstate *TOKEN_PRIVILEGES, returnlen *uint32) (ret uint32, err error) [true] = advapi32.AdjustTokenPrivileges | 
 |  | 
 | func AdjustTokenPrivileges(token syscall.Token, disableAllPrivileges bool, newstate *TOKEN_PRIVILEGES, buflen uint32, prevstate *TOKEN_PRIVILEGES, returnlen *uint32) error { | 
 | 	ret, err := adjustTokenPrivileges(token, disableAllPrivileges, newstate, buflen, prevstate, returnlen) | 
 | 	if ret == 0 { | 
 | 		// AdjustTokenPrivileges call failed | 
 | 		return err | 
 | 	} | 
 | 	// AdjustTokenPrivileges call succeeded | 
 | 	if err == syscall.EINVAL { | 
 | 		// GetLastError returned ERROR_SUCCESS | 
 | 		return nil | 
 | 	} | 
 | 	return err | 
 | } | 
 |  | 
 | //sys DuplicateTokenEx(hExistingToken syscall.Token, dwDesiredAccess uint32, lpTokenAttributes *syscall.SecurityAttributes, impersonationLevel uint32, tokenType TokenType, phNewToken *syscall.Token) (err error) = advapi32.DuplicateTokenEx | 
 | //sys SetTokenInformation(tokenHandle syscall.Token, tokenInformationClass uint32, tokenInformation uintptr, tokenInformationLength uint32) (err error) = advapi32.SetTokenInformation | 
 |  | 
 | type SID_AND_ATTRIBUTES struct { | 
 | 	Sid        *syscall.SID | 
 | 	Attributes uint32 | 
 | } | 
 |  | 
 | type TOKEN_MANDATORY_LABEL struct { | 
 | 	Label SID_AND_ATTRIBUTES | 
 | } | 
 |  | 
 | func (tml *TOKEN_MANDATORY_LABEL) Size() uint32 { | 
 | 	return uint32(unsafe.Sizeof(TOKEN_MANDATORY_LABEL{})) + syscall.GetLengthSid(tml.Label.Sid) | 
 | } | 
 |  | 
 | const SE_GROUP_INTEGRITY = 0x00000020 | 
 |  | 
 | type TokenType uint32 | 
 |  | 
 | const ( | 
 | 	TokenPrimary       TokenType = 1 | 
 | 	TokenImpersonation TokenType = 2 | 
 | ) | 
 |  | 
 | //sys	GetProfilesDirectory(dir *uint16, dirLen *uint32) (err error) = userenv.GetProfilesDirectoryW | 
 |  | 
 | const ( | 
 | 	LG_INCLUDE_INDIRECT  = 0x1 | 
 | 	MAX_PREFERRED_LENGTH = 0xFFFFFFFF | 
 | ) | 
 |  | 
 | type LocalGroupUserInfo0 struct { | 
 | 	Name *uint16 | 
 | } | 
 |  | 
 | type UserInfo4 struct { | 
 | 	Name            *uint16 | 
 | 	Password        *uint16 | 
 | 	PasswordAge     uint32 | 
 | 	Priv            uint32 | 
 | 	HomeDir         *uint16 | 
 | 	Comment         *uint16 | 
 | 	Flags           uint32 | 
 | 	ScriptPath      *uint16 | 
 | 	AuthFlags       uint32 | 
 | 	FullName        *uint16 | 
 | 	UsrComment      *uint16 | 
 | 	Parms           *uint16 | 
 | 	Workstations    *uint16 | 
 | 	LastLogon       uint32 | 
 | 	LastLogoff      uint32 | 
 | 	AcctExpires     uint32 | 
 | 	MaxStorage      uint32 | 
 | 	UnitsPerWeek    uint32 | 
 | 	LogonHours      *byte | 
 | 	BadPwCount      uint32 | 
 | 	NumLogons       uint32 | 
 | 	LogonServer     *uint16 | 
 | 	CountryCode     uint32 | 
 | 	CodePage        uint32 | 
 | 	UserSid         *syscall.SID | 
 | 	PrimaryGroupID  uint32 | 
 | 	Profile         *uint16 | 
 | 	HomeDirDrive    *uint16 | 
 | 	PasswordExpired uint32 | 
 | } | 
 |  | 
 | //sys	NetUserGetLocalGroups(serverName *uint16, userName *uint16, level uint32, flags uint32, buf **byte, prefMaxLen uint32, entriesRead *uint32, totalEntries *uint32) (neterr error) = netapi32.NetUserGetLocalGroups |