mirror of
				https://github.com/therootcompany/pathman.git
				synced 2025-10-31 13:02:47 +00:00 
			
		
		
		
	Bump golang.org/x/sys from 0.0.0-20190712062909-fae7ac547cb7 to 0.1.0
Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.0.0-20190712062909-fae7ac547cb7 to 0.1.0. - [Release notes](https://github.com/golang/sys/releases) - [Commits](https://github.com/golang/sys/commits/v0.1.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
		
							parent
							
								
									2c283a2864
								
							
						
					
					
						commit
						f776084fc1
					
				
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -4,5 +4,5 @@ go 1.12 | |||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	git.rootprojects.org/root/go-gitver v1.1.3 | 	git.rootprojects.org/root/go-gitver v1.1.3 | ||||||
| 	golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 | 	golang.org/x/sys v0.1.0 | ||||||
| ) | ) | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| git.rootprojects.org/root/go-gitver v1.1.3 h1:/qR9z53vY+IFhWRxLkF9cjaiWh8xRJIm6gyuW+MG81A= | git.rootprojects.org/root/go-gitver v1.1.3 h1:/qR9z53vY+IFhWRxLkF9cjaiWh8xRJIm6gyuW+MG81A= | ||||||
| git.rootprojects.org/root/go-gitver v1.1.3/go.mod h1:Rj1v3TBhvdaSphFEqMynUYwAz/4f+wY/+syBTvRrmlI= | git.rootprojects.org/root/go-gitver v1.1.3/go.mod h1:Rj1v3TBhvdaSphFEqMynUYwAz/4f+wY/+syBTvRrmlI= | ||||||
| golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI= | golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= | ||||||
| golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/sys/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/sys/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | |||||||
| # This source code refers to The Go Authors for copyright purposes. |  | ||||||
| # The master list of authors is in the main Go distribution, |  | ||||||
| # visible at http://tip.golang.org/AUTHORS. |  | ||||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/sys/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/sys/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | |||||||
| # This source code was written by the Go contributors. |  | ||||||
| # The master list of contributors is in the main Go distribution, |  | ||||||
| # visible at http://tip.golang.org/CONTRIBUTORS. |  | ||||||
							
								
								
									
										30
									
								
								vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | // Copyright 2020 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 unsafeheader contains header declarations for the Go runtime's | ||||||
|  | // slice and string implementations. | ||||||
|  | // | ||||||
|  | // This package allows x/sys to use types equivalent to | ||||||
|  | // reflect.SliceHeader and reflect.StringHeader without introducing | ||||||
|  | // a dependency on the (relatively heavy) "reflect" package. | ||||||
|  | package unsafeheader | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Slice is the runtime representation of a slice. | ||||||
|  | // It cannot be used safely or portably and its representation may change in a later release. | ||||||
|  | type Slice struct { | ||||||
|  | 	Data unsafe.Pointer | ||||||
|  | 	Len  int | ||||||
|  | 	Cap  int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // String is the runtime representation of a string. | ||||||
|  | // It cannot be used safely or portably and its representation may change in a later release. | ||||||
|  | type String struct { | ||||||
|  | 	Data unsafe.Pointer | ||||||
|  | 	Len  int | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/windows/aliases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/windows/aliases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,8 +2,8 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
| // +build windows | //go:build windows && go1.9 | ||||||
| // +build go1.9 | // +build windows,go1.9 | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_386.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_386.s
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,13 +0,0 @@ | |||||||
| // Copyright 2009 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. |  | ||||||
| 
 |  | ||||||
| // |  | ||||||
| // System calls for 386, Windows are implemented in runtime/syscall_windows.goc |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| TEXT ·getprocaddress(SB), 7, $0-16 |  | ||||||
| 	JMP	syscall·getprocaddress(SB) |  | ||||||
| 
 |  | ||||||
| TEXT ·loadlibrary(SB), 7, $0-12 |  | ||||||
| 	JMP	syscall·loadlibrary(SB) |  | ||||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,13 +0,0 @@ | |||||||
| // Copyright 2009 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. |  | ||||||
| 
 |  | ||||||
| // |  | ||||||
| // System calls for amd64, Windows are implemented in runtime/syscall_windows.goc |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| TEXT ·getprocaddress(SB), 7, $0-32 |  | ||||||
| 	JMP	syscall·getprocaddress(SB) |  | ||||||
| 
 |  | ||||||
| TEXT ·loadlibrary(SB), 7, $0-24 |  | ||||||
| 	JMP	syscall·loadlibrary(SB) |  | ||||||
							
								
								
									
										11
									
								
								vendor/golang.org/x/sys/windows/asm_windows_arm.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/golang.org/x/sys/windows/asm_windows_arm.s
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,11 +0,0 @@ | |||||||
| // Copyright 2018 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. |  | ||||||
| 
 |  | ||||||
| #include "textflag.h" |  | ||||||
| 
 |  | ||||||
| TEXT ·getprocaddress(SB),NOSPLIT,$0 |  | ||||||
| 	B	syscall·getprocaddress(SB) |  | ||||||
| 
 |  | ||||||
| TEXT ·loadlibrary(SB),NOSPLIT,$0 |  | ||||||
| 	B	syscall·loadlibrary(SB) |  | ||||||
							
								
								
									
										52
									
								
								vendor/golang.org/x/sys/windows/dll_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/golang.org/x/sys/windows/dll_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -11,6 +11,18 @@ import ( | |||||||
| 	"unsafe" | 	"unsafe" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // We need to use LoadLibrary and GetProcAddress from the Go runtime, because | ||||||
|  | // the these symbols are loaded by the system linker and are required to | ||||||
|  | // dynamically load additional symbols. Note that in the Go runtime, these | ||||||
|  | // return syscall.Handle and syscall.Errno, but these are the same, in fact, | ||||||
|  | // as windows.Handle and windows.Errno, and we intend to keep these the same. | ||||||
|  | 
 | ||||||
|  | //go:linkname syscall_loadlibrary syscall.loadlibrary | ||||||
|  | func syscall_loadlibrary(filename *uint16) (handle Handle, err Errno) | ||||||
|  | 
 | ||||||
|  | //go:linkname syscall_getprocaddress syscall.getprocaddress | ||||||
|  | func syscall_getprocaddress(handle Handle, procname *uint8) (proc uintptr, err Errno) | ||||||
|  | 
 | ||||||
| // DLLError describes reasons for DLL load failures. | // DLLError describes reasons for DLL load failures. | ||||||
| type DLLError struct { | type DLLError struct { | ||||||
| 	Err     error | 	Err     error | ||||||
| @ -20,9 +32,7 @@ type DLLError struct { | |||||||
| 
 | 
 | ||||||
| func (e *DLLError) Error() string { return e.Msg } | func (e *DLLError) Error() string { return e.Msg } | ||||||
| 
 | 
 | ||||||
| // Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. | func (e *DLLError) Unwrap() error { return e.Err } | ||||||
| func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) |  | ||||||
| func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) |  | ||||||
| 
 | 
 | ||||||
| // A DLL implements access to a single DLL. | // A DLL implements access to a single DLL. | ||||||
| type DLL struct { | type DLL struct { | ||||||
| @ -40,7 +50,7 @@ func LoadDLL(name string) (dll *DLL, err error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	h, e := loadlibrary(namep) | 	h, e := syscall_loadlibrary(namep) | ||||||
| 	if e != 0 { | 	if e != 0 { | ||||||
| 		return nil, &DLLError{ | 		return nil, &DLLError{ | ||||||
| 			Err:     e, | 			Err:     e, | ||||||
| @ -50,7 +60,7 @@ func LoadDLL(name string) (dll *DLL, err error) { | |||||||
| 	} | 	} | ||||||
| 	d := &DLL{ | 	d := &DLL{ | ||||||
| 		Name:   name, | 		Name:   name, | ||||||
| 		Handle: Handle(h), | 		Handle: h, | ||||||
| 	} | 	} | ||||||
| 	return d, nil | 	return d, nil | ||||||
| } | } | ||||||
| @ -71,7 +81,7 @@ func (d *DLL) FindProc(name string) (proc *Proc, err error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	a, e := getprocaddress(uintptr(d.Handle), namep) | 	a, e := syscall_getprocaddress(d.Handle, namep) | ||||||
| 	if e != 0 { | 	if e != 0 { | ||||||
| 		return nil, &DLLError{ | 		return nil, &DLLError{ | ||||||
| 			Err:     e, | 			Err:     e, | ||||||
| @ -96,6 +106,35 @@ func (d *DLL) MustFindProc(name string) *Proc { | |||||||
| 	return p | 	return p | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FindProcByOrdinal searches DLL d for procedure by ordinal and returns *Proc | ||||||
|  | // if found. It returns an error if search fails. | ||||||
|  | func (d *DLL) FindProcByOrdinal(ordinal uintptr) (proc *Proc, err error) { | ||||||
|  | 	a, e := GetProcAddressByOrdinal(d.Handle, ordinal) | ||||||
|  | 	name := "#" + itoa(int(ordinal)) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, &DLLError{ | ||||||
|  | 			Err:     e, | ||||||
|  | 			ObjName: name, | ||||||
|  | 			Msg:     "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(), | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	p := &Proc{ | ||||||
|  | 		Dll:  d, | ||||||
|  | 		Name: name, | ||||||
|  | 		addr: a, | ||||||
|  | 	} | ||||||
|  | 	return p, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MustFindProcByOrdinal is like FindProcByOrdinal but panics if search fails. | ||||||
|  | func (d *DLL) MustFindProcByOrdinal(ordinal uintptr) *Proc { | ||||||
|  | 	p, e := d.FindProcByOrdinal(ordinal) | ||||||
|  | 	if e != nil { | ||||||
|  | 		panic(e) | ||||||
|  | 	} | ||||||
|  | 	return p | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Release unloads DLL d from memory. | // Release unloads DLL d from memory. | ||||||
| func (d *DLL) Release() (err error) { | func (d *DLL) Release() (err error) { | ||||||
| 	return FreeLibrary(d.Handle) | 	return FreeLibrary(d.Handle) | ||||||
| @ -352,7 +391,6 @@ func loadLibraryEx(name string, system bool) (*DLL, error) { | |||||||
| 	var flags uintptr | 	var flags uintptr | ||||||
| 	if system { | 	if system { | ||||||
| 		if canDoSearchSystem32() { | 		if canDoSearchSystem32() { | ||||||
| 			const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 |  | ||||||
| 			flags = LOAD_LIBRARY_SEARCH_SYSTEM32 | 			flags = LOAD_LIBRARY_SEARCH_SYSTEM32 | ||||||
| 		} else if isBaseName(name) { | 		} else if isBaseName(name) { | ||||||
| 			// WindowsXP or unpatched Windows machine | 			// WindowsXP or unpatched Windows machine | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/sys/windows/empty.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/sys/windows/empty.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | // Copyright 2019 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. | ||||||
|  | 
 | ||||||
|  | //go:build !go1.12 | ||||||
|  | // +build !go1.12 | ||||||
|  | 
 | ||||||
|  | // This file is here to allow bodyless functions with go:linkname for Go 1.11 | ||||||
|  | // and earlier (see https://golang.org/issue/23311). | ||||||
							
								
								
									
										11
									
								
								vendor/golang.org/x/sys/windows/env_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/golang.org/x/sys/windows/env_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,7 +8,6 @@ package windows | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 	"unicode/utf16" |  | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -40,17 +39,11 @@ func (token Token) Environ(inheritExisting bool) (env []string, err error) { | |||||||
| 	defer DestroyEnvironmentBlock(block) | 	defer DestroyEnvironmentBlock(block) | ||||||
| 	blockp := uintptr(unsafe.Pointer(block)) | 	blockp := uintptr(unsafe.Pointer(block)) | ||||||
| 	for { | 	for { | ||||||
| 		entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:] | 		entry := UTF16PtrToString((*uint16)(unsafe.Pointer(blockp))) | ||||||
| 		for i, v := range entry { |  | ||||||
| 			if v == 0 { |  | ||||||
| 				entry = entry[:i] |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		if len(entry) == 0 { | 		if len(entry) == 0 { | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 		env = append(env, string(utf16.Decode(entry))) | 		env = append(env, entry) | ||||||
| 		blockp += 2 * (uintptr(len(entry)) + 1) | 		blockp += 2 * (uintptr(len(entry)) + 1) | ||||||
| 	} | 	} | ||||||
| 	return env, nil | 	return env, nil | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/windows/eventlog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/windows/eventlog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
|  | |||||||
							
								
								
									
										81
									
								
								vendor/golang.org/x/sys/windows/exec_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								vendor/golang.org/x/sys/windows/exec_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -6,6 +6,11 @@ | |||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
| 
 | 
 | ||||||
|  | import ( | ||||||
|  | 	errorspkg "errors" | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // EscapeArg rewrites command line argument s as prescribed | // EscapeArg rewrites command line argument s as prescribed | ||||||
| // in http://msdn.microsoft.com/en-us/library/ms880421. | // in http://msdn.microsoft.com/en-us/library/ms880421. | ||||||
| // This function returns "" (2 double quotes) if s is empty. | // This function returns "" (2 double quotes) if s is empty. | ||||||
| @ -73,6 +78,40 @@ func EscapeArg(s string) string { | |||||||
| 	return string(qs[:j]) | 	return string(qs[:j]) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ComposeCommandLine escapes and joins the given arguments suitable for use as a Windows command line, | ||||||
|  | // in CreateProcess's CommandLine argument, CreateService/ChangeServiceConfig's BinaryPathName argument, | ||||||
|  | // or any program that uses CommandLineToArgv. | ||||||
|  | func ComposeCommandLine(args []string) string { | ||||||
|  | 	var commandLine string | ||||||
|  | 	for i := range args { | ||||||
|  | 		if i > 0 { | ||||||
|  | 			commandLine += " " | ||||||
|  | 		} | ||||||
|  | 		commandLine += EscapeArg(args[i]) | ||||||
|  | 	} | ||||||
|  | 	return commandLine | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv, | ||||||
|  | // as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that | ||||||
|  | // command lines are passed around. | ||||||
|  | func DecomposeCommandLine(commandLine string) ([]string, error) { | ||||||
|  | 	if len(commandLine) == 0 { | ||||||
|  | 		return []string{}, nil | ||||||
|  | 	} | ||||||
|  | 	var argc int32 | ||||||
|  | 	argv, err := CommandLineToArgv(StringToUTF16Ptr(commandLine), &argc) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(argv))) | ||||||
|  | 	var args []string | ||||||
|  | 	for _, v := range (*argv)[:argc] { | ||||||
|  | 		args = append(args, UTF16ToString((*v)[:])) | ||||||
|  | 	} | ||||||
|  | 	return args, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func CloseOnExec(fd Handle) { | func CloseOnExec(fd Handle) { | ||||||
| 	SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) | 	SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) | ||||||
| } | } | ||||||
| @ -95,3 +134,45 @@ func FullPath(name string) (path string, err error) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // NewProcThreadAttributeList allocates a new ProcThreadAttributeListContainer, with the requested maximum number of attributes. | ||||||
|  | func NewProcThreadAttributeList(maxAttrCount uint32) (*ProcThreadAttributeListContainer, error) { | ||||||
|  | 	var size uintptr | ||||||
|  | 	err := initializeProcThreadAttributeList(nil, maxAttrCount, 0, &size) | ||||||
|  | 	if err != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 		if err == nil { | ||||||
|  | 			return nil, errorspkg.New("unable to query buffer size from InitializeProcThreadAttributeList") | ||||||
|  | 		} | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	alloc, err := LocalAlloc(LMEM_FIXED, uint32(size)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	// size is guaranteed to be ≥1 by InitializeProcThreadAttributeList. | ||||||
|  | 	al := &ProcThreadAttributeListContainer{data: (*ProcThreadAttributeList)(unsafe.Pointer(alloc))} | ||||||
|  | 	err = initializeProcThreadAttributeList(al.data, maxAttrCount, 0, &size) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return al, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Update modifies the ProcThreadAttributeList using UpdateProcThreadAttribute. | ||||||
|  | func (al *ProcThreadAttributeListContainer) Update(attribute uintptr, value unsafe.Pointer, size uintptr) error { | ||||||
|  | 	al.pointers = append(al.pointers, value) | ||||||
|  | 	return updateProcThreadAttribute(al.data, 0, attribute, value, size, nil, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Delete frees ProcThreadAttributeList's resources. | ||||||
|  | func (al *ProcThreadAttributeListContainer) Delete() { | ||||||
|  | 	deleteProcThreadAttributeList(al.data) | ||||||
|  | 	LocalFree(Handle(unsafe.Pointer(al.data))) | ||||||
|  | 	al.data = nil | ||||||
|  | 	al.pointers = nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // List returns the actual ProcThreadAttributeList to be passed to StartupInfoEx. | ||||||
|  | func (al *ProcThreadAttributeListContainer) List() *ProcThreadAttributeList { | ||||||
|  | 	return al.data | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								vendor/golang.org/x/sys/windows/memory_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/golang.org/x/sys/windows/memory_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -16,11 +16,33 @@ const ( | |||||||
| 	MEM_RESET_UNDO  = 0x01000000 | 	MEM_RESET_UNDO  = 0x01000000 | ||||||
| 	MEM_LARGE_PAGES = 0x20000000 | 	MEM_LARGE_PAGES = 0x20000000 | ||||||
| 
 | 
 | ||||||
| 	PAGE_NOACCESS          = 0x01 | 	PAGE_NOACCESS          = 0x00000001 | ||||||
| 	PAGE_READONLY          = 0x02 | 	PAGE_READONLY          = 0x00000002 | ||||||
| 	PAGE_READWRITE         = 0x04 | 	PAGE_READWRITE         = 0x00000004 | ||||||
| 	PAGE_WRITECOPY         = 0x08 | 	PAGE_WRITECOPY         = 0x00000008 | ||||||
| 	PAGE_EXECUTE_READ      = 0x20 | 	PAGE_EXECUTE           = 0x00000010 | ||||||
| 	PAGE_EXECUTE_READWRITE = 0x40 | 	PAGE_EXECUTE_READ      = 0x00000020 | ||||||
| 	PAGE_EXECUTE_WRITECOPY = 0x80 | 	PAGE_EXECUTE_READWRITE = 0x00000040 | ||||||
|  | 	PAGE_EXECUTE_WRITECOPY = 0x00000080 | ||||||
|  | 	PAGE_GUARD             = 0x00000100 | ||||||
|  | 	PAGE_NOCACHE           = 0x00000200 | ||||||
|  | 	PAGE_WRITECOMBINE      = 0x00000400 | ||||||
|  | 	PAGE_TARGETS_INVALID   = 0x40000000 | ||||||
|  | 	PAGE_TARGETS_NO_UPDATE = 0x40000000 | ||||||
|  | 
 | ||||||
|  | 	QUOTA_LIMITS_HARDWS_MIN_DISABLE = 0x00000002 | ||||||
|  | 	QUOTA_LIMITS_HARDWS_MIN_ENABLE  = 0x00000001 | ||||||
|  | 	QUOTA_LIMITS_HARDWS_MAX_DISABLE = 0x00000008 | ||||||
|  | 	QUOTA_LIMITS_HARDWS_MAX_ENABLE  = 0x00000004 | ||||||
| ) | ) | ||||||
|  | 
 | ||||||
|  | type MemoryBasicInformation struct { | ||||||
|  | 	BaseAddress       uintptr | ||||||
|  | 	AllocationBase    uintptr | ||||||
|  | 	AllocationProtect uint32 | ||||||
|  | 	PartitionId       uint16 | ||||||
|  | 	RegionSize        uintptr | ||||||
|  | 	State             uint32 | ||||||
|  | 	Protect           uint32 | ||||||
|  | 	Type              uint32 | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								vendor/golang.org/x/sys/windows/mkerrors.bash
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/golang.org/x/sys/windows/mkerrors.bash
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -9,6 +9,8 @@ shopt -s nullglob | |||||||
| 
 | 
 | ||||||
| winerror="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/winerror.h | sort -Vr | head -n 1)" | winerror="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/winerror.h | sort -Vr | head -n 1)" | ||||||
| [[ -n $winerror ]] || { echo "Unable to find winerror.h" >&2; exit 1; } | [[ -n $winerror ]] || { echo "Unable to find winerror.h" >&2; exit 1; } | ||||||
|  | ntstatus="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/ntstatus.h | sort -Vr | head -n 1)" | ||||||
|  | [[ -n $ntstatus ]] || { echo "Unable to find ntstatus.h" >&2; exit 1; } | ||||||
| 
 | 
 | ||||||
| declare -A errors | declare -A errors | ||||||
| 
 | 
 | ||||||
| @ -59,5 +61,10 @@ declare -A errors | |||||||
| 		echo "$key $vtype = $value" | 		echo "$key $vtype = $value" | ||||||
| 	done < "$winerror" | 	done < "$winerror" | ||||||
| 
 | 
 | ||||||
|  | 	while read -r line; do | ||||||
|  | 		[[ $line =~ ^#define\ (STATUS_[^\s]+)\ +\(\(NTSTATUS\)((0x)?[0-9a-fA-F]+)L?\) ]] || continue | ||||||
|  | 		echo "${BASH_REMATCH[1]} NTStatus = ${BASH_REMATCH[2]}" | ||||||
|  | 	done < "$ntstatus" | ||||||
|  | 
 | ||||||
| 	echo ")" | 	echo ")" | ||||||
| } | gofmt > "zerrors_windows.go" | } | gofmt > "zerrors_windows.go" | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/sys/windows/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/sys/windows/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,8 +2,9 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build generate | ||||||
| // +build generate | // +build generate | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
| 
 | 
 | ||||||
| //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go | //go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go setupapi_windows.go | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/windows/race.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/windows/race.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows && race | ||||||
| // +build windows,race | // +build windows,race | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/windows/race0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/windows/race0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows && !race | ||||||
| // +build windows,!race | // +build windows,!race | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/windows/registry/key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/windows/registry/key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| // Package registry provides access to the Windows registry. | // Package registry provides access to the Windows registry. | ||||||
| @ -19,11 +20,11 @@ | |||||||
| //		log.Fatal(err) | //		log.Fatal(err) | ||||||
| //	} | //	} | ||||||
| //	fmt.Printf("Windows system root is %q\n", s) | //	fmt.Printf("Windows system root is %q\n", s) | ||||||
| // |  | ||||||
| package registry | package registry | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"runtime" | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| @ -113,6 +114,13 @@ func OpenRemoteKey(pcname string, k Key) (Key, error) { | |||||||
| // The parameter n controls the number of returned names, | // The parameter n controls the number of returned names, | ||||||
| // analogous to the way os.File.Readdirnames works. | // analogous to the way os.File.Readdirnames works. | ||||||
| func (k Key) ReadSubKeyNames(n int) ([]string, error) { | func (k Key) ReadSubKeyNames(n int) ([]string, error) { | ||||||
|  | 	// RegEnumKeyEx must be called repeatedly and to completion. | ||||||
|  | 	// During this time, this goroutine cannot migrate away from | ||||||
|  | 	// its current thread. See https://golang.org/issue/49320 and | ||||||
|  | 	// https://golang.org/issue/49466. | ||||||
|  | 	runtime.LockOSThread() | ||||||
|  | 	defer runtime.UnlockOSThread() | ||||||
|  | 
 | ||||||
| 	names := make([]string, 0) | 	names := make([]string, 0) | ||||||
| 	// Registry key size limit is 255 bytes and described there: | 	// Registry key size limit is 255 bytes and described there: | ||||||
| 	// https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx | 	// https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/sys/windows/registry/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/sys/windows/registry/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,8 +2,9 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build generate | ||||||
| // +build generate | // +build generate | ||||||
| 
 | 
 | ||||||
| package registry | package registry | ||||||
| 
 | 
 | ||||||
| //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go | //go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go syscall.go | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/windows/registry/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/windows/registry/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| package registry | package registry | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/sys/windows/registry/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/sys/windows/registry/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| package registry | package registry | ||||||
| @ -108,7 +109,7 @@ func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) | |||||||
| 	if len(data) == 0 { | 	if len(data) == 0 { | ||||||
| 		return "", typ, nil | 		return "", typ, nil | ||||||
| 	} | 	} | ||||||
| 	u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] | 	u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[: len(data)/2 : len(data)/2] | ||||||
| 	return syscall.UTF16ToString(u), typ, nil | 	return syscall.UTF16ToString(u), typ, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -185,8 +186,7 @@ func ExpandString(value string) (string, error) { | |||||||
| 			return "", err | 			return "", err | ||||||
| 		} | 		} | ||||||
| 		if n <= uint32(len(r)) { | 		if n <= uint32(len(r)) { | ||||||
| 			u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] | 			return syscall.UTF16ToString(r[:n]), nil | ||||||
| 			return syscall.UTF16ToString(u), nil |  | ||||||
| 		} | 		} | ||||||
| 		r = make([]uint16, n) | 		r = make([]uint16, n) | ||||||
| 	} | 	} | ||||||
| @ -208,7 +208,7 @@ func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err err | |||||||
| 	if len(data) == 0 { | 	if len(data) == 0 { | ||||||
| 		return nil, typ, nil | 		return nil, typ, nil | ||||||
| 	} | 	} | ||||||
| 	p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] | 	p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[: len(data)/2 : len(data)/2] | ||||||
| 	if len(p) == 0 { | 	if len(p) == 0 { | ||||||
| 		return nil, typ, nil | 		return nil, typ, nil | ||||||
| 	} | 	} | ||||||
| @ -299,7 +299,7 @@ func (k Key) setStringValue(name string, valtype uint32, value string) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] | 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[: len(v)*2 : len(v)*2] | ||||||
| 	return k.setValue(name, valtype, buf) | 	return k.setValue(name, valtype, buf) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -329,7 +329,7 @@ func (k Key) SetStringsValue(name string, value []string) error { | |||||||
| 		ss += s + "\x00" | 		ss += s + "\x00" | ||||||
| 	} | 	} | ||||||
| 	v := utf16.Encode([]rune(ss + "\x00")) | 	v := utf16.Encode([]rune(ss + "\x00")) | ||||||
| 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] | 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[: len(v)*2 : len(v)*2] | ||||||
| 	return k.setValue(name, MULTI_SZ, buf) | 	return k.setValue(name, MULTI_SZ, buf) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -19,6 +19,7 @@ const ( | |||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | 	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | ||||||
|  | 	errERROR_EINVAL     error = syscall.EINVAL | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // errnoErr returns common boxed Errno values, to prevent | // errnoErr returns common boxed Errno values, to prevent | ||||||
| @ -26,7 +27,7 @@ var ( | |||||||
| func errnoErr(e syscall.Errno) error { | func errnoErr(e syscall.Errno) error { | ||||||
| 	switch e { | 	switch e { | ||||||
| 	case 0: | 	case 0: | ||||||
| 		return nil | 		return errERROR_EINVAL | ||||||
| 	case errnoERROR_IO_PENDING: | 	case errnoERROR_IO_PENDING: | ||||||
| 		return errERROR_IO_PENDING | 		return errERROR_IO_PENDING | ||||||
| 	} | 	} | ||||||
| @ -40,16 +41,24 @@ var ( | |||||||
| 	modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") | 	modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") | ||||||
| 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | ||||||
| 
 | 
 | ||||||
|  | 	procRegConnectRegistryW       = modadvapi32.NewProc("RegConnectRegistryW") | ||||||
| 	procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW") | 	procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW") | ||||||
| 	procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW") | 	procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW") | ||||||
| 	procRegSetValueExW            = modadvapi32.NewProc("RegSetValueExW") |  | ||||||
| 	procRegEnumValueW             = modadvapi32.NewProc("RegEnumValueW") |  | ||||||
| 	procRegDeleteValueW           = modadvapi32.NewProc("RegDeleteValueW") | 	procRegDeleteValueW           = modadvapi32.NewProc("RegDeleteValueW") | ||||||
|  | 	procRegEnumValueW             = modadvapi32.NewProc("RegEnumValueW") | ||||||
| 	procRegLoadMUIStringW         = modadvapi32.NewProc("RegLoadMUIStringW") | 	procRegLoadMUIStringW         = modadvapi32.NewProc("RegLoadMUIStringW") | ||||||
| 	procRegConnectRegistryW       = modadvapi32.NewProc("RegConnectRegistryW") | 	procRegSetValueExW            = modadvapi32.NewProc("RegSetValueExW") | ||||||
| 	procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") | 	procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { | ||||||
|  | 	r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		regerrno = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { | func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { | ||||||
| 	r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) | 	r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) | ||||||
| 	if r0 != 0 { | 	if r0 != 0 { | ||||||
| @ -66,8 +75,8 @@ func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { | func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { | ||||||
| 	r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) | 	r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) | ||||||
| 	if r0 != 0 { | 	if r0 != 0 { | ||||||
| 		regerrno = syscall.Errno(r0) | 		regerrno = syscall.Errno(r0) | ||||||
| 	} | 	} | ||||||
| @ -82,14 +91,6 @@ func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint3 | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { |  | ||||||
| 	r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) |  | ||||||
| 	if r0 != 0 { |  | ||||||
| 		regerrno = syscall.Errno(r0) |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { | func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { | ||||||
| 	r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) | 	r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) | ||||||
| 	if r0 != 0 { | 	if r0 != 0 { | ||||||
| @ -98,8 +99,8 @@ func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { | func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { | ||||||
| 	r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) | 	r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) | ||||||
| 	if r0 != 0 { | 	if r0 != 0 { | ||||||
| 		regerrno = syscall.Errno(r0) | 		regerrno = syscall.Errno(r0) | ||||||
| 	} | 	} | ||||||
| @ -110,11 +111,7 @@ func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, | |||||||
| 	r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) | 	r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) | ||||||
| 	n = uint32(r0) | 	n = uint32(r0) | ||||||
| 	if n == 0 { | 	if n == 0 { | ||||||
| 		if e1 != 0 { |  | ||||||
| 		err = errnoErr(e1) | 		err = errnoErr(e1) | ||||||
| 		} else { |  | ||||||
| 			err = syscall.EINVAL |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										646
									
								
								vendor/golang.org/x/sys/windows/security_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										646
									
								
								vendor/golang.org/x/sys/windows/security_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,14 +7,8 @@ package windows | |||||||
| import ( | import ( | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| const ( | 	"golang.org/x/sys/internal/unsafeheader" | ||||||
| 	STANDARD_RIGHTS_REQUIRED = 0xf0000 |  | ||||||
| 	STANDARD_RIGHTS_READ     = 0x20000 |  | ||||||
| 	STANDARD_RIGHTS_WRITE    = 0x20000 |  | ||||||
| 	STANDARD_RIGHTS_EXECUTE  = 0x20000 |  | ||||||
| 	STANDARD_RIGHTS_ALL      = 0x1F0000 |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -235,16 +229,15 @@ func LookupSID(system, account string) (sid *SID, domain string, accType uint32, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // String converts SID to a string format | // String converts SID to a string format suitable for display, storage, or transmission. | ||||||
| // suitable for display, storage, or transmission. | func (sid *SID) String() string { | ||||||
| func (sid *SID) String() (string, error) { |  | ||||||
| 	var s *uint16 | 	var s *uint16 | ||||||
| 	e := ConvertSidToStringSid(sid, &s) | 	e := ConvertSidToStringSid(sid, &s) | ||||||
| 	if e != nil { | 	if e != nil { | ||||||
| 		return "", e | 		return "" | ||||||
| 	} | 	} | ||||||
| 	defer LocalFree((Handle)(unsafe.Pointer(s))) | 	defer LocalFree((Handle)(unsafe.Pointer(s))) | ||||||
| 	return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil | 	return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Len returns the length, in bytes, of a valid security identifier SID. | // Len returns the length, in bytes, of a valid security identifier SID. | ||||||
| @ -631,6 +624,7 @@ func (tml *Tokenmandatorylabel) Size() uint32 { | |||||||
| 
 | 
 | ||||||
| // Authorization Functions | // Authorization Functions | ||||||
| //sys	checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership | //sys	checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership | ||||||
|  | //sys	isTokenRestricted(tokenHandle Token) (ret bool, err error) [!failretval] = advapi32.IsTokenRestricted | ||||||
| //sys	OpenProcessToken(process Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken | //sys	OpenProcessToken(process Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken | ||||||
| //sys	OpenThreadToken(thread Handle, access uint32, openAsSelf bool, token *Token) (err error) = advapi32.OpenThreadToken | //sys	OpenThreadToken(thread Handle, access uint32, openAsSelf bool, token *Token) (err error) = advapi32.OpenThreadToken | ||||||
| //sys	ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf | //sys	ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf | ||||||
| @ -644,6 +638,8 @@ func (tml *Tokenmandatorylabel) Size() uint32 { | |||||||
| //sys	DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) = advapi32.DuplicateTokenEx | //sys	DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) = advapi32.DuplicateTokenEx | ||||||
| //sys	GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW | //sys	GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW | ||||||
| //sys	getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW | //sys	getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW | ||||||
|  | //sys	getWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetWindowsDirectoryW | ||||||
|  | //sys	getSystemWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemWindowsDirectoryW | ||||||
| 
 | 
 | ||||||
| // An access token contains the security information for a logon session. | // An access token contains the security information for a logon session. | ||||||
| // The system creates an access token when a user logs on, and every | // The system creates an access token when a user logs on, and every | ||||||
| @ -654,21 +650,16 @@ func (tml *Tokenmandatorylabel) Size() uint32 { | |||||||
| // system-related operations on the local computer. | // system-related operations on the local computer. | ||||||
| type Token Handle | type Token Handle | ||||||
| 
 | 
 | ||||||
| // OpenCurrentProcessToken opens the access token | // OpenCurrentProcessToken opens an access token associated with current | ||||||
| // associated with current process. It is a real | // process with TOKEN_QUERY access. It is a real token that needs to be closed. | ||||||
| // token that needs to be closed, unlike | // | ||||||
| // GetCurrentProcessToken. | // Deprecated: Explicitly call OpenProcessToken(CurrentProcess(), ...) | ||||||
|  | // with the desired access instead, or use GetCurrentProcessToken for a | ||||||
|  | // TOKEN_QUERY token. | ||||||
| func OpenCurrentProcessToken() (Token, error) { | func OpenCurrentProcessToken() (Token, error) { | ||||||
| 	p, e := GetCurrentProcess() | 	var token Token | ||||||
| 	if e != nil { | 	err := OpenProcessToken(CurrentProcess(), TOKEN_QUERY, &token) | ||||||
| 		return 0, e | 	return token, err | ||||||
| 	} |  | ||||||
| 	var t Token |  | ||||||
| 	e = OpenProcessToken(p, TOKEN_QUERY, &t) |  | ||||||
| 	if e != nil { |  | ||||||
| 		return 0, e |  | ||||||
| 	} |  | ||||||
| 	return t, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetCurrentProcessToken returns the access token associated with | // GetCurrentProcessToken returns the access token associated with | ||||||
| @ -785,8 +776,8 @@ func (token Token) GetLinkedToken() (Token, error) { | |||||||
| 	return linkedToken, nil | 	return linkedToken, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetSystemDirectory retrieves path to current location of the system | // GetSystemDirectory retrieves the path to current location of the system | ||||||
| // directory, which is typically, though not always, C:\Windows\System32. | // directory, which is typically, though not always, `C:\Windows\System32`. | ||||||
| func GetSystemDirectory() (string, error) { | func GetSystemDirectory() (string, error) { | ||||||
| 	n := uint32(MAX_PATH) | 	n := uint32(MAX_PATH) | ||||||
| 	for { | 	for { | ||||||
| @ -802,6 +793,42 @@ func GetSystemDirectory() (string, error) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // GetWindowsDirectory retrieves the path to current location of the Windows | ||||||
|  | // directory, which is typically, though not always, `C:\Windows`. This may | ||||||
|  | // be a private user directory in the case that the application is running | ||||||
|  | // under a terminal server. | ||||||
|  | func GetWindowsDirectory() (string, error) { | ||||||
|  | 	n := uint32(MAX_PATH) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]uint16, n) | ||||||
|  | 		l, e := getWindowsDirectory(&b[0], n) | ||||||
|  | 		if e != nil { | ||||||
|  | 			return "", e | ||||||
|  | 		} | ||||||
|  | 		if l <= n { | ||||||
|  | 			return UTF16ToString(b[:l]), nil | ||||||
|  | 		} | ||||||
|  | 		n = l | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetSystemWindowsDirectory retrieves the path to current location of the | ||||||
|  | // Windows directory, which is typically, though not always, `C:\Windows`. | ||||||
|  | func GetSystemWindowsDirectory() (string, error) { | ||||||
|  | 	n := uint32(MAX_PATH) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]uint16, n) | ||||||
|  | 		l, e := getSystemWindowsDirectory(&b[0], n) | ||||||
|  | 		if e != nil { | ||||||
|  | 			return "", e | ||||||
|  | 		} | ||||||
|  | 		if l <= n { | ||||||
|  | 			return UTF16ToString(b[:l]), nil | ||||||
|  | 		} | ||||||
|  | 		n = l | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // IsMember reports whether the access token t is a member of the provided SID. | // IsMember reports whether the access token t is a member of the provided SID. | ||||||
| func (t Token) IsMember(sid *SID) (bool, error) { | func (t Token) IsMember(sid *SID) (bool, error) { | ||||||
| 	var b int32 | 	var b int32 | ||||||
| @ -811,6 +838,16 @@ func (t Token) IsMember(sid *SID) (bool, error) { | |||||||
| 	return b != 0, nil | 	return b != 0, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // IsRestricted reports whether the access token t is a restricted token. | ||||||
|  | func (t Token) IsRestricted() (isRestricted bool, err error) { | ||||||
|  | 	isRestricted, err = isTokenRestricted(t) | ||||||
|  | 	if !isRestricted && err == syscall.EINVAL { | ||||||
|  | 		// If err is EINVAL, this returned ERROR_SUCCESS indicating a non-restricted token. | ||||||
|  | 		err = nil | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const ( | const ( | ||||||
| 	WTS_CONSOLE_CONNECT        = 0x1 | 	WTS_CONSOLE_CONNECT        = 0x1 | ||||||
| 	WTS_CONSOLE_DISCONNECT     = 0x2 | 	WTS_CONSOLE_DISCONNECT     = 0x2 | ||||||
| @ -852,3 +889,556 @@ type WTS_SESSION_INFO struct { | |||||||
| //sys WTSQueryUserToken(session uint32, token *Token) (err error) = wtsapi32.WTSQueryUserToken | //sys WTSQueryUserToken(session uint32, token *Token) (err error) = wtsapi32.WTSQueryUserToken | ||||||
| //sys WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) = wtsapi32.WTSEnumerateSessionsW | //sys WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) = wtsapi32.WTSEnumerateSessionsW | ||||||
| //sys WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory | //sys WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory | ||||||
|  | //sys WTSGetActiveConsoleSessionId() (sessionID uint32) | ||||||
|  | 
 | ||||||
|  | type ACL struct { | ||||||
|  | 	aclRevision byte | ||||||
|  | 	sbz1        byte | ||||||
|  | 	aclSize     uint16 | ||||||
|  | 	aceCount    uint16 | ||||||
|  | 	sbz2        uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SECURITY_DESCRIPTOR struct { | ||||||
|  | 	revision byte | ||||||
|  | 	sbz1     byte | ||||||
|  | 	control  SECURITY_DESCRIPTOR_CONTROL | ||||||
|  | 	owner    *SID | ||||||
|  | 	group    *SID | ||||||
|  | 	sacl     *ACL | ||||||
|  | 	dacl     *ACL | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SECURITY_QUALITY_OF_SERVICE struct { | ||||||
|  | 	Length              uint32 | ||||||
|  | 	ImpersonationLevel  uint32 | ||||||
|  | 	ContextTrackingMode byte | ||||||
|  | 	EffectiveOnly       byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Constants for the ContextTrackingMode field of SECURITY_QUALITY_OF_SERVICE. | ||||||
|  | const ( | ||||||
|  | 	SECURITY_STATIC_TRACKING  = 0 | ||||||
|  | 	SECURITY_DYNAMIC_TRACKING = 1 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SecurityAttributes struct { | ||||||
|  | 	Length             uint32 | ||||||
|  | 	SecurityDescriptor *SECURITY_DESCRIPTOR | ||||||
|  | 	InheritHandle      uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SE_OBJECT_TYPE uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for type SE_OBJECT_TYPE | ||||||
|  | const ( | ||||||
|  | 	SE_UNKNOWN_OBJECT_TYPE     = 0 | ||||||
|  | 	SE_FILE_OBJECT             = 1 | ||||||
|  | 	SE_SERVICE                 = 2 | ||||||
|  | 	SE_PRINTER                 = 3 | ||||||
|  | 	SE_REGISTRY_KEY            = 4 | ||||||
|  | 	SE_LMSHARE                 = 5 | ||||||
|  | 	SE_KERNEL_OBJECT           = 6 | ||||||
|  | 	SE_WINDOW_OBJECT           = 7 | ||||||
|  | 	SE_DS_OBJECT               = 8 | ||||||
|  | 	SE_DS_OBJECT_ALL           = 9 | ||||||
|  | 	SE_PROVIDER_DEFINED_OBJECT = 10 | ||||||
|  | 	SE_WMIGUID_OBJECT          = 11 | ||||||
|  | 	SE_REGISTRY_WOW64_32KEY    = 12 | ||||||
|  | 	SE_REGISTRY_WOW64_64KEY    = 13 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SECURITY_INFORMATION uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for type SECURITY_INFORMATION | ||||||
|  | const ( | ||||||
|  | 	OWNER_SECURITY_INFORMATION            = 0x00000001 | ||||||
|  | 	GROUP_SECURITY_INFORMATION            = 0x00000002 | ||||||
|  | 	DACL_SECURITY_INFORMATION             = 0x00000004 | ||||||
|  | 	SACL_SECURITY_INFORMATION             = 0x00000008 | ||||||
|  | 	LABEL_SECURITY_INFORMATION            = 0x00000010 | ||||||
|  | 	ATTRIBUTE_SECURITY_INFORMATION        = 0x00000020 | ||||||
|  | 	SCOPE_SECURITY_INFORMATION            = 0x00000040 | ||||||
|  | 	BACKUP_SECURITY_INFORMATION           = 0x00010000 | ||||||
|  | 	PROTECTED_DACL_SECURITY_INFORMATION   = 0x80000000 | ||||||
|  | 	PROTECTED_SACL_SECURITY_INFORMATION   = 0x40000000 | ||||||
|  | 	UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000 | ||||||
|  | 	UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SECURITY_DESCRIPTOR_CONTROL uint16 | ||||||
|  | 
 | ||||||
|  | // Constants for type SECURITY_DESCRIPTOR_CONTROL | ||||||
|  | const ( | ||||||
|  | 	SE_OWNER_DEFAULTED       = 0x0001 | ||||||
|  | 	SE_GROUP_DEFAULTED       = 0x0002 | ||||||
|  | 	SE_DACL_PRESENT          = 0x0004 | ||||||
|  | 	SE_DACL_DEFAULTED        = 0x0008 | ||||||
|  | 	SE_SACL_PRESENT          = 0x0010 | ||||||
|  | 	SE_SACL_DEFAULTED        = 0x0020 | ||||||
|  | 	SE_DACL_AUTO_INHERIT_REQ = 0x0100 | ||||||
|  | 	SE_SACL_AUTO_INHERIT_REQ = 0x0200 | ||||||
|  | 	SE_DACL_AUTO_INHERITED   = 0x0400 | ||||||
|  | 	SE_SACL_AUTO_INHERITED   = 0x0800 | ||||||
|  | 	SE_DACL_PROTECTED        = 0x1000 | ||||||
|  | 	SE_SACL_PROTECTED        = 0x2000 | ||||||
|  | 	SE_RM_CONTROL_VALID      = 0x4000 | ||||||
|  | 	SE_SELF_RELATIVE         = 0x8000 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ACCESS_MASK uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for type ACCESS_MASK | ||||||
|  | const ( | ||||||
|  | 	DELETE                   = 0x00010000 | ||||||
|  | 	READ_CONTROL             = 0x00020000 | ||||||
|  | 	WRITE_DAC                = 0x00040000 | ||||||
|  | 	WRITE_OWNER              = 0x00080000 | ||||||
|  | 	SYNCHRONIZE              = 0x00100000 | ||||||
|  | 	STANDARD_RIGHTS_REQUIRED = 0x000F0000 | ||||||
|  | 	STANDARD_RIGHTS_READ     = READ_CONTROL | ||||||
|  | 	STANDARD_RIGHTS_WRITE    = READ_CONTROL | ||||||
|  | 	STANDARD_RIGHTS_EXECUTE  = READ_CONTROL | ||||||
|  | 	STANDARD_RIGHTS_ALL      = 0x001F0000 | ||||||
|  | 	SPECIFIC_RIGHTS_ALL      = 0x0000FFFF | ||||||
|  | 	ACCESS_SYSTEM_SECURITY   = 0x01000000 | ||||||
|  | 	MAXIMUM_ALLOWED          = 0x02000000 | ||||||
|  | 	GENERIC_READ             = 0x80000000 | ||||||
|  | 	GENERIC_WRITE            = 0x40000000 | ||||||
|  | 	GENERIC_EXECUTE          = 0x20000000 | ||||||
|  | 	GENERIC_ALL              = 0x10000000 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ACCESS_MODE uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for type ACCESS_MODE | ||||||
|  | const ( | ||||||
|  | 	NOT_USED_ACCESS   = 0 | ||||||
|  | 	GRANT_ACCESS      = 1 | ||||||
|  | 	SET_ACCESS        = 2 | ||||||
|  | 	DENY_ACCESS       = 3 | ||||||
|  | 	REVOKE_ACCESS     = 4 | ||||||
|  | 	SET_AUDIT_SUCCESS = 5 | ||||||
|  | 	SET_AUDIT_FAILURE = 6 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Constants for AceFlags and Inheritance fields | ||||||
|  | const ( | ||||||
|  | 	NO_INHERITANCE                     = 0x0 | ||||||
|  | 	SUB_OBJECTS_ONLY_INHERIT           = 0x1 | ||||||
|  | 	SUB_CONTAINERS_ONLY_INHERIT        = 0x2 | ||||||
|  | 	SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3 | ||||||
|  | 	INHERIT_NO_PROPAGATE               = 0x4 | ||||||
|  | 	INHERIT_ONLY                       = 0x8 | ||||||
|  | 	INHERITED_ACCESS_ENTRY             = 0x10 | ||||||
|  | 	INHERITED_PARENT                   = 0x10000000 | ||||||
|  | 	INHERITED_GRANDPARENT              = 0x20000000 | ||||||
|  | 	OBJECT_INHERIT_ACE                 = 0x1 | ||||||
|  | 	CONTAINER_INHERIT_ACE              = 0x2 | ||||||
|  | 	NO_PROPAGATE_INHERIT_ACE           = 0x4 | ||||||
|  | 	INHERIT_ONLY_ACE                   = 0x8 | ||||||
|  | 	INHERITED_ACE                      = 0x10 | ||||||
|  | 	VALID_INHERIT_FLAGS                = 0x1F | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type MULTIPLE_TRUSTEE_OPERATION uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for MULTIPLE_TRUSTEE_OPERATION | ||||||
|  | const ( | ||||||
|  | 	NO_MULTIPLE_TRUSTEE    = 0 | ||||||
|  | 	TRUSTEE_IS_IMPERSONATE = 1 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type TRUSTEE_FORM uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for TRUSTEE_FORM | ||||||
|  | const ( | ||||||
|  | 	TRUSTEE_IS_SID              = 0 | ||||||
|  | 	TRUSTEE_IS_NAME             = 1 | ||||||
|  | 	TRUSTEE_BAD_FORM            = 2 | ||||||
|  | 	TRUSTEE_IS_OBJECTS_AND_SID  = 3 | ||||||
|  | 	TRUSTEE_IS_OBJECTS_AND_NAME = 4 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type TRUSTEE_TYPE uint32 | ||||||
|  | 
 | ||||||
|  | // Constants for TRUSTEE_TYPE | ||||||
|  | const ( | ||||||
|  | 	TRUSTEE_IS_UNKNOWN          = 0 | ||||||
|  | 	TRUSTEE_IS_USER             = 1 | ||||||
|  | 	TRUSTEE_IS_GROUP            = 2 | ||||||
|  | 	TRUSTEE_IS_DOMAIN           = 3 | ||||||
|  | 	TRUSTEE_IS_ALIAS            = 4 | ||||||
|  | 	TRUSTEE_IS_WELL_KNOWN_GROUP = 5 | ||||||
|  | 	TRUSTEE_IS_DELETED          = 6 | ||||||
|  | 	TRUSTEE_IS_INVALID          = 7 | ||||||
|  | 	TRUSTEE_IS_COMPUTER         = 8 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Constants for ObjectsPresent field | ||||||
|  | const ( | ||||||
|  | 	ACE_OBJECT_TYPE_PRESENT           = 0x1 | ||||||
|  | 	ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x2 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type EXPLICIT_ACCESS struct { | ||||||
|  | 	AccessPermissions ACCESS_MASK | ||||||
|  | 	AccessMode        ACCESS_MODE | ||||||
|  | 	Inheritance       uint32 | ||||||
|  | 	Trustee           TRUSTEE | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // This type is the union inside of TRUSTEE and must be created using one of the TrusteeValueFrom* functions. | ||||||
|  | type TrusteeValue uintptr | ||||||
|  | 
 | ||||||
|  | func TrusteeValueFromString(str string) TrusteeValue { | ||||||
|  | 	return TrusteeValue(unsafe.Pointer(StringToUTF16Ptr(str))) | ||||||
|  | } | ||||||
|  | func TrusteeValueFromSID(sid *SID) TrusteeValue { | ||||||
|  | 	return TrusteeValue(unsafe.Pointer(sid)) | ||||||
|  | } | ||||||
|  | func TrusteeValueFromObjectsAndSid(objectsAndSid *OBJECTS_AND_SID) TrusteeValue { | ||||||
|  | 	return TrusteeValue(unsafe.Pointer(objectsAndSid)) | ||||||
|  | } | ||||||
|  | func TrusteeValueFromObjectsAndName(objectsAndName *OBJECTS_AND_NAME) TrusteeValue { | ||||||
|  | 	return TrusteeValue(unsafe.Pointer(objectsAndName)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type TRUSTEE struct { | ||||||
|  | 	MultipleTrustee          *TRUSTEE | ||||||
|  | 	MultipleTrusteeOperation MULTIPLE_TRUSTEE_OPERATION | ||||||
|  | 	TrusteeForm              TRUSTEE_FORM | ||||||
|  | 	TrusteeType              TRUSTEE_TYPE | ||||||
|  | 	TrusteeValue             TrusteeValue | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type OBJECTS_AND_SID struct { | ||||||
|  | 	ObjectsPresent          uint32 | ||||||
|  | 	ObjectTypeGuid          GUID | ||||||
|  | 	InheritedObjectTypeGuid GUID | ||||||
|  | 	Sid                     *SID | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type OBJECTS_AND_NAME struct { | ||||||
|  | 	ObjectsPresent          uint32 | ||||||
|  | 	ObjectType              SE_OBJECT_TYPE | ||||||
|  | 	ObjectTypeName          *uint16 | ||||||
|  | 	InheritedObjectTypeName *uint16 | ||||||
|  | 	Name                    *uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //sys	getSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetSecurityInfo | ||||||
|  | //sys	SetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) = advapi32.SetSecurityInfo | ||||||
|  | //sys	getNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetNamedSecurityInfoW | ||||||
|  | //sys	SetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) = advapi32.SetNamedSecurityInfoW | ||||||
|  | //sys	SetKernelObjectSecurity(handle Handle, securityInformation SECURITY_INFORMATION, securityDescriptor *SECURITY_DESCRIPTOR) (err error) = advapi32.SetKernelObjectSecurity | ||||||
|  | 
 | ||||||
|  | //sys	buildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, countAccessEntries uint32, accessEntries *EXPLICIT_ACCESS, countAuditEntries uint32, auditEntries *EXPLICIT_ACCESS, oldSecurityDescriptor *SECURITY_DESCRIPTOR, sizeNewSecurityDescriptor *uint32, newSecurityDescriptor **SECURITY_DESCRIPTOR) (ret error) = advapi32.BuildSecurityDescriptorW | ||||||
|  | //sys	initializeSecurityDescriptor(absoluteSD *SECURITY_DESCRIPTOR, revision uint32) (err error) = advapi32.InitializeSecurityDescriptor | ||||||
|  | 
 | ||||||
|  | //sys	getSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, control *SECURITY_DESCRIPTOR_CONTROL, revision *uint32) (err error) = advapi32.GetSecurityDescriptorControl | ||||||
|  | //sys	getSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent *bool, dacl **ACL, daclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorDacl | ||||||
|  | //sys	getSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent *bool, sacl **ACL, saclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorSacl | ||||||
|  | //sys	getSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner **SID, ownerDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorOwner | ||||||
|  | //sys	getSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group **SID, groupDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorGroup | ||||||
|  | //sys	getSecurityDescriptorLength(sd *SECURITY_DESCRIPTOR) (len uint32) = advapi32.GetSecurityDescriptorLength | ||||||
|  | //sys	getSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) (ret error) [failretval!=0] = advapi32.GetSecurityDescriptorRMControl | ||||||
|  | //sys	isValidSecurityDescriptor(sd *SECURITY_DESCRIPTOR) (isValid bool) = advapi32.IsValidSecurityDescriptor | ||||||
|  | 
 | ||||||
|  | //sys	setSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) (err error) = advapi32.SetSecurityDescriptorControl | ||||||
|  | //sys	setSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent bool, dacl *ACL, daclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorDacl | ||||||
|  | //sys	setSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent bool, sacl *ACL, saclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorSacl | ||||||
|  | //sys	setSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner *SID, ownerDefaulted bool) (err error) = advapi32.SetSecurityDescriptorOwner | ||||||
|  | //sys	setSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group *SID, groupDefaulted bool) (err error) = advapi32.SetSecurityDescriptorGroup | ||||||
|  | //sys	setSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) = advapi32.SetSecurityDescriptorRMControl | ||||||
|  | 
 | ||||||
|  | //sys	convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW | ||||||
|  | //sys	convertSecurityDescriptorToStringSecurityDescriptor(sd *SECURITY_DESCRIPTOR, revision uint32, securityInformation SECURITY_INFORMATION, str **uint16, strLen *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW | ||||||
|  | 
 | ||||||
|  | //sys	makeAbsoluteSD(selfRelativeSD *SECURITY_DESCRIPTOR, absoluteSD *SECURITY_DESCRIPTOR, absoluteSDSize *uint32, dacl *ACL, daclSize *uint32, sacl *ACL, saclSize *uint32, owner *SID, ownerSize *uint32, group *SID, groupSize *uint32) (err error) = advapi32.MakeAbsoluteSD | ||||||
|  | //sys	makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) = advapi32.MakeSelfRelativeSD | ||||||
|  | 
 | ||||||
|  | //sys	setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) = advapi32.SetEntriesInAclW | ||||||
|  | 
 | ||||||
|  | // Control returns the security descriptor control bits. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) Control() (control SECURITY_DESCRIPTOR_CONTROL, revision uint32, err error) { | ||||||
|  | 	err = getSecurityDescriptorControl(sd, &control, &revision) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetControl sets the security descriptor control bits. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) SetControl(controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) error { | ||||||
|  | 	return setSecurityDescriptorControl(sd, controlBitsOfInterest, controlBitsToSet) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RMControl returns the security descriptor resource manager control bits. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) RMControl() (control uint8, err error) { | ||||||
|  | 	err = getSecurityDescriptorRMControl(sd, &control) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetRMControl sets the security descriptor resource manager control bits. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) SetRMControl(rmControl uint8) { | ||||||
|  | 	setSecurityDescriptorRMControl(sd, &rmControl) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DACL returns the security descriptor DACL and whether it was defaulted. The dacl return value may be nil | ||||||
|  | // if a DACL exists but is an "empty DACL", meaning fully permissive. If the DACL does not exist, err returns | ||||||
|  | // ERROR_OBJECT_NOT_FOUND. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) DACL() (dacl *ACL, defaulted bool, err error) { | ||||||
|  | 	var present bool | ||||||
|  | 	err = getSecurityDescriptorDacl(sd, &present, &dacl, &defaulted) | ||||||
|  | 	if !present { | ||||||
|  | 		err = ERROR_OBJECT_NOT_FOUND | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetDACL sets the absolute security descriptor DACL. | ||||||
|  | func (absoluteSD *SECURITY_DESCRIPTOR) SetDACL(dacl *ACL, present, defaulted bool) error { | ||||||
|  | 	return setSecurityDescriptorDacl(absoluteSD, present, dacl, defaulted) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SACL returns the security descriptor SACL and whether it was defaulted. The sacl return value may be nil | ||||||
|  | // if a SACL exists but is an "empty SACL", meaning fully permissive. If the SACL does not exist, err returns | ||||||
|  | // ERROR_OBJECT_NOT_FOUND. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) SACL() (sacl *ACL, defaulted bool, err error) { | ||||||
|  | 	var present bool | ||||||
|  | 	err = getSecurityDescriptorSacl(sd, &present, &sacl, &defaulted) | ||||||
|  | 	if !present { | ||||||
|  | 		err = ERROR_OBJECT_NOT_FOUND | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetSACL sets the absolute security descriptor SACL. | ||||||
|  | func (absoluteSD *SECURITY_DESCRIPTOR) SetSACL(sacl *ACL, present, defaulted bool) error { | ||||||
|  | 	return setSecurityDescriptorSacl(absoluteSD, present, sacl, defaulted) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Owner returns the security descriptor owner and whether it was defaulted. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) Owner() (owner *SID, defaulted bool, err error) { | ||||||
|  | 	err = getSecurityDescriptorOwner(sd, &owner, &defaulted) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetOwner sets the absolute security descriptor owner. | ||||||
|  | func (absoluteSD *SECURITY_DESCRIPTOR) SetOwner(owner *SID, defaulted bool) error { | ||||||
|  | 	return setSecurityDescriptorOwner(absoluteSD, owner, defaulted) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Group returns the security descriptor group and whether it was defaulted. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) Group() (group *SID, defaulted bool, err error) { | ||||||
|  | 	err = getSecurityDescriptorGroup(sd, &group, &defaulted) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetGroup sets the absolute security descriptor owner. | ||||||
|  | func (absoluteSD *SECURITY_DESCRIPTOR) SetGroup(group *SID, defaulted bool) error { | ||||||
|  | 	return setSecurityDescriptorGroup(absoluteSD, group, defaulted) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Length returns the length of the security descriptor. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) Length() uint32 { | ||||||
|  | 	return getSecurityDescriptorLength(sd) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsValid returns whether the security descriptor is valid. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) IsValid() bool { | ||||||
|  | 	return isValidSecurityDescriptor(sd) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // String returns the SDDL form of the security descriptor, with a function signature that can be | ||||||
|  | // used with %v formatting directives. | ||||||
|  | func (sd *SECURITY_DESCRIPTOR) String() string { | ||||||
|  | 	var sddl *uint16 | ||||||
|  | 	err := convertSecurityDescriptorToStringSecurityDescriptor(sd, 1, 0xff, &sddl, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(sddl))) | ||||||
|  | 	return UTF16PtrToString(sddl) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ToAbsolute converts a self-relative security descriptor into an absolute one. | ||||||
|  | func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	control, _, err := selfRelativeSD.Control() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if control&SE_SELF_RELATIVE == 0 { | ||||||
|  | 		err = ERROR_INVALID_PARAMETER | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var absoluteSDSize, daclSize, saclSize, ownerSize, groupSize uint32 | ||||||
|  | 	err = makeAbsoluteSD(selfRelativeSD, nil, &absoluteSDSize, | ||||||
|  | 		nil, &daclSize, nil, &saclSize, nil, &ownerSize, nil, &groupSize) | ||||||
|  | 	switch err { | ||||||
|  | 	case ERROR_INSUFFICIENT_BUFFER: | ||||||
|  | 	case nil: | ||||||
|  | 		// makeAbsoluteSD is expected to fail, but it succeeds. | ||||||
|  | 		return nil, ERROR_INTERNAL_ERROR | ||||||
|  | 	default: | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if absoluteSDSize > 0 { | ||||||
|  | 		absoluteSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0])) | ||||||
|  | 	} | ||||||
|  | 	var ( | ||||||
|  | 		dacl  *ACL | ||||||
|  | 		sacl  *ACL | ||||||
|  | 		owner *SID | ||||||
|  | 		group *SID | ||||||
|  | 	) | ||||||
|  | 	if daclSize > 0 { | ||||||
|  | 		dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0])) | ||||||
|  | 	} | ||||||
|  | 	if saclSize > 0 { | ||||||
|  | 		sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0])) | ||||||
|  | 	} | ||||||
|  | 	if ownerSize > 0 { | ||||||
|  | 		owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0])) | ||||||
|  | 	} | ||||||
|  | 	if groupSize > 0 { | ||||||
|  | 		group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0])) | ||||||
|  | 	} | ||||||
|  | 	err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize, | ||||||
|  | 		dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, &groupSize) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ToSelfRelative converts an absolute security descriptor into a self-relative one. | ||||||
|  | func (absoluteSD *SECURITY_DESCRIPTOR) ToSelfRelative() (selfRelativeSD *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	control, _, err := absoluteSD.Control() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if control&SE_SELF_RELATIVE != 0 { | ||||||
|  | 		err = ERROR_INVALID_PARAMETER | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var selfRelativeSDSize uint32 | ||||||
|  | 	err = makeSelfRelativeSD(absoluteSD, nil, &selfRelativeSDSize) | ||||||
|  | 	switch err { | ||||||
|  | 	case ERROR_INSUFFICIENT_BUFFER: | ||||||
|  | 	case nil: | ||||||
|  | 		// makeSelfRelativeSD is expected to fail, but it succeeds. | ||||||
|  | 		return nil, ERROR_INTERNAL_ERROR | ||||||
|  | 	default: | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if selfRelativeSDSize > 0 { | ||||||
|  | 		selfRelativeSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, selfRelativeSDSize)[0])) | ||||||
|  | 	} | ||||||
|  | 	err = makeSelfRelativeSD(absoluteSD, selfRelativeSD, &selfRelativeSDSize) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() *SECURITY_DESCRIPTOR { | ||||||
|  | 	sdLen := int(selfRelativeSD.Length()) | ||||||
|  | 	const min = int(unsafe.Sizeof(SECURITY_DESCRIPTOR{})) | ||||||
|  | 	if sdLen < min { | ||||||
|  | 		sdLen = min | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var src []byte | ||||||
|  | 	h := (*unsafeheader.Slice)(unsafe.Pointer(&src)) | ||||||
|  | 	h.Data = unsafe.Pointer(selfRelativeSD) | ||||||
|  | 	h.Len = sdLen | ||||||
|  | 	h.Cap = sdLen | ||||||
|  | 
 | ||||||
|  | 	const psize = int(unsafe.Sizeof(uintptr(0))) | ||||||
|  | 
 | ||||||
|  | 	var dst []byte | ||||||
|  | 	h = (*unsafeheader.Slice)(unsafe.Pointer(&dst)) | ||||||
|  | 	alloc := make([]uintptr, (sdLen+psize-1)/psize) | ||||||
|  | 	h.Data = (*unsafeheader.Slice)(unsafe.Pointer(&alloc)).Data | ||||||
|  | 	h.Len = sdLen | ||||||
|  | 	h.Cap = sdLen | ||||||
|  | 
 | ||||||
|  | 	copy(dst, src) | ||||||
|  | 	return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&dst[0])) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SecurityDescriptorFromString converts an SDDL string describing a security descriptor into a | ||||||
|  | // self-relative security descriptor object allocated on the Go heap. | ||||||
|  | func SecurityDescriptorFromString(sddl string) (sd *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	var winHeapSD *SECURITY_DESCRIPTOR | ||||||
|  | 	err = convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &winHeapSD, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) | ||||||
|  | 	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetSecurityInfo queries the security information for a given handle and returns the self-relative security | ||||||
|  | // descriptor result on the Go heap. | ||||||
|  | func GetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	var winHeapSD *SECURITY_DESCRIPTOR | ||||||
|  | 	err = getSecurityInfo(handle, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) | ||||||
|  | 	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetNamedSecurityInfo queries the security information for a given named object and returns the self-relative security | ||||||
|  | // descriptor result on the Go heap. | ||||||
|  | func GetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	var winHeapSD *SECURITY_DESCRIPTOR | ||||||
|  | 	err = getNamedSecurityInfo(objectName, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) | ||||||
|  | 	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BuildSecurityDescriptor makes a new security descriptor using the input trustees, explicit access lists, and | ||||||
|  | // prior security descriptor to be merged, any of which can be nil, returning the self-relative security descriptor | ||||||
|  | // result on the Go heap. | ||||||
|  | func BuildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, accessEntries []EXPLICIT_ACCESS, auditEntries []EXPLICIT_ACCESS, mergedSecurityDescriptor *SECURITY_DESCRIPTOR) (sd *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	var winHeapSD *SECURITY_DESCRIPTOR | ||||||
|  | 	var winHeapSDSize uint32 | ||||||
|  | 	var firstAccessEntry *EXPLICIT_ACCESS | ||||||
|  | 	if len(accessEntries) > 0 { | ||||||
|  | 		firstAccessEntry = &accessEntries[0] | ||||||
|  | 	} | ||||||
|  | 	var firstAuditEntry *EXPLICIT_ACCESS | ||||||
|  | 	if len(auditEntries) > 0 { | ||||||
|  | 		firstAuditEntry = &auditEntries[0] | ||||||
|  | 	} | ||||||
|  | 	err = buildSecurityDescriptor(owner, group, uint32(len(accessEntries)), firstAccessEntry, uint32(len(auditEntries)), firstAuditEntry, mergedSecurityDescriptor, &winHeapSDSize, &winHeapSD) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) | ||||||
|  | 	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewSecurityDescriptor creates and initializes a new absolute security descriptor. | ||||||
|  | func NewSecurityDescriptor() (absoluteSD *SECURITY_DESCRIPTOR, err error) { | ||||||
|  | 	absoluteSD = &SECURITY_DESCRIPTOR{} | ||||||
|  | 	err = initializeSecurityDescriptor(absoluteSD, 1) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ACLFromEntries returns a new ACL on the Go heap containing a list of explicit entries as well as those of another ACL. | ||||||
|  | // Both explicitEntries and mergedACL are optional and can be nil. | ||||||
|  | func ACLFromEntries(explicitEntries []EXPLICIT_ACCESS, mergedACL *ACL) (acl *ACL, err error) { | ||||||
|  | 	var firstExplicitEntry *EXPLICIT_ACCESS | ||||||
|  | 	if len(explicitEntries) > 0 { | ||||||
|  | 		firstExplicitEntry = &explicitEntries[0] | ||||||
|  | 	} | ||||||
|  | 	var winHeapACL *ACL | ||||||
|  | 	err = setEntriesInAcl(uint32(len(explicitEntries)), firstExplicitEntry, mergedACL, &winHeapACL) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree(Handle(unsafe.Pointer(winHeapACL))) | ||||||
|  | 	aclBytes := make([]byte, winHeapACL.aclSize) | ||||||
|  | 	copy(aclBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(winHeapACL))[:len(aclBytes):len(aclBytes)]) | ||||||
|  | 	return (*ACL)(unsafe.Pointer(&aclBytes[0])), nil | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								vendor/golang.org/x/sys/windows/service.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/golang.org/x/sys/windows/service.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
| @ -16,8 +17,6 @@ const ( | |||||||
| 	SC_MANAGER_ALL_ACCESS         = 0xf003f | 	SC_MANAGER_ALL_ACCESS         = 0xf003f | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| //sys	OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW |  | ||||||
| 
 |  | ||||||
| const ( | const ( | ||||||
| 	SERVICE_KERNEL_DRIVER       = 1 | 	SERVICE_KERNEL_DRIVER       = 1 | ||||||
| 	SERVICE_FILE_SYSTEM_DRIVER  = 2 | 	SERVICE_FILE_SYSTEM_DRIVER  = 2 | ||||||
| @ -65,6 +64,7 @@ const ( | |||||||
| 	SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 | 	SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 | ||||||
| 	SERVICE_ACCEPT_POWEREVENT            = 64 | 	SERVICE_ACCEPT_POWEREVENT            = 64 | ||||||
| 	SERVICE_ACCEPT_SESSIONCHANGE         = 128 | 	SERVICE_ACCEPT_SESSIONCHANGE         = 128 | ||||||
|  | 	SERVICE_ACCEPT_PRESHUTDOWN           = 256 | ||||||
| 
 | 
 | ||||||
| 	SERVICE_CONTROL_STOP                  = 1 | 	SERVICE_CONTROL_STOP                  = 1 | ||||||
| 	SERVICE_CONTROL_PAUSE                 = 2 | 	SERVICE_CONTROL_PAUSE                 = 2 | ||||||
| @ -80,6 +80,7 @@ const ( | |||||||
| 	SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 | 	SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 | ||||||
| 	SERVICE_CONTROL_POWEREVENT            = 13 | 	SERVICE_CONTROL_POWEREVENT            = 13 | ||||||
| 	SERVICE_CONTROL_SESSIONCHANGE         = 14 | 	SERVICE_CONTROL_SESSIONCHANGE         = 14 | ||||||
|  | 	SERVICE_CONTROL_PRESHUTDOWN           = 15 | ||||||
| 
 | 
 | ||||||
| 	SERVICE_ACTIVE    = 1 | 	SERVICE_ACTIVE    = 1 | ||||||
| 	SERVICE_INACTIVE  = 2 | 	SERVICE_INACTIVE  = 2 | ||||||
| @ -126,6 +127,18 @@ const ( | |||||||
| 	SERVICE_NOTIFY_CREATED          = 0x00000080 | 	SERVICE_NOTIFY_CREATED          = 0x00000080 | ||||||
| 	SERVICE_NOTIFY_DELETED          = 0x00000100 | 	SERVICE_NOTIFY_DELETED          = 0x00000100 | ||||||
| 	SERVICE_NOTIFY_DELETE_PENDING   = 0x00000200 | 	SERVICE_NOTIFY_DELETE_PENDING   = 0x00000200 | ||||||
|  | 
 | ||||||
|  | 	SC_EVENT_DATABASE_CHANGE = 0 | ||||||
|  | 	SC_EVENT_PROPERTY_CHANGE = 1 | ||||||
|  | 	SC_EVENT_STATUS_CHANGE   = 2 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_START_REASON_DEMAND             = 0x00000001 | ||||||
|  | 	SERVICE_START_REASON_AUTO               = 0x00000002 | ||||||
|  | 	SERVICE_START_REASON_TRIGGER            = 0x00000004 | ||||||
|  | 	SERVICE_START_REASON_RESTART_ON_FAILURE = 0x00000008 | ||||||
|  | 	SERVICE_START_REASON_DELAYEDAUTO        = 0x00000010 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type SERVICE_STATUS struct { | type SERVICE_STATUS struct { | ||||||
| @ -159,6 +172,10 @@ type SERVICE_DESCRIPTION struct { | |||||||
| 	Description *uint16 | 	Description *uint16 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type SERVICE_DELAYED_AUTO_START_INFO struct { | ||||||
|  | 	IsDelayedAutoStartUp uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type SERVICE_STATUS_PROCESS struct { | type SERVICE_STATUS_PROCESS struct { | ||||||
| 	ServiceType             uint32 | 	ServiceType             uint32 | ||||||
| 	CurrentState            uint32 | 	CurrentState            uint32 | ||||||
| @ -206,6 +223,7 @@ type QUERY_SERVICE_LOCK_STATUS struct { | |||||||
| 	LockDuration uint32 | 	LockDuration uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | //sys	OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW | ||||||
| //sys	CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle | //sys	CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle | ||||||
| //sys	CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW | //sys	CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW | ||||||
| //sys	OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW | //sys	OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW | ||||||
| @ -223,3 +241,7 @@ type QUERY_SERVICE_LOCK_STATUS struct { | |||||||
| //sys	EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW | //sys	EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW | ||||||
| //sys	QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx | //sys	QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx | ||||||
| //sys	NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW | //sys	NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW | ||||||
|  | //sys	SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) = sechost.SubscribeServiceChangeNotifications? | ||||||
|  | //sys	UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications? | ||||||
|  | //sys	RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW | ||||||
|  | //sys	QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation? | ||||||
|  | |||||||
							
								
								
									
										1425
									
								
								vendor/golang.org/x/sys/windows/setupapi_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1425
									
								
								vendor/golang.org/x/sys/windows/setupapi_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/windows/str.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/windows/str.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| package windows | package windows | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								vendor/golang.org/x/sys/windows/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/golang.org/x/sys/windows/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
|  | //go:build windows | ||||||
| // +build windows | // +build windows | ||||||
| 
 | 
 | ||||||
| // Package windows contains an interface to the low-level operating system | // Package windows contains an interface to the low-level operating system | ||||||
| @ -25,18 +26,19 @@ | |||||||
| package windows // import "golang.org/x/sys/windows" | package windows // import "golang.org/x/sys/windows" | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"strings" | ||||||
| 	"syscall" | 	"syscall" | ||||||
|  | 	"unsafe" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ByteSliceFromString returns a NUL-terminated slice of bytes | // ByteSliceFromString returns a NUL-terminated slice of bytes | ||||||
| // containing the text of s. If s contains a NUL byte at any | // containing the text of s. If s contains a NUL byte at any | ||||||
| // location, it returns (nil, syscall.EINVAL). | // location, it returns (nil, syscall.EINVAL). | ||||||
| func ByteSliceFromString(s string) ([]byte, error) { | func ByteSliceFromString(s string) ([]byte, error) { | ||||||
| 	for i := 0; i < len(s); i++ { | 	if strings.IndexByte(s, 0) != -1 { | ||||||
| 		if s[i] == 0 { |  | ||||||
| 		return nil, syscall.EINVAL | 		return nil, syscall.EINVAL | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 	a := make([]byte, len(s)+1) | 	a := make([]byte, len(s)+1) | ||||||
| 	copy(a, s) | 	copy(a, s) | ||||||
| 	return a, nil | 	return a, nil | ||||||
| @ -53,6 +55,35 @@ func BytePtrFromString(s string) (*byte, error) { | |||||||
| 	return &a[0], nil | 	return &a[0], nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ByteSliceToString returns a string form of the text represented by the slice s, with a terminating NUL and any | ||||||
|  | // bytes after the NUL removed. | ||||||
|  | func ByteSliceToString(s []byte) string { | ||||||
|  | 	if i := bytes.IndexByte(s, 0); i != -1 { | ||||||
|  | 		s = s[:i] | ||||||
|  | 	} | ||||||
|  | 	return string(s) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BytePtrToString takes a pointer to a sequence of text and returns the corresponding string. | ||||||
|  | // If the pointer is nil, it returns the empty string. It assumes that the text sequence is terminated | ||||||
|  | // at a zero byte; if the zero byte is not present, the program may crash. | ||||||
|  | func BytePtrToString(p *byte) string { | ||||||
|  | 	if p == nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	if *p == 0 { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Find NUL terminator. | ||||||
|  | 	n := 0 | ||||||
|  | 	for ptr := unsafe.Pointer(p); *(*byte)(ptr) != 0; n++ { | ||||||
|  | 		ptr = unsafe.Pointer(uintptr(ptr) + 1) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return string(unsafe.Slice(p, n)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Single-word zero for use when we need a valid pointer to 0 bytes. | // Single-word zero for use when we need a valid pointer to 0 bytes. | ||||||
| // See mksyscall.pl. | // See mksyscall.pl. | ||||||
| var _zero uintptr | var _zero uintptr | ||||||
|  | |||||||
							
								
								
									
										629
									
								
								vendor/golang.org/x/sys/windows/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										629
									
								
								vendor/golang.org/x/sys/windows/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,17 +8,24 @@ package windows | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	errorspkg "errors" | 	errorspkg "errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"runtime" | ||||||
|  | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf16" | 	"unicode/utf16" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/sys/internal/unsafeheader" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Handle uintptr | type Handle uintptr | ||||||
|  | type HWND uintptr | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	InvalidHandle = ^Handle(0) | 	InvalidHandle = ^Handle(0) | ||||||
|  | 	InvalidHWND   = ^HWND(0) | ||||||
| 
 | 
 | ||||||
| 	// Flags for DefineDosDevice. | 	// Flags for DefineDosDevice. | ||||||
| 	DDD_EXACT_MATCH_ON_REMOVE = 0x00000004 | 	DDD_EXACT_MATCH_ON_REMOVE = 0x00000004 | ||||||
| @ -57,9 +64,12 @@ const ( | |||||||
| 	FILE_VOLUME_IS_COMPRESSED         = 0x00008000 | 	FILE_VOLUME_IS_COMPRESSED         = 0x00008000 | ||||||
| 	FILE_VOLUME_QUOTAS                = 0x00000020 | 	FILE_VOLUME_QUOTAS                = 0x00000020 | ||||||
| 
 | 
 | ||||||
| 	// Return values of SleepEx and other APC functions | 	// Flags for LockFileEx. | ||||||
| 	STATUS_USER_APC    = 0x000000C0 | 	LOCKFILE_FAIL_IMMEDIATELY = 0x00000001 | ||||||
| 	WAIT_IO_COMPLETION = STATUS_USER_APC | 	LOCKFILE_EXCLUSIVE_LOCK   = 0x00000002 | ||||||
|  | 
 | ||||||
|  | 	// Return value of SleepEx and other APC functions | ||||||
|  | 	WAIT_IO_COMPLETION = 0x000000C0 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // StringToUTF16 is deprecated. Use UTF16FromString instead. | // StringToUTF16 is deprecated. Use UTF16FromString instead. | ||||||
| @ -77,20 +87,18 @@ func StringToUTF16(s string) []uint16 { | |||||||
| // s, with a terminating NUL added. If s contains a NUL byte at any | // s, with a terminating NUL added. If s contains a NUL byte at any | ||||||
| // location, it returns (nil, syscall.EINVAL). | // location, it returns (nil, syscall.EINVAL). | ||||||
| func UTF16FromString(s string) ([]uint16, error) { | func UTF16FromString(s string) ([]uint16, error) { | ||||||
| 	for i := 0; i < len(s); i++ { | 	if strings.IndexByte(s, 0) != -1 { | ||||||
| 		if s[i] == 0 { |  | ||||||
| 		return nil, syscall.EINVAL | 		return nil, syscall.EINVAL | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 	return utf16.Encode([]rune(s + "\x00")), nil | 	return utf16.Encode([]rune(s + "\x00")), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, | // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, | ||||||
| // with a terminating NUL removed. | // with a terminating NUL and any bytes after the NUL removed. | ||||||
| func UTF16ToString(s []uint16) string { | func UTF16ToString(s []uint16) string { | ||||||
| 	for i, v := range s { | 	for i, v := range s { | ||||||
| 		if v == 0 { | 		if v == 0 { | ||||||
| 			s = s[0:i] | 			s = s[:i] | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @ -113,6 +121,26 @@ func UTF16PtrFromString(s string) (*uint16, error) { | |||||||
| 	return &a[0], nil | 	return &a[0], nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UTF16PtrToString takes a pointer to a UTF-16 sequence and returns the corresponding UTF-8 encoded string. | ||||||
|  | // If the pointer is nil, it returns the empty string. It assumes that the UTF-16 sequence is terminated | ||||||
|  | // at a zero word; if the zero word is not present, the program may crash. | ||||||
|  | func UTF16PtrToString(p *uint16) string { | ||||||
|  | 	if p == nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	if *p == 0 { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Find NUL terminator. | ||||||
|  | 	n := 0 | ||||||
|  | 	for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; n++ { | ||||||
|  | 		ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return string(utf16.Decode(unsafe.Slice(p, n))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func Getpagesize() int { return 4096 } | func Getpagesize() int { return 4096 } | ||||||
| 
 | 
 | ||||||
| // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. | // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. | ||||||
| @ -136,13 +164,23 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW | //sys	LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW | ||||||
| //sys	FreeLibrary(handle Handle) (err error) | //sys	FreeLibrary(handle Handle) (err error) | ||||||
| //sys	GetProcAddress(module Handle, procname string) (proc uintptr, err error) | //sys	GetProcAddress(module Handle, procname string) (proc uintptr, err error) | ||||||
|  | //sys	GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW | ||||||
|  | //sys	GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW | ||||||
|  | //sys	SetDefaultDllDirectories(directoryFlags uint32) (err error) | ||||||
|  | //sys	SetDllDirectory(path string) (err error) = kernel32.SetDllDirectoryW | ||||||
| //sys	GetVersion() (ver uint32, err error) | //sys	GetVersion() (ver uint32, err error) | ||||||
| //sys	FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW | //sys	FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW | ||||||
| //sys	ExitProcess(exitcode uint32) | //sys	ExitProcess(exitcode uint32) | ||||||
| //sys	IsWow64Process(handle Handle, isWow64 *bool) (err error) = IsWow64Process | //sys	IsWow64Process(handle Handle, isWow64 *bool) (err error) = IsWow64Process | ||||||
|  | //sys	IsWow64Process2(handle Handle, processMachine *uint16, nativeMachine *uint16) (err error) = IsWow64Process2? | ||||||
| //sys	CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile Handle) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW | //sys	CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile Handle) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW | ||||||
| //sys	ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) | //sys	CreateNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *SecurityAttributes) (handle Handle, err error)  [failretval==InvalidHandle] = CreateNamedPipeW | ||||||
| //sys	WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) | //sys	ConnectNamedPipe(pipe Handle, overlapped *Overlapped) (err error) | ||||||
|  | //sys	GetNamedPipeInfo(pipe Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) | ||||||
|  | //sys	GetNamedPipeHandleState(pipe Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW | ||||||
|  | //sys	SetNamedPipeHandleState(pipe Handle, state *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32) (err error) = SetNamedPipeHandleState | ||||||
|  | //sys	readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = ReadFile | ||||||
|  | //sys	writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = WriteFile | ||||||
| //sys	GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) | //sys	GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) | ||||||
| //sys	SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] | //sys	SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] | ||||||
| //sys	CloseHandle(handle Handle) (err error) | //sys	CloseHandle(handle Handle) (err error) | ||||||
| @ -153,6 +191,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	FindClose(handle Handle) (err error) | //sys	FindClose(handle Handle) (err error) | ||||||
| //sys	GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) | //sys	GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) | ||||||
| //sys	GetFileInformationByHandleEx(handle Handle, class uint32, outBuffer *byte, outBufferLen uint32) (err error) | //sys	GetFileInformationByHandleEx(handle Handle, class uint32, outBuffer *byte, outBufferLen uint32) (err error) | ||||||
|  | //sys	SetFileInformationByHandle(handle Handle, class uint32, inBuffer *byte, inBufferLen uint32) (err error) | ||||||
| //sys	GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW | //sys	GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW | ||||||
| //sys	SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW | //sys	SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW | ||||||
| //sys	CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW | //sys	CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW | ||||||
| @ -160,26 +199,34 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	DeleteFile(path *uint16) (err error) = DeleteFileW | //sys	DeleteFile(path *uint16) (err error) = DeleteFileW | ||||||
| //sys	MoveFile(from *uint16, to *uint16) (err error) = MoveFileW | //sys	MoveFile(from *uint16, to *uint16) (err error) = MoveFileW | ||||||
| //sys	MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW | //sys	MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW | ||||||
|  | //sys	LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) | ||||||
|  | //sys	UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) | ||||||
| //sys	GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW | //sys	GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW | ||||||
| //sys	GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW | //sys	GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW | ||||||
| //sys	SetEndOfFile(handle Handle) (err error) | //sys	SetEndOfFile(handle Handle) (err error) | ||||||
| //sys	GetSystemTimeAsFileTime(time *Filetime) | //sys	GetSystemTimeAsFileTime(time *Filetime) | ||||||
| //sys	GetSystemTimePreciseAsFileTime(time *Filetime) | //sys	GetSystemTimePreciseAsFileTime(time *Filetime) | ||||||
| //sys	GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] | //sys	GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] | ||||||
| //sys	CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) | //sys	CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uintptr, threadcnt uint32) (handle Handle, err error) | ||||||
| //sys	GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) | //sys	GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uintptr, overlapped **Overlapped, timeout uint32) (err error) | ||||||
| //sys	PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) | //sys	PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uintptr, overlapped *Overlapped) (err error) | ||||||
| //sys	CancelIo(s Handle) (err error) | //sys	CancelIo(s Handle) (err error) | ||||||
| //sys	CancelIoEx(s Handle, o *Overlapped) (err error) | //sys	CancelIoEx(s Handle, o *Overlapped) (err error) | ||||||
| //sys	CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW | //sys	CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW | ||||||
|  | //sys	CreateProcessAsUser(token Token, appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = advapi32.CreateProcessAsUserW | ||||||
|  | //sys   initializeProcThreadAttributeList(attrlist *ProcThreadAttributeList, attrcount uint32, flags uint32, size *uintptr) (err error) = InitializeProcThreadAttributeList | ||||||
|  | //sys   deleteProcThreadAttributeList(attrlist *ProcThreadAttributeList) = DeleteProcThreadAttributeList | ||||||
|  | //sys   updateProcThreadAttribute(attrlist *ProcThreadAttributeList, flags uint32, attr uintptr, value unsafe.Pointer, size uintptr, prevvalue unsafe.Pointer, returnedsize *uintptr) (err error) = UpdateProcThreadAttribute | ||||||
| //sys	OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) | //sys	OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) | ||||||
| //sys	ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) = shell32.ShellExecuteW | //sys	ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW | ||||||
|  | //sys	GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) = user32.GetWindowThreadProcessId | ||||||
|  | //sys	GetShellWindow() (shellWindow HWND) = user32.GetShellWindow | ||||||
|  | //sys	MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW | ||||||
|  | //sys	ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx | ||||||
| //sys	shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath | //sys	shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath | ||||||
| //sys	TerminateProcess(handle Handle, exitcode uint32) (err error) | //sys	TerminateProcess(handle Handle, exitcode uint32) (err error) | ||||||
| //sys	GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) | //sys	GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) | ||||||
| //sys	GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW | //sys	GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW | ||||||
| //sys	GetCurrentProcess() (pseudoHandle Handle, err error) |  | ||||||
| //sys	GetCurrentThread() (pseudoHandle Handle, err error) |  | ||||||
| //sys	GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) | //sys	GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) | ||||||
| //sys	DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) | //sys	DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) | ||||||
| //sys	WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] | //sys	WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] | ||||||
| @ -194,6 +241,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW | //sys	FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW | ||||||
| //sys	GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW | //sys	GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW | ||||||
| //sys	SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW | //sys	SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW | ||||||
|  | //sys	ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW | ||||||
| //sys	CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock | //sys	CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock | ||||||
| //sys	DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock | //sys	DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock | ||||||
| //sys	getTickCount64() (ms uint64) = kernel32.GetTickCount64 | //sys	getTickCount64() (ms uint64) = kernel32.GetTickCount64 | ||||||
| @ -204,12 +252,14 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW | //sys	GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW | ||||||
| //sys	CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW | //sys	CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW | ||||||
| //sys	LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] | //sys	LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] | ||||||
|  | //sys	LocalAlloc(flags uint32, length uint32) (ptr uintptr, err error) | ||||||
| //sys	SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) | //sys	SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) | ||||||
| //sys	FlushFileBuffers(handle Handle) (err error) | //sys	FlushFileBuffers(handle Handle) (err error) | ||||||
| //sys	GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW | //sys	GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW | ||||||
| //sys	GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW | //sys	GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW | ||||||
| //sys	GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW | //sys	GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW | ||||||
| //sys	CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW | //sys	GetFinalPathNameByHandle(file Handle, filePath *uint16, filePathSize uint32, flags uint32) (n uint32, err error) = kernel32.GetFinalPathNameByHandleW | ||||||
|  | //sys	CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateFileMappingW | ||||||
| //sys	MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) | //sys	MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) | ||||||
| //sys	UnmapViewOfFile(addr uintptr) (err error) | //sys	UnmapViewOfFile(addr uintptr) (err error) | ||||||
| //sys	FlushViewOfFile(addr uintptr, length uintptr) (err error) | //sys	FlushViewOfFile(addr uintptr, length uintptr) (err error) | ||||||
| @ -218,30 +268,56 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc | //sys	VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc | ||||||
| //sys	VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree | //sys	VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree | ||||||
| //sys	VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect | //sys	VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect | ||||||
|  | //sys	VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) = kernel32.VirtualProtectEx | ||||||
|  | //sys	VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQuery | ||||||
|  | //sys	VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQueryEx | ||||||
|  | //sys	ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) = kernel32.ReadProcessMemory | ||||||
|  | //sys	WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) = kernel32.WriteProcessMemory | ||||||
| //sys	TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile | //sys	TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile | ||||||
| //sys	ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW | //sys	ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW | ||||||
|  | //sys	FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.FindFirstChangeNotificationW | ||||||
|  | //sys	FindNextChangeNotification(handle Handle) (err error) | ||||||
|  | //sys	FindCloseChangeNotification(handle Handle) (err error) | ||||||
| //sys	CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW | //sys	CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW | ||||||
| //sys   CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore | //sys	CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) = crypt32.CertOpenStore | ||||||
| //sys	CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore | //sys	CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore | ||||||
| //sys	CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore | //sys	CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore | ||||||
| //sys	CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore | //sys	CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore | ||||||
|  | //sys	CertDeleteCertificateFromStore(certContext *CertContext) (err error) = crypt32.CertDeleteCertificateFromStore | ||||||
|  | //sys	CertDuplicateCertificateContext(certContext *CertContext) (dupContext *CertContext) = crypt32.CertDuplicateCertificateContext | ||||||
|  | //sys	PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) = crypt32.PFXImportCertStore | ||||||
| //sys	CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain | //sys	CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain | ||||||
| //sys	CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain | //sys	CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain | ||||||
| //sys	CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext | //sys	CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext | ||||||
| //sys	CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext | //sys	CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext | ||||||
| //sys	CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy | //sys	CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy | ||||||
|  | //sys	CertGetNameString(certContext *CertContext, nameType uint32, flags uint32, typePara unsafe.Pointer, name *uint16, size uint32) (chars uint32) = crypt32.CertGetNameStringW | ||||||
|  | //sys	CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension | ||||||
|  | //sys   CertFindCertificateInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevCertContext *CertContext) (cert *CertContext, err error) [failretval==nil] = crypt32.CertFindCertificateInStore | ||||||
|  | //sys   CertFindChainInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevChainContext *CertChainContext) (certchain *CertChainContext, err error) [failretval==nil] = crypt32.CertFindChainInStore | ||||||
|  | //sys   CryptAcquireCertificatePrivateKey(cert *CertContext, flags uint32, parameters unsafe.Pointer, cryptProvOrNCryptKey *Handle, keySpec *uint32, callerFreeProvOrNCryptKey *bool) (err error) = crypt32.CryptAcquireCertificatePrivateKey | ||||||
|  | //sys	CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject | ||||||
|  | //sys	CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject | ||||||
|  | //sys	CryptProtectData(dataIn *DataBlob, name *uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptProtectData | ||||||
|  | //sys	CryptUnprotectData(dataIn *DataBlob, name **uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptUnprotectData | ||||||
|  | //sys	WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) = wintrust.WinVerifyTrustEx | ||||||
| //sys	RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW | //sys	RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW | ||||||
| //sys	RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey | //sys	RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey | ||||||
| //sys	RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW | //sys	RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW | ||||||
| //sys	RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW | //sys	RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW | ||||||
| //sys	RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW | //sys	RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW | ||||||
|  | //sys	RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) = advapi32.RegNotifyChangeKeyValue | ||||||
| //sys	GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId | //sys	GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId | ||||||
|  | //sys	ProcessIdToSessionId(pid uint32, sessionid *uint32) (err error) = kernel32.ProcessIdToSessionId | ||||||
| //sys	GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode | //sys	GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode | ||||||
| //sys	SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode | //sys	SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode | ||||||
| //sys	GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo | //sys	GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo | ||||||
|  | //sys	setConsoleCursorPosition(console Handle, position uint32) (err error) = kernel32.SetConsoleCursorPosition | ||||||
| //sys	WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW | //sys	WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW | ||||||
| //sys	ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW | //sys	ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW | ||||||
| //sys	CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot | //sys	CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot | ||||||
|  | //sys	Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW | ||||||
|  | //sys	Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32NextW | ||||||
| //sys	Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW | //sys	Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW | ||||||
| //sys	Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW | //sys	Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW | ||||||
| //sys	Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) | //sys	Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) | ||||||
| @ -251,12 +327,16 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW | //sys	CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW | ||||||
| //sys	CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW | //sys	CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW | ||||||
| //sys	GetCurrentThreadId() (id uint32) | //sys	GetCurrentThreadId() (id uint32) | ||||||
| //sys	CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW | //sys	CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateEventW | ||||||
| //sys	CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW | //sys	CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateEventExW | ||||||
| //sys	OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW | //sys	OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW | ||||||
| //sys	SetEvent(event Handle) (err error) = kernel32.SetEvent | //sys	SetEvent(event Handle) (err error) = kernel32.SetEvent | ||||||
| //sys	ResetEvent(event Handle) (err error) = kernel32.ResetEvent | //sys	ResetEvent(event Handle) (err error) = kernel32.ResetEvent | ||||||
| //sys	PulseEvent(event Handle) (err error) = kernel32.PulseEvent | //sys	PulseEvent(event Handle) (err error) = kernel32.PulseEvent | ||||||
|  | //sys	CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateMutexW | ||||||
|  | //sys	CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateMutexExW | ||||||
|  | //sys	OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenMutexW | ||||||
|  | //sys	ReleaseMutex(mutex Handle) (err error) = kernel32.ReleaseMutex | ||||||
| //sys	SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx | //sys	SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx | ||||||
| //sys	CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW | //sys	CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW | ||||||
| //sys	AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject | //sys	AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject | ||||||
| @ -265,10 +345,28 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread | //sys	ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread | ||||||
| //sys	SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass | //sys	SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass | ||||||
| //sys	GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass | //sys	GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass | ||||||
|  | //sys	QueryInformationJobObject(job Handle, JobObjectInformationClass int32, JobObjectInformation uintptr, JobObjectInformationLength uint32, retlen *uint32) (err error) = kernel32.QueryInformationJobObject | ||||||
| //sys	SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) | //sys	SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) | ||||||
| //sys	GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) | //sys	GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) | ||||||
| //sys	GetProcessId(process Handle) (id uint32, err error) | //sys	GetProcessId(process Handle) (id uint32, err error) | ||||||
|  | //sys	QueryFullProcessImageName(proc Handle, flags uint32, exeName *uint16, size *uint32) (err error) = kernel32.QueryFullProcessImageNameW | ||||||
| //sys	OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) | //sys	OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) | ||||||
|  | //sys	SetProcessPriorityBoost(process Handle, disable bool) (err error) = kernel32.SetProcessPriorityBoost | ||||||
|  | //sys	GetProcessWorkingSetSizeEx(hProcess Handle, lpMinimumWorkingSetSize *uintptr, lpMaximumWorkingSetSize *uintptr, flags *uint32) | ||||||
|  | //sys	SetProcessWorkingSetSizeEx(hProcess Handle, dwMinimumWorkingSetSize uintptr, dwMaximumWorkingSetSize uintptr, flags uint32) (err error) | ||||||
|  | //sys	GetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error) | ||||||
|  | //sys	SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error) | ||||||
|  | //sys	GetActiveProcessorCount(groupNumber uint16) (ret uint32) | ||||||
|  | //sys	GetMaximumProcessorCount(groupNumber uint16) (ret uint32) | ||||||
|  | //sys	EnumWindows(enumFunc uintptr, param unsafe.Pointer) (err error) = user32.EnumWindows | ||||||
|  | //sys	EnumChildWindows(hwnd HWND, enumFunc uintptr, param unsafe.Pointer) = user32.EnumChildWindows | ||||||
|  | //sys	GetClassName(hwnd HWND, className *uint16, maxCount int32) (copied int32, err error) = user32.GetClassNameW | ||||||
|  | //sys	GetDesktopWindow() (hwnd HWND) = user32.GetDesktopWindow | ||||||
|  | //sys	GetForegroundWindow() (hwnd HWND) = user32.GetForegroundWindow | ||||||
|  | //sys	IsWindow(hwnd HWND) (isWindow bool) = user32.IsWindow | ||||||
|  | //sys	IsWindowUnicode(hwnd HWND) (isUnicode bool) = user32.IsWindowUnicode | ||||||
|  | //sys	IsWindowVisible(hwnd HWND) (isVisible bool) = user32.IsWindowVisible | ||||||
|  | //sys	GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) = user32.GetGUIThreadInfo | ||||||
| 
 | 
 | ||||||
| // Volume Management Functions | // Volume Management Functions | ||||||
| //sys	DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW | //sys	DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW | ||||||
| @ -279,6 +377,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW | //sys	FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW | ||||||
| //sys	FindVolumeClose(findVolume Handle) (err error) | //sys	FindVolumeClose(findVolume Handle) (err error) | ||||||
| //sys	FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) | //sys	FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) | ||||||
|  | //sys	GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = GetDiskFreeSpaceExW | ||||||
| //sys	GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW | //sys	GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW | ||||||
| //sys	GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0] | //sys	GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0] | ||||||
| //sys	GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW | //sys	GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW | ||||||
| @ -290,26 +389,100 @@ func NewCallbackCDecl(fn interface{}) uintptr { | |||||||
| //sys	QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW | //sys	QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW | ||||||
| //sys	SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW | //sys	SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW | ||||||
| //sys	SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW | //sys	SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW | ||||||
| //sys	MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW | //sys	InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW | ||||||
|  | //sys	SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters | ||||||
|  | //sys	GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters | ||||||
| //sys	clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString | //sys	clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString | ||||||
| //sys	stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2 | //sys	stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2 | ||||||
| //sys	coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid | //sys	coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid | ||||||
| //sys	CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree | //sys	CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree | ||||||
| //sys	rtlGetVersion(info *OsVersionInfoEx) (ret error) = ntdll.RtlGetVersion | //sys	CoInitializeEx(reserved uintptr, coInit uint32) (ret error) = ole32.CoInitializeEx | ||||||
|  | //sys	CoUninitialize() = ole32.CoUninitialize | ||||||
|  | //sys	CoGetObject(name *uint16, bindOpts *BIND_OPTS3, guid *GUID, functionTable **uintptr) (ret error) = ole32.CoGetObject | ||||||
|  | //sys	getProcessPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetProcessPreferredUILanguages | ||||||
|  | //sys	getThreadPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetThreadPreferredUILanguages | ||||||
|  | //sys	getUserPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetUserPreferredUILanguages | ||||||
|  | //sys	getSystemPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetSystemPreferredUILanguages | ||||||
|  | //sys	findResource(module Handle, name uintptr, resType uintptr) (resInfo Handle, err error) = kernel32.FindResourceW | ||||||
|  | //sys	SizeofResource(module Handle, resInfo Handle) (size uint32, err error) = kernel32.SizeofResource | ||||||
|  | //sys	LoadResource(module Handle, resInfo Handle) (resData Handle, err error) = kernel32.LoadResource | ||||||
|  | //sys	LockResource(resData Handle) (addr uintptr, err error) = kernel32.LockResource | ||||||
|  | 
 | ||||||
|  | // Version APIs | ||||||
|  | //sys	GetFileVersionInfoSize(filename string, zeroHandle *Handle) (bufSize uint32, err error) = version.GetFileVersionInfoSizeW | ||||||
|  | //sys	GetFileVersionInfo(filename string, handle uint32, bufSize uint32, buffer unsafe.Pointer) (err error) = version.GetFileVersionInfoW | ||||||
|  | //sys	VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) = version.VerQueryValueW | ||||||
|  | 
 | ||||||
|  | // Process Status API (PSAPI) | ||||||
|  | //sys	EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses | ||||||
|  | //sys	EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) = psapi.EnumProcessModules | ||||||
|  | //sys	EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) = psapi.EnumProcessModulesEx | ||||||
|  | //sys	GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation | ||||||
|  | //sys	GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) = psapi.GetModuleFileNameExW | ||||||
|  | //sys	GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) = psapi.GetModuleBaseNameW | ||||||
|  | //sys   QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) = psapi.QueryWorkingSetEx | ||||||
|  | 
 | ||||||
|  | // NT Native APIs | ||||||
|  | //sys	rtlNtStatusToDosErrorNoTeb(ntstatus NTStatus) (ret syscall.Errno) = ntdll.RtlNtStatusToDosErrorNoTeb | ||||||
|  | //sys	rtlGetVersion(info *OsVersionInfoEx) (ntstatus error) = ntdll.RtlGetVersion | ||||||
|  | //sys	rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers | ||||||
|  | //sys	RtlGetCurrentPeb() (peb *PEB) = ntdll.RtlGetCurrentPeb | ||||||
|  | //sys	RtlInitUnicodeString(destinationString *NTUnicodeString, sourceString *uint16) = ntdll.RtlInitUnicodeString | ||||||
|  | //sys	RtlInitString(destinationString *NTString, sourceString *byte) = ntdll.RtlInitString | ||||||
|  | //sys	NtCreateFile(handle *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, allocationSize *int64, attributes uint32, share uint32, disposition uint32, options uint32, eabuffer uintptr, ealength uint32) (ntstatus error) = ntdll.NtCreateFile | ||||||
|  | //sys	NtCreateNamedPipeFile(pipe *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (ntstatus error) = ntdll.NtCreateNamedPipeFile | ||||||
|  | //sys	NtSetInformationFile(handle Handle, iosb *IO_STATUS_BLOCK, inBuffer *byte, inBufferLen uint32, class uint32) (ntstatus error) = ntdll.NtSetInformationFile | ||||||
|  | //sys	RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToNtPathName_U_WithStatus | ||||||
|  | //sys	RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToRelativeNtPathName_U_WithStatus | ||||||
|  | //sys	RtlDefaultNpAcl(acl **ACL) (ntstatus error) = ntdll.RtlDefaultNpAcl | ||||||
|  | //sys	NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQueryInformationProcess | ||||||
|  | //sys	NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) = ntdll.NtSetInformationProcess | ||||||
|  | //sys	NtQuerySystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQuerySystemInformation | ||||||
|  | //sys	NtSetSystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32) (ntstatus error) = ntdll.NtSetSystemInformation | ||||||
|  | //sys	RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) = ntdll.RtlAddFunctionTable | ||||||
|  | //sys	RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) = ntdll.RtlDeleteFunctionTable | ||||||
|  | 
 | ||||||
|  | // Desktop Window Manager API (Dwmapi) | ||||||
|  | //sys	DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmGetWindowAttribute | ||||||
|  | //sys	DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmSetWindowAttribute | ||||||
| 
 | 
 | ||||||
| // syscall interface implementation for other packages | // syscall interface implementation for other packages | ||||||
| 
 | 
 | ||||||
|  | // GetCurrentProcess returns the handle for the current process. | ||||||
|  | // It is a pseudo handle that does not need to be closed. | ||||||
|  | // The returned error is always nil. | ||||||
|  | // | ||||||
|  | // Deprecated: use CurrentProcess for the same Handle without the nil | ||||||
|  | // error. | ||||||
|  | func GetCurrentProcess() (Handle, error) { | ||||||
|  | 	return CurrentProcess(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CurrentProcess returns the handle for the current process. | ||||||
|  | // It is a pseudo handle that does not need to be closed. | ||||||
|  | func CurrentProcess() Handle { return Handle(^uintptr(1 - 1)) } | ||||||
|  | 
 | ||||||
|  | // GetCurrentThread returns the handle for the current thread. | ||||||
|  | // It is a pseudo handle that does not need to be closed. | ||||||
|  | // The returned error is always nil. | ||||||
|  | // | ||||||
|  | // Deprecated: use CurrentThread for the same Handle without the nil | ||||||
|  | // error. | ||||||
|  | func GetCurrentThread() (Handle, error) { | ||||||
|  | 	return CurrentThread(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CurrentThread returns the handle for the current thread. | ||||||
|  | // It is a pseudo handle that does not need to be closed. | ||||||
|  | func CurrentThread() Handle { return Handle(^uintptr(2 - 1)) } | ||||||
|  | 
 | ||||||
| // GetProcAddressByOrdinal retrieves the address of the exported | // GetProcAddressByOrdinal retrieves the address of the exported | ||||||
| // function from module by ordinal. | // function from module by ordinal. | ||||||
| func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { | func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { | ||||||
| 	r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0) | 	r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0) | ||||||
| 	proc = uintptr(r0) | 	proc = uintptr(r0) | ||||||
| 	if proc == 0 { | 	if proc == 0 { | ||||||
| 		if e1 != 0 { |  | ||||||
| 		err = errnoErr(e1) | 		err = errnoErr(e1) | ||||||
| 		} else { |  | ||||||
| 			err = syscall.EINVAL |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| @ -365,7 +538,11 @@ func Open(path string, mode int, perm uint32) (fd Handle, err error) { | |||||||
| 	default: | 	default: | ||||||
| 		createmode = OPEN_EXISTING | 		createmode = OPEN_EXISTING | ||||||
| 	} | 	} | ||||||
| 	h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) | 	var attrs uint32 = FILE_ATTRIBUTE_NORMAL | ||||||
|  | 	if perm&S_IWRITE == 0 { | ||||||
|  | 		attrs = FILE_ATTRIBUTE_READONLY | ||||||
|  | 	} | ||||||
|  | 	h, e := CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0) | ||||||
| 	return h, e | 	return h, e | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -379,12 +556,6 @@ func Read(fd Handle, p []byte) (n int, err error) { | |||||||
| 		} | 		} | ||||||
| 		return 0, e | 		return 0, e | ||||||
| 	} | 	} | ||||||
| 	if raceenabled { |  | ||||||
| 		if done > 0 { |  | ||||||
| 			raceWriteRange(unsafe.Pointer(&p[0]), int(done)) |  | ||||||
| 		} |  | ||||||
| 		raceAcquire(unsafe.Pointer(&ioSync)) |  | ||||||
| 	} |  | ||||||
| 	return int(done), nil | 	return int(done), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -397,12 +568,31 @@ func Write(fd Handle, p []byte) (n int, err error) { | |||||||
| 	if e != nil { | 	if e != nil { | ||||||
| 		return 0, e | 		return 0, e | ||||||
| 	} | 	} | ||||||
| 	if raceenabled && done > 0 { |  | ||||||
| 		raceReadRange(unsafe.Pointer(&p[0]), int(done)) |  | ||||||
| 	} |  | ||||||
| 	return int(done), nil | 	return int(done), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func ReadFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error { | ||||||
|  | 	err := readFile(fd, p, done, overlapped) | ||||||
|  | 	if raceenabled { | ||||||
|  | 		if *done > 0 { | ||||||
|  | 			raceWriteRange(unsafe.Pointer(&p[0]), int(*done)) | ||||||
|  | 		} | ||||||
|  | 		raceAcquire(unsafe.Pointer(&ioSync)) | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func WriteFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error { | ||||||
|  | 	if raceenabled { | ||||||
|  | 		raceReleaseMerge(unsafe.Pointer(&ioSync)) | ||||||
|  | 	} | ||||||
|  | 	err := writeFile(fd, p, done, overlapped) | ||||||
|  | 	if raceenabled && *done > 0 { | ||||||
|  | 		raceReadRange(unsafe.Pointer(&p[0]), int(*done)) | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var ioSync int64 | var ioSync int64 | ||||||
| 
 | 
 | ||||||
| func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { | func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { | ||||||
| @ -441,7 +631,6 @@ var ( | |||||||
| 
 | 
 | ||||||
| func getStdHandle(stdhandle uint32) (fd Handle) { | func getStdHandle(stdhandle uint32) (fd Handle) { | ||||||
| 	r, _ := GetStdHandle(stdhandle) | 	r, _ := GetStdHandle(stdhandle) | ||||||
| 	CloseOnExec(r) |  | ||||||
| 	return r | 	return r | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -566,7 +755,7 @@ func Utimes(path string, tv []Timeval) (err error) { | |||||||
| 	if e != nil { | 	if e != nil { | ||||||
| 		return e | 		return e | ||||||
| 	} | 	} | ||||||
| 	defer Close(h) | 	defer CloseHandle(h) | ||||||
| 	a := NsecToFiletime(tv[0].Nanoseconds()) | 	a := NsecToFiletime(tv[0].Nanoseconds()) | ||||||
| 	w := NsecToFiletime(tv[1].Nanoseconds()) | 	w := NsecToFiletime(tv[1].Nanoseconds()) | ||||||
| 	return SetFileTime(h, nil, &a, &w) | 	return SetFileTime(h, nil, &a, &w) | ||||||
| @ -586,7 +775,7 @@ func UtimesNano(path string, ts []Timespec) (err error) { | |||||||
| 	if e != nil { | 	if e != nil { | ||||||
| 		return e | 		return e | ||||||
| 	} | 	} | ||||||
| 	defer Close(h) | 	defer CloseHandle(h) | ||||||
| 	a := NsecToFiletime(TimespecToNsec(ts[0])) | 	a := NsecToFiletime(TimespecToNsec(ts[0])) | ||||||
| 	w := NsecToFiletime(TimespecToNsec(ts[1])) | 	w := NsecToFiletime(TimespecToNsec(ts[1])) | ||||||
| 	return SetFileTime(h, nil, &a, &w) | 	return SetFileTime(h, nil, &a, &w) | ||||||
| @ -645,6 +834,8 @@ const socket_error = uintptr(^uint32(0)) | |||||||
| //sys	WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup | //sys	WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup | ||||||
| //sys	WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl | //sys	WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl | ||||||
| //sys	socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket | //sys	socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket | ||||||
|  | //sys	sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto | ||||||
|  | //sys	recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom | ||||||
| //sys	Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt | //sys	Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt | ||||||
| //sys	Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt | //sys	Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt | ||||||
| //sys	bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind | //sys	bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind | ||||||
| @ -660,6 +851,7 @@ const socket_error = uintptr(^uint32(0)) | |||||||
| //sys	WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend | //sys	WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend | ||||||
| //sys	WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32,  from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom | //sys	WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32,  from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom | ||||||
| //sys	WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32,  overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo | //sys	WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32,  overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo | ||||||
|  | //sys	WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.WSASocketW | ||||||
| //sys	GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname | //sys	GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname | ||||||
| //sys	GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname | //sys	GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname | ||||||
| //sys	Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs | //sys	Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs | ||||||
| @ -673,9 +865,11 @@ const socket_error = uintptr(^uint32(0)) | |||||||
| //sys	GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo | //sys	GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo | ||||||
| //sys	SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes | //sys	SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes | ||||||
| //sys	WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW | //sys	WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW | ||||||
|  | //sys	WSAGetOverlappedResult(h Handle, o *Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult | ||||||
| //sys	GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses | //sys	GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses | ||||||
| //sys	GetACP() (acp uint32) = kernel32.GetACP | //sys	GetACP() (acp uint32) = kernel32.GetACP | ||||||
| //sys	MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar | //sys	MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar | ||||||
|  | //sys	getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx | ||||||
| 
 | 
 | ||||||
| // For testing: clients can set this flag to force | // For testing: clients can set this flag to force | ||||||
| // creation of IPv6 sockets to return EAFNOSUPPORT. | // creation of IPv6 sockets to return EAFNOSUPPORT. | ||||||
| @ -724,9 +918,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { | |||||||
| 	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) | 	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) | ||||||
| 	p[0] = byte(sa.Port >> 8) | 	p[0] = byte(sa.Port >> 8) | ||||||
| 	p[1] = byte(sa.Port) | 	p[1] = byte(sa.Port) | ||||||
| 	for i := 0; i < len(sa.Addr); i++ { | 	sa.raw.Addr = sa.Addr | ||||||
| 		sa.raw.Addr[i] = sa.Addr[i] |  | ||||||
| 	} |  | ||||||
| 	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil | 	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -746,9 +938,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { | |||||||
| 	p[0] = byte(sa.Port >> 8) | 	p[0] = byte(sa.Port >> 8) | ||||||
| 	p[1] = byte(sa.Port) | 	p[1] = byte(sa.Port) | ||||||
| 	sa.raw.Scope_id = sa.ZoneId | 	sa.raw.Scope_id = sa.ZoneId | ||||||
| 	for i := 0; i < len(sa.Addr); i++ { | 	sa.raw.Addr = sa.Addr | ||||||
| 		sa.raw.Addr[i] = sa.Addr[i] |  | ||||||
| 	} |  | ||||||
| 	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil | 	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -789,6 +979,32 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { | |||||||
| 	return unsafe.Pointer(&sa.raw), sl, nil | 	return unsafe.Pointer(&sa.raw), sl, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type RawSockaddrBth struct { | ||||||
|  | 	AddressFamily  [2]byte | ||||||
|  | 	BtAddr         [8]byte | ||||||
|  | 	ServiceClassId [16]byte | ||||||
|  | 	Port           [4]byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SockaddrBth struct { | ||||||
|  | 	BtAddr         uint64 | ||||||
|  | 	ServiceClassId GUID | ||||||
|  | 	Port           uint32 | ||||||
|  | 
 | ||||||
|  | 	raw RawSockaddrBth | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (sa *SockaddrBth) sockaddr() (unsafe.Pointer, int32, error) { | ||||||
|  | 	family := AF_BTH | ||||||
|  | 	sa.raw = RawSockaddrBth{ | ||||||
|  | 		AddressFamily:  *(*[2]byte)(unsafe.Pointer(&family)), | ||||||
|  | 		BtAddr:         *(*[8]byte)(unsafe.Pointer(&sa.BtAddr)), | ||||||
|  | 		Port:           *(*[4]byte)(unsafe.Pointer(&sa.Port)), | ||||||
|  | 		ServiceClassId: *(*[16]byte)(unsafe.Pointer(&sa.ServiceClassId)), | ||||||
|  | 	} | ||||||
|  | 	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { | func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { | ||||||
| 	switch rsa.Addr.Family { | 	switch rsa.Addr.Family { | ||||||
| 	case AF_UNIX: | 	case AF_UNIX: | ||||||
| @ -812,7 +1028,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { | |||||||
| 		for n < len(pp.Path) && pp.Path[n] != 0 { | 		for n < len(pp.Path) && pp.Path[n] != 0 { | ||||||
| 			n++ | 			n++ | ||||||
| 		} | 		} | ||||||
| 		bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | 		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | ||||||
| 		sa.Name = string(bytes) | 		sa.Name = string(bytes) | ||||||
| 		return sa, nil | 		return sa, nil | ||||||
| 
 | 
 | ||||||
| @ -821,9 +1037,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { | |||||||
| 		sa := new(SockaddrInet4) | 		sa := new(SockaddrInet4) | ||||||
| 		p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | 		p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | ||||||
| 		sa.Port = int(p[0])<<8 + int(p[1]) | 		sa.Port = int(p[0])<<8 + int(p[1]) | ||||||
| 		for i := 0; i < len(sa.Addr); i++ { | 		sa.Addr = pp.Addr | ||||||
| 			sa.Addr[i] = pp.Addr[i] |  | ||||||
| 		} |  | ||||||
| 		return sa, nil | 		return sa, nil | ||||||
| 
 | 
 | ||||||
| 	case AF_INET6: | 	case AF_INET6: | ||||||
| @ -832,9 +1046,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { | |||||||
| 		p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | 		p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | ||||||
| 		sa.Port = int(p[0])<<8 + int(p[1]) | 		sa.Port = int(p[0])<<8 + int(p[1]) | ||||||
| 		sa.ZoneId = pp.Scope_id | 		sa.ZoneId = pp.Scope_id | ||||||
| 		for i := 0; i < len(sa.Addr); i++ { | 		sa.Addr = pp.Addr | ||||||
| 			sa.Addr[i] = pp.Addr[i] |  | ||||||
| 		} |  | ||||||
| 		return sa, nil | 		return sa, nil | ||||||
| 	} | 	} | ||||||
| 	return nil, syscall.EAFNOSUPPORT | 	return nil, syscall.EAFNOSUPPORT | ||||||
| @ -868,6 +1080,14 @@ func Connect(fd Handle, sa Sockaddr) (err error) { | |||||||
| 	return connect(fd, ptr, n) | 	return connect(fd, ptr, n) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func GetBestInterfaceEx(sa Sockaddr, pdwBestIfIndex *uint32) (err error) { | ||||||
|  | 	ptr, _, err := sa.sockaddr() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return getBestInterfaceEx(ptr, pdwBestIfIndex) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func Getsockname(fd Handle) (sa Sockaddr, err error) { | func Getsockname(fd Handle) (sa Sockaddr, err error) { | ||||||
| 	var rsa RawSockaddrAny | 	var rsa RawSockaddrAny | ||||||
| 	l := int32(unsafe.Sizeof(rsa)) | 	l := int32(unsafe.Sizeof(rsa)) | ||||||
| @ -895,10 +1115,14 @@ func Shutdown(fd Handle, how int) (err error) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { | func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { | ||||||
| 	rsa, l, err := to.sockaddr() | 	var rsa unsafe.Pointer | ||||||
|  | 	var l int32 | ||||||
|  | 	if to != nil { | ||||||
|  | 		rsa, l, err = to.sockaddr() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
| 	return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) | 	return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1000,11 +1224,7 @@ func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlap | |||||||
| 	} | 	} | ||||||
| 	r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) | 	r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) | ||||||
| 	if r1 == socket_error { | 	if r1 == socket_error { | ||||||
| 		if e1 != 0 { |  | ||||||
| 		err = errnoErr(e1) | 		err = errnoErr(e1) | ||||||
| 		} else { |  | ||||||
| 			err = syscall.EINVAL |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| @ -1016,11 +1236,7 @@ func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overl | |||||||
| 	} | 	} | ||||||
| 	r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0) | 	r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0) | ||||||
| 	if r1 == socket_error { | 	if r1 == socket_error { | ||||||
| 		if e1 != 0 { |  | ||||||
| 		err = errnoErr(e1) | 		err = errnoErr(e1) | ||||||
| 		} else { |  | ||||||
| 			err = syscall.EINVAL |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| @ -1073,10 +1289,27 @@ func NsecToTimespec(nsec int64) (ts Timespec) { | |||||||
| // TODO(brainman): fix all needed for net | // TODO(brainman): fix all needed for net | ||||||
| 
 | 
 | ||||||
| func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } | func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } | ||||||
|  | 
 | ||||||
| func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { | func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { | ||||||
| 	return 0, nil, syscall.EWINDOWS | 	var rsa RawSockaddrAny | ||||||
|  | 	l := int32(unsafe.Sizeof(rsa)) | ||||||
|  | 	n32, err := recvfrom(fd, p, int32(flags), &rsa, &l) | ||||||
|  | 	n = int(n32) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	from, err = rsa.Sockaddr() | ||||||
|  | 	return | ||||||
| } | } | ||||||
| func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error)       { return syscall.EWINDOWS } | 
 | ||||||
|  | func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { | ||||||
|  | 	ptr, l, err := to.sockaddr() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return sendto(fd, p, int32(flags), ptr, l) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } | func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } | ||||||
| 
 | 
 | ||||||
| // The Linger struct is wrong but we only noticed after Go 1. | // The Linger struct is wrong but we only noticed after Go 1. | ||||||
| @ -1106,7 +1339,12 @@ type IPv6Mreq struct { | |||||||
| 	Interface uint32 | 	Interface uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS } | func GetsockoptInt(fd Handle, level, opt int) (int, error) { | ||||||
|  | 	v := int32(0) | ||||||
|  | 	l := int32(unsafe.Sizeof(v)) | ||||||
|  | 	err := Getsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), &l) | ||||||
|  | 	return int(v), err | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { | func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { | ||||||
| 	sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} | 	sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} | ||||||
| @ -1303,11 +1541,11 @@ func (t Token) KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, e | |||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	defer CoTaskMemFree(unsafe.Pointer(p)) | 	defer CoTaskMemFree(unsafe.Pointer(p)) | ||||||
| 	return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:]), nil | 	return UTF16PtrToString(p), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // RtlGetVersion returns the true version of the underlying operating system, ignoring | // RtlGetVersion returns the version of the underlying operating system, ignoring | ||||||
| // any manifesting or compatibility layers on top of the win32 layer. | // manifest semantics but is affected by the application compatibility layer. | ||||||
| func RtlGetVersion() *OsVersionInfoEx { | func RtlGetVersion() *OsVersionInfoEx { | ||||||
| 	info := &OsVersionInfoEx{} | 	info := &OsVersionInfoEx{} | ||||||
| 	info.osVersionInfoSize = uint32(unsafe.Sizeof(*info)) | 	info.osVersionInfoSize = uint32(unsafe.Sizeof(*info)) | ||||||
| @ -1318,3 +1556,260 @@ func RtlGetVersion() *OsVersionInfoEx { | |||||||
| 	_ = rtlGetVersion(info) | 	_ = rtlGetVersion(info) | ||||||
| 	return info | 	return info | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // RtlGetNtVersionNumbers returns the version of the underlying operating system, | ||||||
|  | // ignoring manifest semantics and the application compatibility layer. | ||||||
|  | func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) { | ||||||
|  | 	rtlGetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber) | ||||||
|  | 	buildNumber &= 0xffff | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetProcessPreferredUILanguages retrieves the process preferred UI languages. | ||||||
|  | func GetProcessPreferredUILanguages(flags uint32) ([]string, error) { | ||||||
|  | 	return getUILanguages(flags, getProcessPreferredUILanguages) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetThreadPreferredUILanguages retrieves the thread preferred UI languages for the current thread. | ||||||
|  | func GetThreadPreferredUILanguages(flags uint32) ([]string, error) { | ||||||
|  | 	return getUILanguages(flags, getThreadPreferredUILanguages) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetUserPreferredUILanguages retrieves information about the user preferred UI languages. | ||||||
|  | func GetUserPreferredUILanguages(flags uint32) ([]string, error) { | ||||||
|  | 	return getUILanguages(flags, getUserPreferredUILanguages) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetSystemPreferredUILanguages retrieves the system preferred UI languages. | ||||||
|  | func GetSystemPreferredUILanguages(flags uint32) ([]string, error) { | ||||||
|  | 	return getUILanguages(flags, getSystemPreferredUILanguages) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func getUILanguages(flags uint32, f func(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) error) ([]string, error) { | ||||||
|  | 	size := uint32(128) | ||||||
|  | 	for { | ||||||
|  | 		var numLanguages uint32 | ||||||
|  | 		buf := make([]uint16, size) | ||||||
|  | 		err := f(flags, &numLanguages, &buf[0], &size) | ||||||
|  | 		if err == ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		buf = buf[:size] | ||||||
|  | 		if numLanguages == 0 || len(buf) == 0 { // GetProcessPreferredUILanguages may return numLanguages==0 with "\0\0" | ||||||
|  | 			return []string{}, nil | ||||||
|  | 		} | ||||||
|  | 		if buf[len(buf)-1] == 0 { | ||||||
|  | 			buf = buf[:len(buf)-1] // remove terminating null | ||||||
|  | 		} | ||||||
|  | 		languages := make([]string, 0, numLanguages) | ||||||
|  | 		from := 0 | ||||||
|  | 		for i, c := range buf { | ||||||
|  | 			if c == 0 { | ||||||
|  | 				languages = append(languages, string(utf16.Decode(buf[from:i]))) | ||||||
|  | 				from = i + 1 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return languages, nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func SetConsoleCursorPosition(console Handle, position Coord) error { | ||||||
|  | 	return setConsoleCursorPosition(console, *((*uint32)(unsafe.Pointer(&position)))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s NTStatus) Errno() syscall.Errno { | ||||||
|  | 	return rtlNtStatusToDosErrorNoTeb(s) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func langID(pri, sub uint16) uint32 { return uint32(sub)<<10 | uint32(pri) } | ||||||
|  | 
 | ||||||
|  | func (s NTStatus) Error() string { | ||||||
|  | 	b := make([]uint16, 300) | ||||||
|  | 	n, err := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_ARGUMENT_ARRAY, modntdll.Handle(), uint32(s), langID(LANG_ENGLISH, SUBLANG_ENGLISH_US), b, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Sprintf("NTSTATUS 0x%08x", uint32(s)) | ||||||
|  | 	} | ||||||
|  | 	// trim terminating \r and \n | ||||||
|  | 	for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- { | ||||||
|  | 	} | ||||||
|  | 	return string(utf16.Decode(b[:n])) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewNTUnicodeString returns a new NTUnicodeString structure for use with native | ||||||
|  | // NT APIs that work over the NTUnicodeString type. Note that most Windows APIs | ||||||
|  | // do not use NTUnicodeString, and instead UTF16PtrFromString should be used for | ||||||
|  | // the more common *uint16 string type. | ||||||
|  | func NewNTUnicodeString(s string) (*NTUnicodeString, error) { | ||||||
|  | 	var u NTUnicodeString | ||||||
|  | 	s16, err := UTF16PtrFromString(s) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	RtlInitUnicodeString(&u, s16) | ||||||
|  | 	return &u, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Slice returns a uint16 slice that aliases the data in the NTUnicodeString. | ||||||
|  | func (s *NTUnicodeString) Slice() []uint16 { | ||||||
|  | 	var slice []uint16 | ||||||
|  | 	hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice)) | ||||||
|  | 	hdr.Data = unsafe.Pointer(s.Buffer) | ||||||
|  | 	hdr.Len = int(s.Length) | ||||||
|  | 	hdr.Cap = int(s.MaximumLength) | ||||||
|  | 	return slice | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *NTUnicodeString) String() string { | ||||||
|  | 	return UTF16ToString(s.Slice()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewNTString returns a new NTString structure for use with native | ||||||
|  | // NT APIs that work over the NTString type. Note that most Windows APIs | ||||||
|  | // do not use NTString, and instead UTF16PtrFromString should be used for | ||||||
|  | // the more common *uint16 string type. | ||||||
|  | func NewNTString(s string) (*NTString, error) { | ||||||
|  | 	var nts NTString | ||||||
|  | 	s8, err := BytePtrFromString(s) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	RtlInitString(&nts, s8) | ||||||
|  | 	return &nts, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Slice returns a byte slice that aliases the data in the NTString. | ||||||
|  | func (s *NTString) Slice() []byte { | ||||||
|  | 	var slice []byte | ||||||
|  | 	hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice)) | ||||||
|  | 	hdr.Data = unsafe.Pointer(s.Buffer) | ||||||
|  | 	hdr.Len = int(s.Length) | ||||||
|  | 	hdr.Cap = int(s.MaximumLength) | ||||||
|  | 	return slice | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *NTString) String() string { | ||||||
|  | 	return ByteSliceToString(s.Slice()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FindResource resolves a resource of the given name and resource type. | ||||||
|  | func FindResource(module Handle, name, resType ResourceIDOrString) (Handle, error) { | ||||||
|  | 	var namePtr, resTypePtr uintptr | ||||||
|  | 	var name16, resType16 *uint16 | ||||||
|  | 	var err error | ||||||
|  | 	resolvePtr := func(i interface{}, keep **uint16) (uintptr, error) { | ||||||
|  | 		switch v := i.(type) { | ||||||
|  | 		case string: | ||||||
|  | 			*keep, err = UTF16PtrFromString(v) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return 0, err | ||||||
|  | 			} | ||||||
|  | 			return uintptr(unsafe.Pointer(*keep)), nil | ||||||
|  | 		case ResourceID: | ||||||
|  | 			return uintptr(v), nil | ||||||
|  | 		} | ||||||
|  | 		return 0, errorspkg.New("parameter must be a ResourceID or a string") | ||||||
|  | 	} | ||||||
|  | 	namePtr, err = resolvePtr(name, &name16) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	resTypePtr, err = resolvePtr(resType, &resType16) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	resInfo, err := findResource(module, namePtr, resTypePtr) | ||||||
|  | 	runtime.KeepAlive(name16) | ||||||
|  | 	runtime.KeepAlive(resType16) | ||||||
|  | 	return resInfo, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func LoadResourceData(module, resInfo Handle) (data []byte, err error) { | ||||||
|  | 	size, err := SizeofResource(module, resInfo) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	resData, err := LoadResource(module, resInfo) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	ptr, err := LockResource(resData) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	h := (*unsafeheader.Slice)(unsafe.Pointer(&data)) | ||||||
|  | 	h.Data = unsafe.Pointer(ptr) | ||||||
|  | 	h.Len = int(size) | ||||||
|  | 	h.Cap = int(size) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PSAPI_WORKING_SET_EX_BLOCK contains extended working set information for a page. | ||||||
|  | type PSAPI_WORKING_SET_EX_BLOCK uint64 | ||||||
|  | 
 | ||||||
|  | // Valid returns the validity of this page. | ||||||
|  | // If this bit is 1, the subsequent members are valid; otherwise they should be ignored. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) Valid() bool { | ||||||
|  | 	return (b & 1) == 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ShareCount is the number of processes that share this page. The maximum value of this member is 7. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) ShareCount() uint64 { | ||||||
|  | 	return b.intField(1, 3) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Win32Protection is the memory protection attributes of the page. For a list of values, see | ||||||
|  | // https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) Win32Protection() uint64 { | ||||||
|  | 	return b.intField(4, 11) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Shared returns the shared status of this page. | ||||||
|  | // If this bit is 1, the page can be shared. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) Shared() bool { | ||||||
|  | 	return (b & (1 << 15)) == 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Node is the NUMA node. The maximum value of this member is 63. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) Node() uint64 { | ||||||
|  | 	return b.intField(16, 6) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Locked returns the locked status of this page. | ||||||
|  | // If this bit is 1, the virtual page is locked in physical memory. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) Locked() bool { | ||||||
|  | 	return (b & (1 << 22)) == 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // LargePage returns the large page status of this page. | ||||||
|  | // If this bit is 1, the page is a large page. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) LargePage() bool { | ||||||
|  | 	return (b & (1 << 23)) == 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Bad returns the bad status of this page. | ||||||
|  | // If this bit is 1, the page is has been reported as bad. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) Bad() bool { | ||||||
|  | 	return (b & (1 << 31)) == 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // intField extracts an integer field in the PSAPI_WORKING_SET_EX_BLOCK union. | ||||||
|  | func (b PSAPI_WORKING_SET_EX_BLOCK) intField(start, length int) uint64 { | ||||||
|  | 	var mask PSAPI_WORKING_SET_EX_BLOCK | ||||||
|  | 	for pos := start; pos < start+length; pos++ { | ||||||
|  | 		mask |= (1 << pos) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	masked := b & mask | ||||||
|  | 	return uint64(masked >> start) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PSAPI_WORKING_SET_EX_INFORMATION contains extended working set information for a process. | ||||||
|  | type PSAPI_WORKING_SET_EX_INFORMATION struct { | ||||||
|  | 	// The virtual address. | ||||||
|  | 	VirtualAddress Pointer | ||||||
|  | 	// A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress. | ||||||
|  | 	VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										1669
									
								
								vendor/golang.org/x/sys/windows/types_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1669
									
								
								vendor/golang.org/x/sys/windows/types_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/types_windows_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/types_windows_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -20,3 +20,16 @@ type Servent struct { | |||||||
| 	Port    uint16 | 	Port    uint16 | ||||||
| 	Proto   *byte | 	Proto   *byte | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { | ||||||
|  | 	PerProcessUserTimeLimit int64 | ||||||
|  | 	PerJobUserTimeLimit     int64 | ||||||
|  | 	LimitFlags              uint32 | ||||||
|  | 	MinimumWorkingSetSize   uintptr | ||||||
|  | 	MaximumWorkingSetSize   uintptr | ||||||
|  | 	ActiveProcessLimit      uint32 | ||||||
|  | 	Affinity                uintptr | ||||||
|  | 	PriorityClass           uint32 | ||||||
|  | 	SchedulingClass         uint32 | ||||||
|  | 	_                       uint32 // pad to 8 byte boundary | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/sys/windows/types_windows_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/sys/windows/types_windows_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -20,3 +20,15 @@ type Servent struct { | |||||||
| 	Proto   *byte | 	Proto   *byte | ||||||
| 	Port    uint16 | 	Port    uint16 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { | ||||||
|  | 	PerProcessUserTimeLimit int64 | ||||||
|  | 	PerJobUserTimeLimit     int64 | ||||||
|  | 	LimitFlags              uint32 | ||||||
|  | 	MinimumWorkingSetSize   uintptr | ||||||
|  | 	MaximumWorkingSetSize   uintptr | ||||||
|  | 	ActiveProcessLimit      uint32 | ||||||
|  | 	Affinity                uintptr | ||||||
|  | 	PriorityClass           uint32 | ||||||
|  | 	SchedulingClass         uint32 | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -20,3 +20,16 @@ type Servent struct { | |||||||
| 	Port    uint16 | 	Port    uint16 | ||||||
| 	Proto   *byte | 	Proto   *byte | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { | ||||||
|  | 	PerProcessUserTimeLimit int64 | ||||||
|  | 	PerJobUserTimeLimit     int64 | ||||||
|  | 	LimitFlags              uint32 | ||||||
|  | 	MinimumWorkingSetSize   uintptr | ||||||
|  | 	MaximumWorkingSetSize   uintptr | ||||||
|  | 	ActiveProcessLimit      uint32 | ||||||
|  | 	Affinity                uintptr | ||||||
|  | 	PriorityClass           uint32 | ||||||
|  | 	SchedulingClass         uint32 | ||||||
|  | 	_                       uint32 // pad to 8 byte boundary | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | // Copyright 2011 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 | ||||||
|  | 
 | ||||||
|  | type WSAData struct { | ||||||
|  | 	Version      uint16 | ||||||
|  | 	HighVersion  uint16 | ||||||
|  | 	MaxSockets   uint16 | ||||||
|  | 	MaxUdpDg     uint16 | ||||||
|  | 	VendorInfo   *byte | ||||||
|  | 	Description  [WSADESCRIPTION_LEN + 1]byte | ||||||
|  | 	SystemStatus [WSASYS_STATUS_LEN + 1]byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Servent struct { | ||||||
|  | 	Name    *byte | ||||||
|  | 	Aliases **byte | ||||||
|  | 	Proto   *byte | ||||||
|  | 	Port    uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { | ||||||
|  | 	PerProcessUserTimeLimit int64 | ||||||
|  | 	PerJobUserTimeLimit     int64 | ||||||
|  | 	LimitFlags              uint32 | ||||||
|  | 	MinimumWorkingSetSize   uintptr | ||||||
|  | 	MaximumWorkingSetSize   uintptr | ||||||
|  | 	ActiveProcessLimit      uint32 | ||||||
|  | 	Affinity                uintptr | ||||||
|  | 	PriorityClass           uint32 | ||||||
|  | 	SchedulingClass         uint32 | ||||||
|  | } | ||||||
							
								
								
									
										2619
									
								
								vendor/golang.org/x/sys/windows/zerrors_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2619
									
								
								vendor/golang.org/x/sys/windows/zerrors_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6623
									
								
								vendor/golang.org/x/sys/windows/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6623
									
								
								vendor/golang.org/x/sys/windows/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @ -1,6 +1,7 @@ | |||||||
| # git.rootprojects.org/root/go-gitver v1.1.3 | # git.rootprojects.org/root/go-gitver v1.1.3 | ||||||
| git.rootprojects.org/root/go-gitver | git.rootprojects.org/root/go-gitver | ||||||
| git.rootprojects.org/root/go-gitver/gitver | git.rootprojects.org/root/go-gitver/gitver | ||||||
| # golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 | # golang.org/x/sys v0.1.0 | ||||||
| golang.org/x/sys/windows/registry | golang.org/x/sys/internal/unsafeheader | ||||||
| golang.org/x/sys/windows | golang.org/x/sys/windows | ||||||
|  | golang.org/x/sys/windows/registry | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user