mirror of
				https://github.com/therootcompany/pathman.git
				synced 2024-11-16 17:09:01 +00:00 
			
		
		
		
	Compare commits
	
		
			19 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2c283a2864 | |||
| 472d7bda0f | |||
| 12f8b86bbe | |||
| ca0a7fecb8 | |||
| 5f6e47244e | |||
| 74f81f519c | |||
| db19301520 | |||
| 571d639092 | |||
| 1ef3680b72 | |||
| 520c4a3b22 | |||
| c067c820cd | |||
| 3478e86919 | |||
| fcc35e88f6 | |||
| aa3bc63d25 | |||
| 964972846a | |||
| e2b9cef690 | |||
| 7e0151d504 | |||
| f3fc791ae7 | |||
| 4267ac8731 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +1,4 @@ | |||||||
|  | xversion.go | ||||||
| /pathman | /pathman | ||||||
| dist | dist | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										95
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								README.md
									
									
									
									
									
								
							| @ -1,16 +1,105 @@ | |||||||
| # [pathman](https://git.rootprojects.org/root/pathman) | # [pathman](https://git.rootprojects.org/root/pathman) | ||||||
| 
 | 
 | ||||||
| Manage PATH on Windows, Mac, and Linux with various Shells | Manage PATH on **Windows 10**, **Mac**, and **Linux** with various Shells | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
| pathman list | pathman list | ||||||
| pathman add ~/.local/bin | pathman add ~/.local/bin | ||||||
| pathman remove ~/.local/bin | pathman remove ~/.local/bin | ||||||
|  | pathman version | ||||||
|  | pathman help | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Windows: stores PATH in the registry. | Where is the PATH managed? | ||||||
| 
 | 
 | ||||||
| Mac & Linux: stores PATH in `~/.config/envman/PATH.sh` | -   **Windows 10**: stores `PATH` in the registry. | ||||||
|  | -   **Mac** & **Linux**: stores `PATH` in `~/.config/envman/PATH.env` | ||||||
|  | 
 | ||||||
|  | Note for **Windows 10** users: due to differences in how `cmd.exe`, PowerShell, and `pathman` use and interpret strings, spaces, paths, and variables, you'll get more consistent results if you: | ||||||
|  | 
 | ||||||
|  | -   Use `~` rather than `%USERPROFILE%` or `$Env:USERPROFILE` | ||||||
|  | -   Use `/` rather than `\` for delimiting paths | ||||||
|  | 
 | ||||||
|  | ## Install | ||||||
|  | 
 | ||||||
|  | **Mac**, **Linux**: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | curl -s https://webinstall.dev/pathman | bash | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | **Windows 10**: | ||||||
|  | 
 | ||||||
|  | This can be run from `cmd.exe` or PowerShell (`curl.exe` is a native part of Windows 10). | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | curl.exe -sA "MS" https://webinstall.dev/pathman | powershell | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Manual Install | ||||||
|  | 
 | ||||||
|  | 1. [Download](#downloads) | ||||||
|  | 2. Add to `PATH` | ||||||
|  | 
 | ||||||
|  | Or install via `npm`: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | npm install -g pathman | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | #### Windows | ||||||
|  | 
 | ||||||
|  | ```cmd | ||||||
|  | mkdir %userprofile%\bin | ||||||
|  | move pathman.exe %userprofile%\bin\pathman.exe | ||||||
|  | %userprofile%\bin\pathman.exe add ~/bin | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | #### Mac, Linux, etc | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | mkdir -p ~/.local/bin | ||||||
|  | mv ./pathman ~/.local/bin | ||||||
|  | pathman add ~/.local/bin | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Downloads | ||||||
|  | 
 | ||||||
|  | [Webi](https://webinstall.dev/pathman) (<https://webinstall.dev/pathman>) is the preferred install method, | ||||||
|  | but you can also download from [Git Releases](https://git.rootprojects.org/root/pathman/releases): | ||||||
|  | <https://git.rootprojects.org/root/pathman/releases>. | ||||||
|  | 
 | ||||||
|  | MacOS (including Apple Silicon M1), Linux, Raspberry Pi: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | tar xvf pathman-v*.tar.gz | ||||||
|  | chmod a+x ./pathman | ||||||
|  | ./pathman --help | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Windows 10: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | tar.exe xvf pathman-v*.zip | ||||||
|  | .\pathman.exe --help | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Supported Platforms | ||||||
|  | 
 | ||||||
|  | -   MacOS | ||||||
|  |     -   Apple Silicon M1 | ||||||
|  |     -   Intel x86_64 | ||||||
|  | -   Windows 10, 8, 7 | ||||||
|  | -   Linux | ||||||
|  |     -   amd64 / x86_64 | ||||||
|  |     -   386 | ||||||
|  | -   Raspberry Pi (Linux ARM) | ||||||
|  |     -   RPi 4 (64-bit armv8) | ||||||
|  |     -   RPi 3 (armv7) | ||||||
|  |     -   ARMv6 | ||||||
|  |     -   RPi Zero (armv5) | ||||||
|  | 
 | ||||||
|  | # CLI Help (API) | ||||||
| 
 | 
 | ||||||
| # add | # add | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -12,11 +12,11 @@ go generate -mod=vendor ./... | |||||||
| 
 | 
 | ||||||
| echo "" | echo "" | ||||||
| echo "Windows amd64" | echo "Windows amd64" | ||||||
| GOOS=windows GOARCH=amd64 go build -mod=vendor -o dist/windows/amd64/${exe}.exe -ldflags "-s -w -H=windowsgui" $gocmd | #GOOS=windows GOARCH=amd64 go build -mod=vendor -o dist/windows/amd64/${exe}.exe -ldflags "-s -w -H=windowsgui" $gocmd | ||||||
| GOOS=windows GOARCH=amd64 go build -mod=vendor -o dist/windows/amd64/${exe}.debug.exe | GOOS=windows GOARCH=amd64 go build -mod=vendor -o dist/windows/amd64/${exe}.exe -ldflags "-s -w" $gocmd | ||||||
|  | #GOOS=windows GOARCH=amd64 go build -mod=vendor -o dist/windows/amd64/${exe}.debug.exe | ||||||
| echo "Windows 386" | echo "Windows 386" | ||||||
| GOOS=windows GOARCH=386 go build -mod=vendor -o dist/windows/386/${exe}.exe -ldflags "-s -w -H=windowsgui" $gocmd | GOOS=windows GOARCH=386 go build -mod=vendor -o dist/windows/386/${exe}.exe -ldflags "-s -w" $gocmd | ||||||
| GOOS=windows GOARCH=386 go build -mod=vendor -o dist/windows/386/${exe}.debug.exe |  | ||||||
| 
 | 
 | ||||||
| echo "" | echo "" | ||||||
| echo "Darwin (macOS) amd64" | echo "Darwin (macOS) amd64" | ||||||
|  | |||||||
| @ -69,10 +69,11 @@ func initializeShells(home string) error { | |||||||
| 
 | 
 | ||||||
| 	var hasRC bool | 	var hasRC bool | ||||||
| 	var nativeMatch *envConfig | 	var nativeMatch *envConfig | ||||||
|  | 	shell := strings.TrimSuffix(filepath.Base(os.Getenv("SHELL")), ".exe") | ||||||
| 	for i := range confs { | 	for i := range confs { | ||||||
| 		c := confs[i] | 		c := confs[i] | ||||||
| 
 | 
 | ||||||
| 		if filepath.Base(os.Getenv("SHELL")) == c.shell { | 		if shell == c.shell { | ||||||
| 			nativeMatch = c | 			nativeMatch = c | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| @ -103,7 +104,7 @@ func initializeShells(home string) error { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// MacOS is special. It *requires* .bash_profile in order to read .bashrc | 	// MacOS is special. It *requires* .bash_profile in order to read .bashrc | ||||||
| 	if "darwin" == runtime.GOOS && "bash" == os.Getenv("SHELL") { | 	if "darwin" == runtime.GOOS && "bash" == shell { | ||||||
| 		if err := ensureBashProfile(home); nil != err { | 		if err := ensureBashProfile(home); nil != err { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								npm/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								npm/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | node_modules | ||||||
							
								
								
									
										41
									
								
								npm/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								npm/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | # pathman | ||||||
|  | 
 | ||||||
|  | A cross-platform PATH manager | ||||||
|  | 
 | ||||||
|  | Manage PATH on Windows, Mac, and Linux with various Shells | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | pathman list | ||||||
|  | pathman add ~/.local/bin | ||||||
|  | pathman remove ~/.local/bin | ||||||
|  | pathman version | ||||||
|  | pathman help | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Windows: stores PATH in the registry. | ||||||
|  | 
 | ||||||
|  | Mac & Linux: stores PATH in `~/.config/envman/PATH.sh` | ||||||
|  | 
 | ||||||
|  | ## Meta Package | ||||||
|  | 
 | ||||||
|  | This is a meta-package to fetch and install the correction version of | ||||||
|  | [go-pathman](https://git.rootprojects.org/root/pathman) | ||||||
|  | for your architecture and platform. | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | npm install -g @root/pathman | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Supported Shells | ||||||
|  | 
 | ||||||
|  | In theory, anything with bourne-compatible exports. Specifically: | ||||||
|  | 
 | ||||||
|  | -   bash | ||||||
|  | -   zsh | ||||||
|  | -   fish | ||||||
|  | 
 | ||||||
|  | On Windows, all shells inherit from the registry. | ||||||
|  | 
 | ||||||
|  | -   cmd.exe | ||||||
|  | -   PowerShell | ||||||
|  | -   Git Bash | ||||||
							
								
								
									
										1
									
								
								npm/bin/pathman
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								npm/bin/pathman
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | # this will be replaced by the postinstall script | ||||||
							
								
								
									
										12
									
								
								npm/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								npm/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | var spawner = require('./lib/exec.js'); | ||||||
|  | module.exports = spawner; | ||||||
|  | module.exports.install = require('./lib/install.js'); | ||||||
|  | 
 | ||||||
|  | if (require.main === module) { | ||||||
|  | 	// node index.js --foo bar => [ '--foo', 'bar' ]
 | ||||||
|  | 	spawner(process.argv.slice(2)).catch(function(err) { | ||||||
|  | 		console.error(err.message); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								npm/lib/exec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								npm/lib/exec.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | var pkg = require('../package.json'); | ||||||
|  | var spawn = require('child_process').spawn; | ||||||
|  | var os = require('os'); | ||||||
|  | var path = require('path'); | ||||||
|  | var ext = /^win/i.test(os.platform()) ? '.exe' : ''; | ||||||
|  | 
 | ||||||
|  | // @scope/packagename => packagename
 | ||||||
|  | // { bin: { "packagename": "bin/runner" } } => "bin/runner"
 | ||||||
|  | var bin = path.resolve(__dirname, '..', pkg.bin[pkg.name.replace(/.*\//, '')]); | ||||||
|  | 
 | ||||||
|  | function spawner(args) { | ||||||
|  | 	return new Promise(function(resolve, reject) { | ||||||
|  | 		var runner = spawn(path.join(bin + ext), args, { | ||||||
|  | 			windowsHide: true | ||||||
|  | 		}); | ||||||
|  | 		runner.stdout.on('data', function(chunk) { | ||||||
|  | 			console.info(chunk.toString('utf8')); | ||||||
|  | 		}); | ||||||
|  | 		runner.stderr.on('data', function(chunk) { | ||||||
|  | 			console.error(chunk.toString('utf8')); | ||||||
|  | 		}); | ||||||
|  | 		runner.on('exit', function(code) { | ||||||
|  | 			if (0 !== code) { | ||||||
|  | 				reject( | ||||||
|  | 					new Error("exited with non-zero status code '" + code + "'") | ||||||
|  | 				); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			resolve({ code: code }); | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports = spawner; | ||||||
							
								
								
									
										219
									
								
								npm/lib/install.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								npm/lib/install.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,219 @@ | |||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | var pkg = require('../package.json'); | ||||||
|  | var path = require('path'); | ||||||
|  | var os = require('os'); | ||||||
|  | 
 | ||||||
|  | // https://nodejs.org/api/os.html#os_os_arch
 | ||||||
|  | // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'
 | ||||||
|  | var arch = os.arch(); // process.arch
 | ||||||
|  | 
 | ||||||
|  | // https://nodejs.org/api/os.html#os_os_platform
 | ||||||
|  | // 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', 'win32'
 | ||||||
|  | var platform = os.platform(); // process.platform
 | ||||||
|  | var ext = /^win/i.test(platform) ? '.exe' : ''; | ||||||
|  | 
 | ||||||
|  | // This is _probably_ right. It's good enough for us
 | ||||||
|  | // https://github.com/nodejs/node/issues/13629
 | ||||||
|  | if ('arm' === arch) { | ||||||
|  | 	arch += 'v' + process.config.variables.arm_version; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var map = { | ||||||
|  | 	// arches
 | ||||||
|  | 	armv6: 'armv6', | ||||||
|  | 	armv7: 'armv7', | ||||||
|  | 	arm64: 'armv8', | ||||||
|  | 	ia32: '386', | ||||||
|  | 	x32: '386', | ||||||
|  | 	x64: 'amd64', | ||||||
|  | 	// platforms
 | ||||||
|  | 	darwin: 'darwin', | ||||||
|  | 	linux: 'linux', | ||||||
|  | 	win32: 'windows' | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | arch = map[arch]; | ||||||
|  | platform = map[platform]; | ||||||
|  | 
 | ||||||
|  | var pkg = require('../package.json'); | ||||||
|  | var newVer = pkg.version; | ||||||
|  | var fs = require('fs'); | ||||||
|  | var request = require('@root/request'); | ||||||
|  | var mkdirp = require('@root/mkdirp'); | ||||||
|  | 
 | ||||||
|  | function install(name, bindirs, getVersion, parseVersion, urlTpl) { | ||||||
|  | 	if (!arch || !platform) { | ||||||
|  | 		console.error( | ||||||
|  | 			"'" + | ||||||
|  | 				os.platform() + | ||||||
|  | 				"' on '" + | ||||||
|  | 				os.arch() + | ||||||
|  | 				"' isn't supported yet." | ||||||
|  | 		); | ||||||
|  | 		console.error( | ||||||
|  | 			'Please open an issue at https://git.rootprojects.org/root/pathman/issues' | ||||||
|  | 		); | ||||||
|  | 		process.exit(1); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var url = urlTpl | ||||||
|  | 		.replace(/{{ .Version }}/g, newVer) | ||||||
|  | 		.replace(/{{ .Platform }}/g, platform) | ||||||
|  | 		.replace(/{{ .Arch }}/g, arch) | ||||||
|  | 		.replace(/{{ .Ext }}/g, ext); | ||||||
|  | 
 | ||||||
|  | 	console.info('Installing from', url); | ||||||
|  | 	return request({ uri: url, encoding: null }, function(err, resp) { | ||||||
|  | 		if (err) { | ||||||
|  | 			console.error(err); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		//console.log(resp.body.byteLength);
 | ||||||
|  | 		//console.log(typeof resp.body);
 | ||||||
|  | 		var bin = name + ext; | ||||||
|  | 		function next() { | ||||||
|  | 			if (!bindirs.length) { | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			var bindir = bindirs.pop(); | ||||||
|  | 			return mkdirp(bindir, function(err) { | ||||||
|  | 				if (err) { | ||||||
|  | 					console.error(err); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				var localbin = path.join(bindir, bin); | ||||||
|  | 				return fs.writeFile(localbin, resp.body, function(err) { | ||||||
|  | 					next(); | ||||||
|  | 					if (err) { | ||||||
|  | 						console.error(err); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  | 					fs.chmodSync(localbin, parseInt('0755', 8)); | ||||||
|  | 					console.info('Wrote', bin, 'to', bindir); | ||||||
|  | 				}); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 		next(); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function shouldUpdate(oldVer, newVer) { | ||||||
|  | 	// "v1.0.0-pre" is BEHIND "v1.0.0"
 | ||||||
|  | 	newVer = newVer | ||||||
|  | 		.replace(/^v/, '') | ||||||
|  | 		.split(/[\.\-\+]/) | ||||||
|  | 		.filter(Boolean); | ||||||
|  | 	oldVer = oldVer | ||||||
|  | 		.replace(/^v/, '') | ||||||
|  | 		.split(/[\.\-\+]/) | ||||||
|  | 		.filter(Boolean); | ||||||
|  | 
 | ||||||
|  | 	if (!oldVer.length) { | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// ex: v1.0.0-pre vs v1.0.0
 | ||||||
|  | 	if (newVer[3] && !oldVer[3]) { | ||||||
|  | 		// don't install beta over stable
 | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// ex: old is v1.0.0-pre
 | ||||||
|  | 	if (oldVer[3]) { | ||||||
|  | 		if (oldVer[2] > 0) { | ||||||
|  | 			oldVer[2] -= 1; | ||||||
|  | 		} else if (oldVer[1] > 0) { | ||||||
|  | 			oldVer[2] = 999; | ||||||
|  | 			oldVer[1] -= 1; | ||||||
|  | 		} else if (oldVer[0] > 0) { | ||||||
|  | 			oldVer[2] = 999; | ||||||
|  | 			oldVer[1] = 999; | ||||||
|  | 			oldVer[0] -= 1; | ||||||
|  | 		} else { | ||||||
|  | 			// v0.0.0
 | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// ex: v1.0.1 vs v1.0.0-pre
 | ||||||
|  | 	if (newVer[3]) { | ||||||
|  | 		if (newVer[2] > 0) { | ||||||
|  | 			newVer[2] -= 1; | ||||||
|  | 		} else if (newVer[1] > 0) { | ||||||
|  | 			newVer[2] = 999; | ||||||
|  | 			newVer[1] -= 1; | ||||||
|  | 		} else if (newVer[0] > 0) { | ||||||
|  | 			newVer[2] = 999; | ||||||
|  | 			newVer[1] = 999; | ||||||
|  | 			newVer[0] -= 1; | ||||||
|  | 		} else { | ||||||
|  | 			// v0.0.0
 | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// ex: v1.0.1 vs v1.0.0
 | ||||||
|  | 	if (oldVer[0] > newVer[0]) { | ||||||
|  | 		return false; | ||||||
|  | 	} else if (oldVer[0] < newVer[0]) { | ||||||
|  | 		return true; | ||||||
|  | 	} else if (oldVer[1] > newVer[1]) { | ||||||
|  | 		return false; | ||||||
|  | 	} else if (oldVer[1] < newVer[1]) { | ||||||
|  | 		return true; | ||||||
|  | 	} else if (oldVer[2] > newVer[2]) { | ||||||
|  | 		return false; | ||||||
|  | 	} else if (oldVer[2] < newVer[2]) { | ||||||
|  | 		return true; | ||||||
|  | 	} else if (!oldVer[3] && newVer[3]) { | ||||||
|  | 		return false; | ||||||
|  | 	} else if (oldVer[3] && !newVer[3]) { | ||||||
|  | 		return true; | ||||||
|  | 	} else { | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | // Same version
 | ||||||
|  | console.log(false === shouldUpdate('0.5.0', '0.5.0')); | ||||||
|  | // No previous version
 | ||||||
|  | console.log(true === shouldUpdate('', '0.5.1')); | ||||||
|  | // The new version is slightly newer
 | ||||||
|  | console.log(true === shouldUpdate('0.5.0', '0.5.1')); | ||||||
|  | console.log(true === shouldUpdate('0.4.999-pre1', '0.5.0-pre1')); | ||||||
|  | // The new version is slightly older
 | ||||||
|  | console.log(false === shouldUpdate('0.5.0', '0.5.0-pre1')); | ||||||
|  | console.log(false === shouldUpdate('0.5.1', '0.5.0')); | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | function checkVersion(getVersion, parseVersion) { | ||||||
|  | 	var exec = require('child_process').exec; | ||||||
|  | 
 | ||||||
|  | 	return new Promise(function(resolve) { | ||||||
|  | 		exec(getVersion, { windowsHide: true }, function(err, stdout) { | ||||||
|  | 			var oldVer = parseVersion(stdout); | ||||||
|  | 			resolve(oldVer); | ||||||
|  | 			/* | ||||||
|  | 			//console.log('old:', oldVer, 'new:', newVer);
 | ||||||
|  | 			if (!shouldUpdate(oldVer, newVer)) { | ||||||
|  | 				console.info( | ||||||
|  | 					'Current ' + name + ' version is new enough:', | ||||||
|  | 					oldVer, | ||||||
|  | 					newVer | ||||||
|  | 				); | ||||||
|  | 				return; | ||||||
|  | 				//} else {
 | ||||||
|  | 				//	console.info('Current version is older:', oldVer, newVer);
 | ||||||
|  | 			} | ||||||
|  |       */ | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports = install; | ||||||
|  | module.exports._shouldUpdate = shouldUpdate; | ||||||
|  | module.exports._checkVersion = checkVersion; | ||||||
							
								
								
									
										18
									
								
								npm/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								npm/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | { | ||||||
|  | 	"name": "@root/pathman", | ||||||
|  | 	"version": "0.5.2-alpha.5", | ||||||
|  | 	"lockfileVersion": 1, | ||||||
|  | 	"requires": true, | ||||||
|  | 	"dependencies": { | ||||||
|  | 		"@root/mkdirp": { | ||||||
|  | 			"version": "1.0.0", | ||||||
|  | 			"resolved": "https://registry.npmjs.org/@root/mkdirp/-/mkdirp-1.0.0.tgz", | ||||||
|  | 			"integrity": "sha512-hxGAYUx5029VggfG+U9naAhQkoMSXtOeXtbql97m3Hi6/sQSRL/4khKZPyOF6w11glyCOU38WCNLu9nUcSjOfA==" | ||||||
|  | 		}, | ||||||
|  | 		"@root/request": { | ||||||
|  | 			"version": "1.3.11", | ||||||
|  | 			"resolved": "https://registry.npmjs.org/@root/request/-/request-1.3.11.tgz", | ||||||
|  | 			"integrity": "sha512-3a4Eeghcjsfe6zh7EJ+ni1l8OK9Fz2wL1OjP4UCa0YdvtH39kdXB9RGWuzyNv7dZi0+Ffkc83KfH0WbPMiuJFw==" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								npm/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								npm/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | { | ||||||
|  | 	"name": "@root/pathman", | ||||||
|  | 	"version": "0.5.3-pre.3", | ||||||
|  | 	"description": "A cross-platform PATH manager", | ||||||
|  | 	"main": "index.js", | ||||||
|  | 	"homepage": "https://git.rootprojects.org/root/pathman/src/branch/master/npm", | ||||||
|  | 	"files": [ | ||||||
|  | 		"bin/", | ||||||
|  | 		"lib/", | ||||||
|  | 		"scripts/" | ||||||
|  | 	], | ||||||
|  | 	"bin": { | ||||||
|  | 		"pathman": "bin/pathman" | ||||||
|  | 	}, | ||||||
|  | 	"scripts": { | ||||||
|  | 		"pathman": "pathman", | ||||||
|  | 		"postinstall": "node scripts/fetch-prebuilt.js", | ||||||
|  | 		"test": "echo \"Error: no test specified\" && exit 1" | ||||||
|  | 	}, | ||||||
|  | 	"repository": { | ||||||
|  | 		"type": "git", | ||||||
|  | 		"url": "https://git.rootprojects.org/root/pathman.git" | ||||||
|  | 	}, | ||||||
|  | 	"keywords": [ | ||||||
|  | 		"launchd", | ||||||
|  | 		"systemd", | ||||||
|  | 		"winsvc", | ||||||
|  | 		"launchctl", | ||||||
|  | 		"systemctl", | ||||||
|  | 		"HKEY_CURRENT_USER", | ||||||
|  | 		"HKCU", | ||||||
|  | 		"Run" | ||||||
|  | 	], | ||||||
|  | 	"author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)", | ||||||
|  | 	"license": "MPL-2.0", | ||||||
|  | 	"dependencies": { | ||||||
|  | 		"@root/mkdirp": "^1.0.0", | ||||||
|  | 		"@root/request": "^1.3.11" | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										88
									
								
								npm/scripts/fetch-prebuilt.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										88
									
								
								npm/scripts/fetch-prebuilt.js
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,88 @@ | |||||||
|  | #!/usr/bin/env node
 | ||||||
|  | 
 | ||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | var pkg = require('../package.json'); | ||||||
|  | var os = require('os'); | ||||||
|  | var path = require('path'); | ||||||
|  | var fs = require('fs'); | ||||||
|  | var manager = require('../index.js'); | ||||||
|  | 
 | ||||||
|  | if (require.main === module) { | ||||||
|  | 	run(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function run() { | ||||||
|  | 	var ext = /^win/i.test(os.platform()) ? '.exe' : ''; | ||||||
|  | 	//var homedir = require('os').homedir();
 | ||||||
|  | 	//var bindir = path.join(homedir, '.local', 'bin');
 | ||||||
|  | 	var bindir = path.resolve(__dirname, '..', 'bin'); | ||||||
|  | 	var name = pkg.name.replace(/.*\//, ''); | ||||||
|  | 	if ('.exe' === ext) { | ||||||
|  | 		winpmstall(pkg.name, name, bindir); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return manager.install( | ||||||
|  | 		name, | ||||||
|  | 		[bindir], | ||||||
|  | 		'pathman version', | ||||||
|  | 		function parseVersion(stdout) { | ||||||
|  | 			return (stdout || '').split(' ')[0]; | ||||||
|  | 		}, | ||||||
|  | 		'https://rootprojects.org/pathman/dist/{{ .Platform }}/{{ .Arch }}/pathman{{ .Ext }}' | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function winpmstall(pkgname, name, bindir) { | ||||||
|  | 	var dd = /\//.test(pkgname) ? '../' : ''; | ||||||
|  | 	var pkgpath = pkgname.replace(/@/g, '\\@'); | ||||||
|  | 
 | ||||||
|  | 	try { | ||||||
|  | 		fs.writeFileSync( | ||||||
|  | 			path.join(bindir, name), | ||||||
|  | 			[ | ||||||
|  | 				'#!/usr/bin/env bash', | ||||||
|  | 				'"$(dirname "$0")/' + name + '.exe" "$@"', | ||||||
|  | 				'exit $?' | ||||||
|  | 			].join('\n') | ||||||
|  | 		); | ||||||
|  | 	} catch (e) { | ||||||
|  | 		// ignore
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// because bugs in npm + git bash oddities, of course
 | ||||||
|  | 	// https://npm.community/t/globally-installed-package-does-not-execute-in-git-bash-on-windows/9394
 | ||||||
|  | 	try { | ||||||
|  | 		fs.writeFileSync( | ||||||
|  | 			path.join(__dirname, dd + '../../.bin', name), | ||||||
|  | 			[ | ||||||
|  | 				'#!/bin/sh', | ||||||
|  | 				'# manual bugfix patch for npm on windows', | ||||||
|  | 				'basedir=$(dirname "$(echo "$0" | sed -e \'s,\\\\,/,g\')")', | ||||||
|  | 				'"$basedir/../' + pkgpath + '/bin/' + name + '"   "$@"', | ||||||
|  | 				'exit $?' | ||||||
|  | 			].join('\n') | ||||||
|  | 		); | ||||||
|  | 	} catch (e) { | ||||||
|  | 		// ignore
 | ||||||
|  | 	} | ||||||
|  | 	try { | ||||||
|  | 		fs.writeFileSync( | ||||||
|  | 			path.join(__dirname, dd + '../../..', name), | ||||||
|  | 			[ | ||||||
|  | 				'#!/bin/sh', | ||||||
|  | 				'# manual bugfix patch for npm on windows', | ||||||
|  | 				'basedir=$(dirname "$(echo "$0" | sed -e \'s,\\\\,/,g\')")', | ||||||
|  | 				'"$basedir/node_modules/' + | ||||||
|  | 					pkgname + | ||||||
|  | 					'/bin/' + | ||||||
|  | 					name + | ||||||
|  | 					'"   "$@"', | ||||||
|  | 				'exit $?' | ||||||
|  | 			].join('\n') | ||||||
|  | 		); | ||||||
|  | 	} catch (e) { | ||||||
|  | 		// ignore
 | ||||||
|  | 	} | ||||||
|  | 	// end bugfix
 | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								pathman.go
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								pathman.go
									
									
									
									
									
								
							| @ -1,3 +1,5 @@ | |||||||
|  | //go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver | ||||||
|  | 
 | ||||||
| package main | package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| @ -44,36 +46,10 @@ func main() { | |||||||
| 		entry = os.Args[2] | 		entry = os.Args[2] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// https://superuser.com/a/69190/73857 |  | ||||||
| 	// https://github.com/rust-lang-nursery/rustup.rs/issues/686#issuecomment-253982841 |  | ||||||
| 	// exec source $HOME/.profile |  | ||||||
| 	shell := os.Getenv("SHELL") |  | ||||||
| 	shell = filepath.Base(shell) |  | ||||||
| 	switch shell { |  | ||||||
| 	case "": |  | ||||||
| 		if strings.HasSuffix(os.Getenv("COMSPEC"), "/cmd.exe") { |  | ||||||
| 			shell = "cmd" |  | ||||||
| 		} |  | ||||||
| 	case "fish": |  | ||||||
| 		// ignore |  | ||||||
| 	case "zsh": |  | ||||||
| 		// ignore |  | ||||||
| 	case "bash": |  | ||||||
| 		// ignore |  | ||||||
| 	default: |  | ||||||
| 		// warn and try anyway |  | ||||||
| 		fmt.Fprintf( |  | ||||||
| 			os.Stderr, |  | ||||||
| 			"%q isn't a recognized shell. Please open an issue at https://git.rootprojects.org/root/pathman/issues?q=%s", |  | ||||||
| 			shell, |  | ||||||
| 			shell, |  | ||||||
| 		) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	home, _ := os.UserHomeDir() | 	home, _ := os.UserHomeDir() | ||||||
| 	if "" != entry && '~' == entry[0] { | 	if "" != entry && '~' == entry[0] { | ||||||
| 		// Let windows users not to have to type %USERPROFILE% or \Users\me every time | 		// Let windows users not to have to type %USERPROFILE% or \Users\me every time | ||||||
| 		entry = strings.Replace(entry, "~", home, 0) | 		entry = strings.Replace(entry, "~", home, 1) | ||||||
| 	} | 	} | ||||||
| 	switch action { | 	switch action { | ||||||
| 	default: | 	default: | ||||||
| @ -90,8 +66,10 @@ func main() { | |||||||
| 		} | 		} | ||||||
| 		list() | 		list() | ||||||
| 	case "add": | 	case "add": | ||||||
|  | 		checkShell() | ||||||
| 		add(entry) | 		add(entry) | ||||||
| 	case "remove": | 	case "remove": | ||||||
|  | 		checkShell() | ||||||
| 		remove(entry) | 		remove(entry) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -155,7 +133,7 @@ func add(entry string) { | |||||||
| 
 | 
 | ||||||
| 	modified, err := addPath(entry) | 	modified, err := addPath(entry) | ||||||
| 	if nil != err { | 	if nil != err { | ||||||
| 		fmt.Fprintf(os.Stderr, "failed to add %q to PATH: %s", entry, err) | 		fmt.Fprintf(os.Stderr, "%sfailed to add %q to PATH: %s", pathstore, entry, err) | ||||||
| 		os.Exit(1) | 		os.Exit(1) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -221,6 +199,38 @@ func remove(entry string) { | |||||||
| 	fmt.Println(msg + "\n") | 	fmt.Println(msg + "\n") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // warns if this is an unknown / untested shell | ||||||
|  | func checkShell() { | ||||||
|  | 	// https://superuser.com/a/69190/73857 | ||||||
|  | 	// https://github.com/rust-lang-nursery/rustup.rs/issues/686#issuecomment-253982841 | ||||||
|  | 	// exec source $HOME/.profile | ||||||
|  | 	shellexe := filepath.Base(os.Getenv("SHELL")) | ||||||
|  | 	shell := strings.TrimSuffix(shellexe, ".exe") | ||||||
|  | 	switch shell { | ||||||
|  | 	case ".": | ||||||
|  | 		shell = "" | ||||||
|  | 		fallthrough | ||||||
|  | 	case "": | ||||||
|  | 		if strings.HasSuffix(os.Getenv("COMSPEC"), "\\cmd.exe") { | ||||||
|  | 			shell = "cmd" | ||||||
|  | 		} | ||||||
|  | 	case "fish": | ||||||
|  | 		// ignore | ||||||
|  | 	case "zsh": | ||||||
|  | 		// ignore | ||||||
|  | 	case "bash": | ||||||
|  | 		// ignore | ||||||
|  | 	default: | ||||||
|  | 		// warn and try anyway | ||||||
|  | 		fmt.Fprintf( | ||||||
|  | 			os.Stderr, | ||||||
|  | 			"%q isn't a recognized shell. Please open an issue at https://git.rootprojects.org/root/pathman/issues?q=%s\n", | ||||||
|  | 			shellexe, | ||||||
|  | 			shellexe, | ||||||
|  | 		) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Paths returns path entries in the current environment | // Paths returns path entries in the current environment | ||||||
| func Paths() []string { | func Paths() []string { | ||||||
| 	cur := os.Getenv("PATH") | 	cur := os.Getenv("PATH") | ||||||
| @ -240,7 +250,7 @@ func Paths() []string { | |||||||
| // path entry to the current shell session | // path entry to the current shell session | ||||||
| func Add(p string) string { | func Add(p string) string { | ||||||
| 	if isCmdExe() { | 	if isCmdExe() { | ||||||
| 		return fmt.Sprintf(`PATH %s;%PATH%`, p) | 		return fmt.Sprintf(`PATH %s;%%PATH%%`, strings.Replace(p, "%", "%%", -1)) | ||||||
| 	} | 	} | ||||||
| 	return fmt.Sprintf(`export PATH="%s:$PATH"`, p) | 	return fmt.Sprintf(`export PATH="%s:$PATH"`, p) | ||||||
| } | } | ||||||
| @ -255,5 +265,5 @@ func Remove(entries []string) string { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func isCmdExe() bool { | func isCmdExe() bool { | ||||||
| 	return "" == os.Getenv("SHELL") && strings.Contains(strings.ToLower(os.Getenv("COMSPEC")), "/cmd.exe") | 	return "" == os.Getenv("SHELL") && strings.HasSuffix(strings.ToLower(os.Getenv("COMSPEC")), "\\cmd.exe") | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,8 @@ import ( | |||||||
| 	"git.rootprojects.org/root/pathman/envpath" | 	"git.rootprojects.org/root/pathman/envpath" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var pathstore = "" | ||||||
|  | 
 | ||||||
| func addPath(p string) (bool, error) { | func addPath(p string) (bool, error) { | ||||||
| 	return envpath.Add(p) | 	return envpath.Add(p) | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,8 @@ import ( | |||||||
| 	"git.rootprojects.org/root/pathman/winpath" | 	"git.rootprojects.org/root/pathman/winpath" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var pathstore = "[winpath] " | ||||||
|  | 
 | ||||||
| func addPath(p string) (bool, error) { | func addPath(p string) (bool, error) { | ||||||
| 	return winpath.Add(p) | 	return winpath.Add(p) | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								vendor/git.rootprojects.org/root/go-gitver/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vendor/git.rootprojects.org/root/go-gitver/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | xversion.go | ||||||
|  | zversion.go | ||||||
|  | 
 | ||||||
|  | # ---> Go | ||||||
|  | # Binaries for programs and plugins | ||||||
|  | *.exe | ||||||
|  | *.exe~ | ||||||
|  | *.dll | ||||||
|  | *.so | ||||||
|  | *.dylib | ||||||
|  | 
 | ||||||
|  | # Test binary, build with `go test -c` | ||||||
|  | *.test | ||||||
|  | 
 | ||||||
|  | # Output of the go coverage tool, specifically when used with LiteIDE | ||||||
|  | *.out | ||||||
|  | 
 | ||||||
							
								
								
									
										312
									
								
								vendor/git.rootprojects.org/root/go-gitver/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										312
									
								
								vendor/git.rootprojects.org/root/go-gitver/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,312 @@ | |||||||
|  | Mozilla Public License Version 2.0 | ||||||
|  | 
 | ||||||
|  |    1. Definitions | ||||||
|  | 
 | ||||||
|  | 1.1. "Contributor" means each individual or legal entity that creates, contributes | ||||||
|  | to the creation of, or owns Covered Software. | ||||||
|  | 
 | ||||||
|  | 1.2. "Contributor Version" means the combination of the Contributions of others | ||||||
|  | (if any) used by a Contributor and that particular Contributor's Contribution. | ||||||
|  | 
 | ||||||
|  |       1.3. "Contribution" means Covered Software of a particular Contributor. | ||||||
|  | 
 | ||||||
|  | 1.4. "Covered Software" means Source Code Form to which the initial Contributor | ||||||
|  | has attached the notice in Exhibit A, the Executable Form of such Source Code | ||||||
|  | Form, and Modifications of such Source Code Form, in each case including portions | ||||||
|  | thereof. | ||||||
|  | 
 | ||||||
|  |       1.5. "Incompatible With Secondary Licenses" means | ||||||
|  | 
 | ||||||
|  | (a) that the initial Contributor has attached the notice described in Exhibit | ||||||
|  | B to the Covered Software; or | ||||||
|  | 
 | ||||||
|  | (b) that the Covered Software was made available under the terms of version | ||||||
|  | 1.1 or earlier of the License, but not also under the terms of a Secondary | ||||||
|  | License. | ||||||
|  | 
 | ||||||
|  | 1.6. "Executable Form" means any form of the work other than Source Code Form. | ||||||
|  | 
 | ||||||
|  | 1.7. "Larger Work" means a work that combines Covered Software with other | ||||||
|  | material, in a separate file or files, that is not Covered Software. | ||||||
|  | 
 | ||||||
|  |       1.8. "License" means this document. | ||||||
|  | 
 | ||||||
|  | 1.9. "Licensable" means having the right to grant, to the maximum extent possible, | ||||||
|  | whether at the time of the initial grant or subsequently, any and all of the | ||||||
|  | rights conveyed by this License. | ||||||
|  | 
 | ||||||
|  |       1.10. "Modifications" means any of the following: | ||||||
|  | 
 | ||||||
|  | (a) any file in Source Code Form that results from an addition to, deletion | ||||||
|  | from, or modification of the contents of Covered Software; or | ||||||
|  | 
 | ||||||
|  | (b) any new file in Source Code Form that contains any Covered Software. | ||||||
|  | 
 | ||||||
|  | 1.11. "Patent Claims" of a Contributor means any patent claim(s), including | ||||||
|  | without limitation, method, process, and apparatus claims, in any patent Licensable | ||||||
|  | by such Contributor that would be infringed, but for the grant of the License, | ||||||
|  | by the making, using, selling, offering for sale, having made, import, or | ||||||
|  | transfer of either its Contributions or its Contributor Version. | ||||||
|  | 
 | ||||||
|  | 1.12. "Secondary License" means either the GNU General Public License, Version | ||||||
|  | 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General | ||||||
|  | Public License, Version 3.0, or any later versions of those licenses. | ||||||
|  | 
 | ||||||
|  | 1.13. "Source Code Form" means the form of the work preferred for making modifications. | ||||||
|  | 
 | ||||||
|  | 1.14. "You" (or "Your") means an individual or a legal entity exercising rights | ||||||
|  | under this License. For legal entities, "You" includes any entity that controls, | ||||||
|  | is controlled by, or is under common control with You. For purposes of this | ||||||
|  | definition, "control" means (a) the power, direct or indirect, to cause the | ||||||
|  | direction or management of such entity, whether by contract or otherwise, | ||||||
|  | or (b) ownership of more than fifty percent (50%) of the outstanding shares | ||||||
|  | or beneficial ownership of such entity. | ||||||
|  | 
 | ||||||
|  |    2. License Grants and Conditions | ||||||
|  | 
 | ||||||
|  |       2.1. Grants | ||||||
|  | 
 | ||||||
|  | Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive | ||||||
|  | license: | ||||||
|  | 
 | ||||||
|  | (a) under intellectual property rights (other than patent or trademark) Licensable | ||||||
|  | by such Contributor to use, reproduce, make available, modify, display, perform, | ||||||
|  | distribute, and otherwise exploit its Contributions, either on an unmodified | ||||||
|  | basis, with Modifications, or as part of a Larger Work; and | ||||||
|  | 
 | ||||||
|  | (b) under Patent Claims of such Contributor to make, use, sell, offer for | ||||||
|  | sale, have made, import, and otherwise transfer either its Contributions or | ||||||
|  | its Contributor Version. | ||||||
|  | 
 | ||||||
|  |       2.2. Effective Date | ||||||
|  | 
 | ||||||
|  | The licenses granted in Section 2.1 with respect to any Contribution become | ||||||
|  | effective for each Contribution on the date the Contributor first distributes | ||||||
|  | such Contribution. | ||||||
|  | 
 | ||||||
|  |       2.3. Limitations on Grant Scope | ||||||
|  | 
 | ||||||
|  | The licenses granted in this Section 2 are the only rights granted under this | ||||||
|  | License. No additional rights or licenses will be implied from the distribution | ||||||
|  | or licensing of Covered Software under this License. Notwithstanding Section | ||||||
|  | 2.1(b) above, no patent license is granted by a Contributor: | ||||||
|  | 
 | ||||||
|  | (a) for any code that a Contributor has removed from Covered Software; or | ||||||
|  | 
 | ||||||
|  | (b) for infringements caused by: (i) Your and any other third party's modifications | ||||||
|  | of Covered Software, or (ii) the combination of its Contributions with other | ||||||
|  | software (except as part of its Contributor Version); or | ||||||
|  | 
 | ||||||
|  | (c) under Patent Claims infringed by Covered Software in the absence of its | ||||||
|  | Contributions. | ||||||
|  | 
 | ||||||
|  | This License does not grant any rights in the trademarks, service marks, or | ||||||
|  | logos of any Contributor (except as may be necessary to comply with the notice | ||||||
|  | requirements in Section 3.4). | ||||||
|  | 
 | ||||||
|  |       2.4. Subsequent Licenses | ||||||
|  | 
 | ||||||
|  | No Contributor makes additional grants as a result of Your choice to distribute | ||||||
|  | the Covered Software under a subsequent version of this License (see Section | ||||||
|  | 10.2) or under the terms of a Secondary License (if permitted under the terms | ||||||
|  | of Section 3.3). | ||||||
|  | 
 | ||||||
|  |       2.5. Representation | ||||||
|  | 
 | ||||||
|  | Each Contributor represents that the Contributor believes its Contributions | ||||||
|  | are its original creation(s) or it has sufficient rights to grant the rights | ||||||
|  | to its Contributions conveyed by this License. | ||||||
|  | 
 | ||||||
|  |       2.6. Fair Use | ||||||
|  | 
 | ||||||
|  | This License is not intended to limit any rights You have under applicable | ||||||
|  | copyright doctrines of fair use, fair dealing, or other equivalents. | ||||||
|  | 
 | ||||||
|  |       2.7. Conditions | ||||||
|  | 
 | ||||||
|  | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in | ||||||
|  | Section 2.1. | ||||||
|  | 
 | ||||||
|  |    3. Responsibilities | ||||||
|  | 
 | ||||||
|  |       3.1. Distribution of Source Form | ||||||
|  | 
 | ||||||
|  | All distribution of Covered Software in Source Code Form, including any Modifications | ||||||
|  | that You create or to which You contribute, must be under the terms of this | ||||||
|  | License. You must inform recipients that the Source Code Form of the Covered | ||||||
|  | Software is governed by the terms of this License, and how they can obtain | ||||||
|  | a copy of this License. You may not attempt to alter or restrict the recipients' | ||||||
|  | rights in the Source Code Form. | ||||||
|  | 
 | ||||||
|  |       3.2. Distribution of Executable Form | ||||||
|  | 
 | ||||||
|  |       If You distribute Covered Software in Executable Form then: | ||||||
|  | 
 | ||||||
|  | (a) such Covered Software must also be made available in Source Code Form, | ||||||
|  | as described in Section 3.1, and You must inform recipients of the Executable | ||||||
|  | Form how they can obtain a copy of such Source Code Form by reasonable means | ||||||
|  | in a timely manner, at a charge no more than the cost of distribution to the | ||||||
|  | recipient; and | ||||||
|  | 
 | ||||||
|  | (b) You may distribute such Executable Form under the terms of this License, | ||||||
|  | or sublicense it under different terms, provided that the license for the | ||||||
|  | Executable Form does not attempt to limit or alter the recipients' rights | ||||||
|  | in the Source Code Form under this License. | ||||||
|  | 
 | ||||||
|  |       3.3. Distribution of a Larger Work | ||||||
|  | 
 | ||||||
|  | You may create and distribute a Larger Work under terms of Your choice, provided | ||||||
|  | that You also comply with the requirements of this License for the Covered | ||||||
|  | Software. If the Larger Work is a combination of Covered Software with a work | ||||||
|  | governed by one or more Secondary Licenses, and the Covered Software is not | ||||||
|  | Incompatible With Secondary Licenses, this License permits You to additionally | ||||||
|  | distribute such Covered Software under the terms of such Secondary License(s), | ||||||
|  | so that the recipient of the Larger Work may, at their option, further distribute | ||||||
|  | the Covered Software under the terms of either this License or such Secondary | ||||||
|  | License(s). | ||||||
|  | 
 | ||||||
|  |       3.4. Notices | ||||||
|  | 
 | ||||||
|  | You may not remove or alter the substance of any license notices (including | ||||||
|  | copyright notices, patent notices, disclaimers of warranty, or limitations | ||||||
|  | of liability) contained within the Source Code Form of the Covered Software, | ||||||
|  | except that You may alter any license notices to the extent required to remedy | ||||||
|  | known factual inaccuracies. | ||||||
|  | 
 | ||||||
|  |       3.5. Application of Additional Terms | ||||||
|  | 
 | ||||||
|  | You may choose to offer, and to charge a fee for, warranty, support, indemnity | ||||||
|  | or liability obligations to one or more recipients of Covered Software. However, | ||||||
|  | You may do so only on Your own behalf, and not on behalf of any Contributor. | ||||||
|  | You must make it absolutely clear that any such warranty, support, indemnity, | ||||||
|  | or liability obligation is offered by You alone, and You hereby agree to indemnify | ||||||
|  | every Contributor for any liability incurred by such Contributor as a result | ||||||
|  | of warranty, support, indemnity or liability terms You offer. You may include | ||||||
|  | additional disclaimers of warranty and limitations of liability specific to | ||||||
|  | any jurisdiction. | ||||||
|  | 
 | ||||||
|  |    4. Inability to Comply Due to Statute or Regulation | ||||||
|  | 
 | ||||||
|  | If it is impossible for You to comply with any of the terms of this License | ||||||
|  | with respect to some or all of the Covered Software due to statute, judicial | ||||||
|  | order, or regulation then You must: (a) comply with the terms of this License | ||||||
|  | to the maximum extent possible; and (b) describe the limitations and the code | ||||||
|  | they affect. Such description must be placed in a text file included with | ||||||
|  | all distributions of the Covered Software under this License. Except to the | ||||||
|  | extent prohibited by statute or regulation, such description must be sufficiently | ||||||
|  | detailed for a recipient of ordinary skill to be able to understand it. | ||||||
|  | 
 | ||||||
|  |    5. Termination | ||||||
|  | 
 | ||||||
|  | 5.1. The rights granted under this License will terminate automatically if | ||||||
|  | You fail to comply with any of its terms. However, if You become compliant, | ||||||
|  | then the rights granted under this License from a particular Contributor are | ||||||
|  | reinstated (a) provisionally, unless and until such Contributor explicitly | ||||||
|  | and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor | ||||||
|  | fails to notify You of the non-compliance by some reasonable means prior to | ||||||
|  | 60 days after You have come back into compliance. Moreover, Your grants from | ||||||
|  | a particular Contributor are reinstated on an ongoing basis if such Contributor | ||||||
|  | notifies You of the non-compliance by some reasonable means, this is the first | ||||||
|  | time You have received notice of non-compliance with this License from such | ||||||
|  | Contributor, and You become compliant prior to 30 days after Your receipt | ||||||
|  | of the notice. | ||||||
|  | 
 | ||||||
|  | 5.2. If You initiate litigation against any entity by asserting a patent infringement | ||||||
|  | claim (excluding declaratory judgment actions, counter-claims, and cross-claims) | ||||||
|  | alleging that a Contributor Version directly or indirectly infringes any patent, | ||||||
|  | then the rights granted to You by any and all Contributors for the Covered | ||||||
|  | Software under Section 2.1 of this License shall terminate. | ||||||
|  | 
 | ||||||
|  | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end | ||||||
|  | user license agreements (excluding distributors and resellers) which have | ||||||
|  | been validly granted by You or Your distributors under this License prior | ||||||
|  | to termination shall survive termination. | ||||||
|  | 
 | ||||||
|  |    6. Disclaimer of Warranty | ||||||
|  | 
 | ||||||
|  | Covered Software is provided under this License on an "as is" basis, without | ||||||
|  | warranty of any kind, either expressed, implied, or statutory, including, | ||||||
|  | without limitation, warranties that the Covered Software is free of defects, | ||||||
|  | merchantable, fit for a particular purpose or non-infringing. The entire risk | ||||||
|  | as to the quality and performance of the Covered Software is with You. Should | ||||||
|  | any Covered Software prove defective in any respect, You (not any Contributor) | ||||||
|  | assume the cost of any necessary servicing, repair, or correction. This disclaimer | ||||||
|  | of warranty constitutes an essential part of this License. No use of any Covered | ||||||
|  | Software is authorized under this License except under this disclaimer. | ||||||
|  | 
 | ||||||
|  |    7. Limitation of Liability | ||||||
|  | 
 | ||||||
|  | Under no circumstances and under no legal theory, whether tort (including | ||||||
|  | negligence), contract, or otherwise, shall any Contributor, or anyone who | ||||||
|  | distributes Covered Software as permitted above, be liable to You for any | ||||||
|  | direct, indirect, special, incidental, or consequential damages of any character | ||||||
|  | including, without limitation, damages for lost profits, loss of goodwill, | ||||||
|  | work stoppage, computer failure or malfunction, or any and all other commercial | ||||||
|  | damages or losses, even if such party shall have been informed of the possibility | ||||||
|  | of such damages. This limitation of liability shall not apply to liability | ||||||
|  | for death or personal injury resulting from such party's negligence to the | ||||||
|  | extent applicable law prohibits such limitation. Some jurisdictions do not | ||||||
|  | allow the exclusion or limitation of incidental or consequential damages, | ||||||
|  | so this exclusion and limitation may not apply to You. | ||||||
|  | 
 | ||||||
|  |    8. Litigation | ||||||
|  | 
 | ||||||
|  | Any litigation relating to this License may be brought only in the courts | ||||||
|  | of a jurisdiction where the defendant maintains its principal place of business | ||||||
|  | and such litigation shall be governed by laws of that jurisdiction, without | ||||||
|  | reference to its conflict-of-law provisions. Nothing in this Section shall | ||||||
|  | prevent a party's ability to bring cross-claims or counter-claims. | ||||||
|  | 
 | ||||||
|  |    9. Miscellaneous | ||||||
|  | 
 | ||||||
|  | This License represents the complete agreement concerning the subject matter | ||||||
|  | hereof. If any provision of this License is held to be unenforceable, such | ||||||
|  | provision shall be reformed only to the extent necessary to make it enforceable. | ||||||
|  | Any law or regulation which provides that the language of a contract shall | ||||||
|  | be construed against the drafter shall not be used to construe this License | ||||||
|  | against a Contributor. | ||||||
|  | 
 | ||||||
|  |    10. Versions of the License | ||||||
|  | 
 | ||||||
|  |       10.1. New Versions | ||||||
|  | 
 | ||||||
|  | Mozilla Foundation is the license steward. Except as provided in Section 10.3, | ||||||
|  | no one other than the license steward has the right to modify or publish new | ||||||
|  | versions of this License. Each version will be given a distinguishing version | ||||||
|  | number. | ||||||
|  | 
 | ||||||
|  |       10.2. Effect of New Versions | ||||||
|  | 
 | ||||||
|  | You may distribute the Covered Software under the terms of the version of | ||||||
|  | the License under which You originally received the Covered Software, or under | ||||||
|  | the terms of any subsequent version published by the license steward. | ||||||
|  | 
 | ||||||
|  |       10.3. Modified Versions | ||||||
|  | 
 | ||||||
|  | If you create software not governed by this License, and you want to create | ||||||
|  | a new license for such software, you may create and use a modified version | ||||||
|  | of this License if you rename the license and remove any references to the | ||||||
|  | name of the license steward (except to note that such modified license differs | ||||||
|  | from this License). | ||||||
|  | 
 | ||||||
|  | 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses | ||||||
|  | 
 | ||||||
|  | If You choose to distribute Source Code Form that is Incompatible With Secondary | ||||||
|  | Licenses under the terms of this version of the License, the notice described | ||||||
|  | in Exhibit B of this License must be attached. Exhibit A - Source Code Form | ||||||
|  | License Notice | ||||||
|  | 
 | ||||||
|  | This Source Code Form is subject to the terms of the Mozilla Public License, | ||||||
|  | v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain | ||||||
|  | one at http://mozilla.org/MPL/2.0/. | ||||||
|  | 
 | ||||||
|  | If it is not possible or desirable to put the notice in a particular file, | ||||||
|  | then You may include the notice in a location (such as a LICENSE file in a | ||||||
|  | relevant directory) where a recipient would be likely to look for such a notice. | ||||||
|  | 
 | ||||||
|  | You may add additional accurate notices of copyright ownership. | ||||||
|  | 
 | ||||||
|  | Exhibit B - "Incompatible With Secondary Licenses" Notice | ||||||
|  | 
 | ||||||
|  | This Source Code Form is "Incompatible With Secondary Licenses", as defined | ||||||
|  | by the Mozilla Public License, v. 2.0. | ||||||
							
								
								
									
										195
									
								
								vendor/git.rootprojects.org/root/go-gitver/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								vendor/git.rootprojects.org/root/go-gitver/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,195 @@ | |||||||
|  | # git-version.go | ||||||
|  | 
 | ||||||
|  | Use git tags to add semver to your go package. | ||||||
|  | 
 | ||||||
|  | ```txt | ||||||
|  | Goal: Either use an exact version like v1.0.0 | ||||||
|  |       or translate the git version like v1.0.0-4-g0000000 | ||||||
|  |       to a semver like v1.0.1-pre4+g0000000 | ||||||
|  | 
 | ||||||
|  |       Fail gracefully when git repo isn't available. | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Demo | ||||||
|  | 
 | ||||||
|  | Generate an `xversion.go` file: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | go run git.rootprojects.org/root/go-gitver | ||||||
|  | cat xversion.go | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | <small>**Note**: The file is named `xversion.go` by default so that the | ||||||
|  | generated file's `init()` will come later, and thus take priority, over | ||||||
|  | most other files.</small> | ||||||
|  | 
 | ||||||
|  | See `go-gitver`s self-generated version: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | go run git.rootprojects.org/root/go-gitver version | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # QuickStart | ||||||
|  | 
 | ||||||
|  | Add this to the top of your main file: | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | //go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Add a file that imports go-gitver (for versioning) | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | // +build tools | ||||||
|  | 
 | ||||||
|  | package example | ||||||
|  | 
 | ||||||
|  | import _ "git.rootprojects.org/root/go-gitver" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Change you build instructions to be something like this: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | go mod vendor | ||||||
|  | go generate -mod=vendor ./... | ||||||
|  | go build -mod=vendor -o example cmd/example/*.go | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You don't have to use `mod vendor`, but I highly recommend it. | ||||||
|  | 
 | ||||||
|  | # Options | ||||||
|  | 
 | ||||||
|  | ```txt | ||||||
|  | version           print version and exit | ||||||
|  | --fail            exit with non-zero status code on failure | ||||||
|  | --package <name>  will set the package name | ||||||
|  | --outfile <name>  will replace `xversion.go` with the given file path | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ENVs | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | # Alias for --fail | ||||||
|  | GITVER_FAIL=true | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | For example: | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | //go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver --fail | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | go run -mod=vendor git.rootprojects.org/root/go-gitver version | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Usage | ||||||
|  | 
 | ||||||
|  | See `examples/basic` | ||||||
|  | 
 | ||||||
|  | 1. Create a `tools` package in your project | ||||||
|  | 2. Guard it against regular builds with `// +build tools` | ||||||
|  | 3. Include `_ "git.rootprojects.org/root/go-gitver"` in the imports | ||||||
|  | 4. Declare `var GitRev, GitVersion, GitTimestamp string` in your `package main` | ||||||
|  | 5. Include `//go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver` as well | ||||||
|  | 
 | ||||||
|  | `tools/tools.go`: | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | // +build tools | ||||||
|  | 
 | ||||||
|  | // This is a dummy package for build tooling | ||||||
|  | package tools | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	_ "git.rootprojects.org/root/go-gitver" | ||||||
|  | ) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | `main.go`: | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | //go:generate go run git.rootprojects.org/root/go-gitver --fail | ||||||
|  | 
 | ||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import "fmt" | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	GitRev       = "0000000" | ||||||
|  | 	GitVersion   = "v0.0.0-pre0+0000000" | ||||||
|  | 	GitTimestamp = "0000-00-00T00:00:00+0000" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  |   fmt.Println(GitRev) | ||||||
|  |   fmt.Println(GitVersion) | ||||||
|  |   fmt.Println(GitTimestamp) | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | If you're using `go mod vendor` (which I highly recommend that you do), | ||||||
|  | you'd modify the `go:generate` ever so slightly: | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | //go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver --fail | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | The only reason I didn't do that in the example is that I'd be included | ||||||
|  | the repository in itself and that would be... weird. | ||||||
|  | 
 | ||||||
|  | # Why a tools package? | ||||||
|  | 
 | ||||||
|  | > import "git.rootprojects.org/root/go-gitver" is a program, not an importable package | ||||||
|  | 
 | ||||||
|  | Having a tools package with a build tag that you don't use is a nice way to add exact | ||||||
|  | versions of a command package used for tooling to your `go.mod` with `go mod tidy`, | ||||||
|  | without getting the error above. | ||||||
|  | 
 | ||||||
|  | # git: behind the curtain | ||||||
|  | 
 | ||||||
|  | These are the commands that are used under the hood to produce the versions. | ||||||
|  | 
 | ||||||
|  | Shows the git tag + description. Assumes that you're using the semver format `v1.0.0` for your base tags. | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | git describe --tags --dirty --always | ||||||
|  | # v1.0.0 | ||||||
|  | # v1.0.0-1-g0000000 | ||||||
|  | # v1.0.0-dirty | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Show the commit date (when the commit made it into the current tree). | ||||||
|  | Internally we use the current date when the working tree is dirty. | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | git show v1.0.0-1-g0000000 --format=%cd --date=format:%Y-%m-%dT%H:%M:%SZ%z --no-patch | ||||||
|  | # 2010-01-01T20:30:00Z-0600 | ||||||
|  | # fatal: ambiguous argument 'v1.0.0-1-g0000000-dirty': unknown revision or path not in the working tree. | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Shows the most recent commit. | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | git rev-parse HEAD | ||||||
|  | # 0000000000000000000000000000000000000000 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Errors | ||||||
|  | 
 | ||||||
|  | ### cannot find package "." | ||||||
|  | 
 | ||||||
|  | ```txt | ||||||
|  | package git.rootprojects.org/root/go-gitver: cannot find package "." in: | ||||||
|  | 	/Users/me/go-example/vendor/git.rootprojects.org/root/go-gitver | ||||||
|  | cmd/example/example.go:1: running "go": exit status 1 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You forgot to update deps and re-vendor: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | go mod tidy | ||||||
|  | go mod vendor | ||||||
|  | ``` | ||||||
							
								
								
									
										104
									
								
								vendor/git.rootprojects.org/root/go-gitver/gitver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								vendor/git.rootprojects.org/root/go-gitver/gitver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,104 @@ | |||||||
|  | //go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver | ||||||
|  | 
 | ||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
|  | 	"go/format" | ||||||
|  | 	"os" | ||||||
|  | 	"text/template" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"git.rootprojects.org/root/go-gitver/gitver" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var GitRev, GitVersion, GitTimestamp string | ||||||
|  | var exitCode int | ||||||
|  | var verFile = "xversion.go" | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	pkg := "main" | ||||||
|  | 
 | ||||||
|  | 	args := os.Args[1:] | ||||||
|  | 	for i := range args { | ||||||
|  | 		arg := args[i] | ||||||
|  | 		if "-f" == arg || "--fail" == arg { | ||||||
|  | 			exitCode = 1 | ||||||
|  | 		} else if ("--outfile" == arg || "-o" == arg) && len(args) > i+1 { | ||||||
|  | 			verFile = args[i+1] | ||||||
|  | 			args[i+1] = "" | ||||||
|  | 		} else if "--package" == arg && len(args) > i+1 { | ||||||
|  | 			pkg = args[i+1] | ||||||
|  | 			args[i+1] = "" | ||||||
|  | 		} else if "-V" == arg || "version" == arg || "-version" == arg || "--version" == arg { | ||||||
|  | 			fmt.Println(GitRev) | ||||||
|  | 			fmt.Println(GitVersion) | ||||||
|  | 			fmt.Println(GitTimestamp) | ||||||
|  | 			os.Exit(0) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if "" != os.Getenv("GITVER_FAIL") && "false" != os.Getenv("GITVER_FAIL") { | ||||||
|  | 		exitCode = 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	v, err := gitver.ExecAndParse() | ||||||
|  | 	if nil != err { | ||||||
|  | 		fmt.Fprintf(os.Stderr, "Failed to get git version: %s\n", err) | ||||||
|  | 		if exitCode > 0 { | ||||||
|  | 			os.Exit(exitCode) | ||||||
|  | 		} | ||||||
|  | 		v = &gitver.Versions{ | ||||||
|  | 			Timestamp: time.Now(), | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Create or overwrite the go file from template | ||||||
|  | 	var buf bytes.Buffer | ||||||
|  | 	if err := versionTpl.Execute(&buf, struct { | ||||||
|  | 		Package   string | ||||||
|  | 		Timestamp string | ||||||
|  | 		Version   string | ||||||
|  | 		GitRev    string | ||||||
|  | 	}{ | ||||||
|  | 		Package:   pkg, | ||||||
|  | 		Timestamp: v.Timestamp.Format(time.RFC3339), | ||||||
|  | 		Version:   v.Version, | ||||||
|  | 		GitRev:    v.Rev, | ||||||
|  | 	}); nil != err { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Format | ||||||
|  | 	src, err := format.Source(buf.Bytes()) | ||||||
|  | 	if nil != err { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Write to disk (in the Current Working Directory) | ||||||
|  | 	f, err := os.Create(verFile) | ||||||
|  | 	if nil != err { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 	if _, err := f.Write(src); nil != err { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 	if err := f.Close(); nil != err { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var versionTpl = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT. | ||||||
|  | package {{ .Package }} | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	{{ if .GitRev -}} | ||||||
|  | 	GitRev = "{{ .GitRev }}" | ||||||
|  | 	{{ end -}} | ||||||
|  | 	{{ if .Version -}} | ||||||
|  | 	GitVersion = "{{ .Version }}" | ||||||
|  | 	{{ end -}} | ||||||
|  | 	GitTimestamp = "{{ .Timestamp }}" | ||||||
|  | } | ||||||
|  | `)) | ||||||
							
								
								
									
										143
									
								
								vendor/git.rootprojects.org/root/go-gitver/gitver/gitver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								vendor/git.rootprojects.org/root/go-gitver/gitver/gitver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,143 @@ | |||||||
|  | package gitver | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os/exec" | ||||||
|  | 	"regexp" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var exactVer *regexp.Regexp | ||||||
|  | var gitVer *regexp.Regexp | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	// exactly vX.Y.Z (go-compatible semver) | ||||||
|  | 	exactVer = regexp.MustCompile(`^v\d+\.\d+\.\d+$`) | ||||||
|  | 
 | ||||||
|  | 	// vX.Y.Z-n-g0000000 git post-release, semver prerelease | ||||||
|  | 	// vX.Y.Z-dirty git post-release, semver prerelease | ||||||
|  | 	gitVer = regexp.MustCompile(`^(v\d+\.\d+)\.(\d+)(-(\d+))?(-(g[0-9a-f]+))?(-(dirty))?`) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Versions struct { | ||||||
|  | 	Timestamp time.Time | ||||||
|  | 	Version   string | ||||||
|  | 	Rev       string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ExecAndParse() (*Versions, error) { | ||||||
|  | 	desc, err := gitDesc() | ||||||
|  | 	if nil != err { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	rev, err := gitRev() | ||||||
|  | 	if nil != err { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	ver, err := semVer(desc) | ||||||
|  | 	if nil != err { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	ts, err := gitTimestamp(desc) | ||||||
|  | 	if nil != err { | ||||||
|  | 		ts = time.Now() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return &Versions{ | ||||||
|  | 		Timestamp: ts, | ||||||
|  | 		Version:   ver, | ||||||
|  | 		Rev:       rev, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func gitDesc() (string, error) { | ||||||
|  | 	args := strings.Split("git describe --tags --dirty --always", " ") | ||||||
|  | 	cmd := exec.Command(args[0], args[1:]...) | ||||||
|  | 	out, err := cmd.CombinedOutput() | ||||||
|  | 	if nil != err { | ||||||
|  | 		// Don't panic, just carry on | ||||||
|  | 		//out = []byte("v0.0.0-0-g0000000") | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	return strings.TrimSpace(string(out)), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func gitRev() (string, error) { | ||||||
|  | 	args := strings.Split("git rev-parse HEAD", " ") | ||||||
|  | 	cmd := exec.Command(args[0], args[1:]...) | ||||||
|  | 	out, err := cmd.CombinedOutput() | ||||||
|  | 	if nil != err { | ||||||
|  | 		return "", fmt.Errorf("\nUnexpected Error\n\n"+ | ||||||
|  | 			"Please open an issue at https://git.rootprojects.org/root/go-gitver/issues/new \n"+ | ||||||
|  | 			"Please include the following:\n\n"+ | ||||||
|  | 			"Command: %s\n"+ | ||||||
|  | 			"Output: %s\n"+ | ||||||
|  | 			"Error: %s\n"+ | ||||||
|  | 			"\nPlease and Thank You.\n\n", strings.Join(args, " "), out, err) | ||||||
|  | 	} | ||||||
|  | 	return strings.TrimSpace(string(out)), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func semVer(desc string) (string, error) { | ||||||
|  | 	if exactVer.MatchString(desc) { | ||||||
|  | 		// v1.0.0 | ||||||
|  | 		return desc, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if !gitVer.MatchString(desc) { | ||||||
|  | 		return "", nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// (v1.0).(0)(-(1))(-(g0000000))(-(dirty)) | ||||||
|  | 	vers := gitVer.FindStringSubmatch(desc) | ||||||
|  | 	patch, err := strconv.Atoi(vers[2]) | ||||||
|  | 	if nil != err { | ||||||
|  | 		return "", fmt.Errorf("\nUnexpected Error\n\n"+ | ||||||
|  | 			"Please open an issue at https://git.rootprojects.org/root/go-gitver/issues/new \n"+ | ||||||
|  | 			"Please include the following:\n\n"+ | ||||||
|  | 			"git description: %s\n"+ | ||||||
|  | 			"RegExp: %#v\n"+ | ||||||
|  | 			"Error: %s\n"+ | ||||||
|  | 			"\nPlease and Thank You.\n\n", desc, gitVer, err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// v1.0.1-pre1 | ||||||
|  | 	// v1.0.1-pre1+g0000000 | ||||||
|  | 	// v1.0.1-pre0+dirty | ||||||
|  | 	// v1.0.1-pre0+g0000000-dirty | ||||||
|  | 	if "" == vers[4] { | ||||||
|  | 		vers[4] = "0" | ||||||
|  | 	} | ||||||
|  | 	ver := fmt.Sprintf("%s.%d-pre%s", vers[1], patch+1, vers[4]) | ||||||
|  | 	if "" != vers[6] || "dirty" == vers[8] { | ||||||
|  | 		ver += "+" | ||||||
|  | 		if "" != vers[6] { | ||||||
|  | 			ver += vers[6] | ||||||
|  | 			if "" != vers[8] { | ||||||
|  | 				ver += "-" | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		ver += vers[8] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return ver, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func gitTimestamp(desc string) (time.Time, error) { | ||||||
|  | 	args := []string{ | ||||||
|  | 		"git", | ||||||
|  | 		"show", desc, | ||||||
|  | 		"--format=%cd", | ||||||
|  | 		"--date=format:%Y-%m-%dT%H:%M:%SZ%z", | ||||||
|  | 		"--no-patch", | ||||||
|  | 	} | ||||||
|  | 	cmd := exec.Command(args[0], args[1:]...) | ||||||
|  | 	out, err := cmd.CombinedOutput() | ||||||
|  | 	if nil != err { | ||||||
|  | 		// a dirty desc was probably used | ||||||
|  | 		return time.Time{}, err | ||||||
|  | 	} | ||||||
|  | 	return time.Parse(time.RFC3339, strings.TrimSpace(string(out))) | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								vendor/git.rootprojects.org/root/go-gitver/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/git.rootprojects.org/root/go-gitver/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | module git.rootprojects.org/root/go-gitver | ||||||
|  | 
 | ||||||
|  | go 1.12 | ||||||
							
								
								
									
										9
									
								
								vendor/git.rootprojects.org/root/go-gitver/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/git.rootprojects.org/root/go-gitver/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | // use recently generated version info as a fallback | ||||||
|  | // for when git isn't present (i.e. go run <url>) | ||||||
|  | func init() { | ||||||
|  | 	GitRev = "0921ed1e6007493c886c87ee9a15f2cceecb1f9f" | ||||||
|  | 	GitVersion = "v1.1.2" | ||||||
|  | 	GitTimestamp = "2019-07-01T02:32:58-06:00" | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/sys/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/sys/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | # 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
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/sys/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | # 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. | ||||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/sys/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/sys/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | Copyright (c) 2009 The Go Authors. All rights reserved. | ||||||
|  | 
 | ||||||
|  | Redistribution and use in source and binary forms, with or without | ||||||
|  | modification, are permitted provided that the following conditions are | ||||||
|  | met: | ||||||
|  | 
 | ||||||
|  |    * Redistributions of source code must retain the above copyright | ||||||
|  | notice, this list of conditions and the following disclaimer. | ||||||
|  |    * Redistributions in binary form must reproduce the above | ||||||
|  | copyright notice, this list of conditions and the following disclaimer | ||||||
|  | in the documentation and/or other materials provided with the | ||||||
|  | distribution. | ||||||
|  |    * Neither the name of Google Inc. nor the names of its | ||||||
|  | contributors may be used to endorse or promote products derived from | ||||||
|  | this software without specific prior written permission. | ||||||
|  | 
 | ||||||
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | Additional IP Rights Grant (Patents) | ||||||
|  | 
 | ||||||
|  | "This implementation" means the copyrightable works distributed by | ||||||
|  | Google as part of the Go project. | ||||||
|  | 
 | ||||||
|  | Google hereby grants to You a perpetual, worldwide, non-exclusive, | ||||||
|  | no-charge, royalty-free, irrevocable (except as stated in this section) | ||||||
|  | patent license to make, have made, use, offer to sell, sell, import, | ||||||
|  | transfer and otherwise run, modify and propagate the contents of this | ||||||
|  | implementation of Go, where such license applies only to those patent | ||||||
|  | claims, both currently owned or controlled by Google and acquired in | ||||||
|  | the future, licensable by Google that are necessarily infringed by this | ||||||
|  | implementation of Go.  This grant does not include claims that would be | ||||||
|  | infringed only as a consequence of further modification of this | ||||||
|  | implementation.  If you or your agent or exclusive licensee institute or | ||||||
|  | order or agree to the institution of patent litigation against any | ||||||
|  | entity (including a cross-claim or counterclaim in a lawsuit) alleging | ||||||
|  | that this implementation of Go or any code incorporated within this | ||||||
|  | implementation of Go constitutes direct or contributory patent | ||||||
|  | infringement, or inducement of patent infringement, then any patent | ||||||
|  | rights granted to you under this License for this implementation of Go | ||||||
|  | shall terminate as of the date such litigation is filed. | ||||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/aliases.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/aliases.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | // 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | // +build go1.9 | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | import "syscall" | ||||||
|  | 
 | ||||||
|  | type Errno = syscall.Errno | ||||||
|  | type SysProcAttr = syscall.SysProcAttr | ||||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_386.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_386.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | // 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
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/asm_windows_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | // 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
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/golang.org/x/sys/windows/asm_windows_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | // 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) | ||||||
							
								
								
									
										378
									
								
								vendor/golang.org/x/sys/windows/dll_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										378
									
								
								vendor/golang.org/x/sys/windows/dll_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,378 @@ | |||||||
|  | // 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 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"sync" | ||||||
|  | 	"sync/atomic" | ||||||
|  | 	"syscall" | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // DLLError describes reasons for DLL load failures. | ||||||
|  | type DLLError struct { | ||||||
|  | 	Err     error | ||||||
|  | 	ObjName string | ||||||
|  | 	Msg     string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (e *DLLError) Error() string { return e.Msg } | ||||||
|  | 
 | ||||||
|  | // Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. | ||||||
|  | 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. | ||||||
|  | type DLL struct { | ||||||
|  | 	Name   string | ||||||
|  | 	Handle Handle | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // LoadDLL loads DLL file into memory. | ||||||
|  | // | ||||||
|  | // Warning: using LoadDLL without an absolute path name is subject to | ||||||
|  | // DLL preloading attacks. To safely load a system DLL, use LazyDLL | ||||||
|  | // with System set to true, or use LoadLibraryEx directly. | ||||||
|  | func LoadDLL(name string) (dll *DLL, err error) { | ||||||
|  | 	namep, err := UTF16PtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	h, e := loadlibrary(namep) | ||||||
|  | 	if e != 0 { | ||||||
|  | 		return nil, &DLLError{ | ||||||
|  | 			Err:     e, | ||||||
|  | 			ObjName: name, | ||||||
|  | 			Msg:     "Failed to load " + name + ": " + e.Error(), | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	d := &DLL{ | ||||||
|  | 		Name:   name, | ||||||
|  | 		Handle: Handle(h), | ||||||
|  | 	} | ||||||
|  | 	return d, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MustLoadDLL is like LoadDLL but panics if load operation failes. | ||||||
|  | func MustLoadDLL(name string) *DLL { | ||||||
|  | 	d, e := LoadDLL(name) | ||||||
|  | 	if e != nil { | ||||||
|  | 		panic(e) | ||||||
|  | 	} | ||||||
|  | 	return d | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FindProc searches DLL d for procedure named name and returns *Proc | ||||||
|  | // if found. It returns an error if search fails. | ||||||
|  | func (d *DLL) FindProc(name string) (proc *Proc, err error) { | ||||||
|  | 	namep, err := BytePtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	a, e := getprocaddress(uintptr(d.Handle), namep) | ||||||
|  | 	if e != 0 { | ||||||
|  | 		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 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MustFindProc is like FindProc but panics if search fails. | ||||||
|  | func (d *DLL) MustFindProc(name string) *Proc { | ||||||
|  | 	p, e := d.FindProc(name) | ||||||
|  | 	if e != nil { | ||||||
|  | 		panic(e) | ||||||
|  | 	} | ||||||
|  | 	return p | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Release unloads DLL d from memory. | ||||||
|  | func (d *DLL) Release() (err error) { | ||||||
|  | 	return FreeLibrary(d.Handle) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // A Proc implements access to a procedure inside a DLL. | ||||||
|  | type Proc struct { | ||||||
|  | 	Dll  *DLL | ||||||
|  | 	Name string | ||||||
|  | 	addr uintptr | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Addr returns the address of the procedure represented by p. | ||||||
|  | // The return value can be passed to Syscall to run the procedure. | ||||||
|  | func (p *Proc) Addr() uintptr { | ||||||
|  | 	return p.addr | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //go:uintptrescapes | ||||||
|  | 
 | ||||||
|  | // Call executes procedure p with arguments a. It will panic, if more than 15 arguments | ||||||
|  | // are supplied. | ||||||
|  | // | ||||||
|  | // The returned error is always non-nil, constructed from the result of GetLastError. | ||||||
|  | // Callers must inspect the primary return value to decide whether an error occurred | ||||||
|  | // (according to the semantics of the specific function being called) before consulting | ||||||
|  | // the error. The error will be guaranteed to contain windows.Errno. | ||||||
|  | func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { | ||||||
|  | 	switch len(a) { | ||||||
|  | 	case 0: | ||||||
|  | 		return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0) | ||||||
|  | 	case 1: | ||||||
|  | 		return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0) | ||||||
|  | 	case 2: | ||||||
|  | 		return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0) | ||||||
|  | 	case 3: | ||||||
|  | 		return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2]) | ||||||
|  | 	case 4: | ||||||
|  | 		return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0) | ||||||
|  | 	case 5: | ||||||
|  | 		return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0) | ||||||
|  | 	case 6: | ||||||
|  | 		return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5]) | ||||||
|  | 	case 7: | ||||||
|  | 		return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) | ||||||
|  | 	case 8: | ||||||
|  | 		return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) | ||||||
|  | 	case 9: | ||||||
|  | 		return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) | ||||||
|  | 	case 10: | ||||||
|  | 		return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) | ||||||
|  | 	case 11: | ||||||
|  | 		return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) | ||||||
|  | 	case 12: | ||||||
|  | 		return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) | ||||||
|  | 	case 13: | ||||||
|  | 		return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) | ||||||
|  | 	case 14: | ||||||
|  | 		return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) | ||||||
|  | 	case 15: | ||||||
|  | 		return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) | ||||||
|  | 	default: | ||||||
|  | 		panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // A LazyDLL implements access to a single DLL. | ||||||
|  | // It will delay the load of the DLL until the first | ||||||
|  | // call to its Handle method or to one of its | ||||||
|  | // LazyProc's Addr method. | ||||||
|  | type LazyDLL struct { | ||||||
|  | 	Name string | ||||||
|  | 
 | ||||||
|  | 	// System determines whether the DLL must be loaded from the | ||||||
|  | 	// Windows System directory, bypassing the normal DLL search | ||||||
|  | 	// path. | ||||||
|  | 	System bool | ||||||
|  | 
 | ||||||
|  | 	mu  sync.Mutex | ||||||
|  | 	dll *DLL // non nil once DLL is loaded | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Load loads DLL file d.Name into memory. It returns an error if fails. | ||||||
|  | // Load will not try to load DLL, if it is already loaded into memory. | ||||||
|  | func (d *LazyDLL) Load() error { | ||||||
|  | 	// Non-racy version of: | ||||||
|  | 	// if d.dll != nil { | ||||||
|  | 	if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	d.mu.Lock() | ||||||
|  | 	defer d.mu.Unlock() | ||||||
|  | 	if d.dll != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// kernel32.dll is special, since it's where LoadLibraryEx comes from. | ||||||
|  | 	// The kernel already special-cases its name, so it's always | ||||||
|  | 	// loaded from system32. | ||||||
|  | 	var dll *DLL | ||||||
|  | 	var err error | ||||||
|  | 	if d.Name == "kernel32.dll" { | ||||||
|  | 		dll, err = LoadDLL(d.Name) | ||||||
|  | 	} else { | ||||||
|  | 		dll, err = loadLibraryEx(d.Name, d.System) | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Non-racy version of: | ||||||
|  | 	// d.dll = dll | ||||||
|  | 	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll)) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // mustLoad is like Load but panics if search fails. | ||||||
|  | func (d *LazyDLL) mustLoad() { | ||||||
|  | 	e := d.Load() | ||||||
|  | 	if e != nil { | ||||||
|  | 		panic(e) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle returns d's module handle. | ||||||
|  | func (d *LazyDLL) Handle() uintptr { | ||||||
|  | 	d.mustLoad() | ||||||
|  | 	return uintptr(d.dll.Handle) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewProc returns a LazyProc for accessing the named procedure in the DLL d. | ||||||
|  | func (d *LazyDLL) NewProc(name string) *LazyProc { | ||||||
|  | 	return &LazyProc{l: d, Name: name} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewLazyDLL creates new LazyDLL associated with DLL file. | ||||||
|  | func NewLazyDLL(name string) *LazyDLL { | ||||||
|  | 	return &LazyDLL{Name: name} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewLazySystemDLL is like NewLazyDLL, but will only | ||||||
|  | // search Windows System directory for the DLL if name is | ||||||
|  | // a base name (like "advapi32.dll"). | ||||||
|  | func NewLazySystemDLL(name string) *LazyDLL { | ||||||
|  | 	return &LazyDLL{Name: name, System: true} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // A LazyProc implements access to a procedure inside a LazyDLL. | ||||||
|  | // It delays the lookup until the Addr method is called. | ||||||
|  | type LazyProc struct { | ||||||
|  | 	Name string | ||||||
|  | 
 | ||||||
|  | 	mu   sync.Mutex | ||||||
|  | 	l    *LazyDLL | ||||||
|  | 	proc *Proc | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Find searches DLL for procedure named p.Name. It returns | ||||||
|  | // an error if search fails. Find will not search procedure, | ||||||
|  | // if it is already found and loaded into memory. | ||||||
|  | func (p *LazyProc) Find() error { | ||||||
|  | 	// Non-racy version of: | ||||||
|  | 	// if p.proc == nil { | ||||||
|  | 	if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil { | ||||||
|  | 		p.mu.Lock() | ||||||
|  | 		defer p.mu.Unlock() | ||||||
|  | 		if p.proc == nil { | ||||||
|  | 			e := p.l.Load() | ||||||
|  | 			if e != nil { | ||||||
|  | 				return e | ||||||
|  | 			} | ||||||
|  | 			proc, e := p.l.dll.FindProc(p.Name) | ||||||
|  | 			if e != nil { | ||||||
|  | 				return e | ||||||
|  | 			} | ||||||
|  | 			// Non-racy version of: | ||||||
|  | 			// p.proc = proc | ||||||
|  | 			atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // mustFind is like Find but panics if search fails. | ||||||
|  | func (p *LazyProc) mustFind() { | ||||||
|  | 	e := p.Find() | ||||||
|  | 	if e != nil { | ||||||
|  | 		panic(e) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Addr returns the address of the procedure represented by p. | ||||||
|  | // The return value can be passed to Syscall to run the procedure. | ||||||
|  | // It will panic if the procedure cannot be found. | ||||||
|  | func (p *LazyProc) Addr() uintptr { | ||||||
|  | 	p.mustFind() | ||||||
|  | 	return p.proc.Addr() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //go:uintptrescapes | ||||||
|  | 
 | ||||||
|  | // Call executes procedure p with arguments a. It will panic, if more than 15 arguments | ||||||
|  | // are supplied. It will also panic if the procedure cannot be found. | ||||||
|  | // | ||||||
|  | // The returned error is always non-nil, constructed from the result of GetLastError. | ||||||
|  | // Callers must inspect the primary return value to decide whether an error occurred | ||||||
|  | // (according to the semantics of the specific function being called) before consulting | ||||||
|  | // the error. The error will be guaranteed to contain windows.Errno. | ||||||
|  | func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { | ||||||
|  | 	p.mustFind() | ||||||
|  | 	return p.proc.Call(a...) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var canDoSearchSystem32Once struct { | ||||||
|  | 	sync.Once | ||||||
|  | 	v bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func initCanDoSearchSystem32() { | ||||||
|  | 	// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says: | ||||||
|  | 	// "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows | ||||||
|  | 	// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on | ||||||
|  | 	// systems that have KB2533623 installed. To determine whether the | ||||||
|  | 	// flags are available, use GetProcAddress to get the address of the | ||||||
|  | 	// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories | ||||||
|  | 	// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_* | ||||||
|  | 	// flags can be used with LoadLibraryEx." | ||||||
|  | 	canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func canDoSearchSystem32() bool { | ||||||
|  | 	canDoSearchSystem32Once.Do(initCanDoSearchSystem32) | ||||||
|  | 	return canDoSearchSystem32Once.v | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func isBaseName(name string) bool { | ||||||
|  | 	for _, c := range name { | ||||||
|  | 		if c == ':' || c == '/' || c == '\\' { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // loadLibraryEx wraps the Windows LoadLibraryEx function. | ||||||
|  | // | ||||||
|  | // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx | ||||||
|  | // | ||||||
|  | // If name is not an absolute path, LoadLibraryEx searches for the DLL | ||||||
|  | // in a variety of automatic locations unless constrained by flags. | ||||||
|  | // See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx | ||||||
|  | func loadLibraryEx(name string, system bool) (*DLL, error) { | ||||||
|  | 	loadDLL := name | ||||||
|  | 	var flags uintptr | ||||||
|  | 	if system { | ||||||
|  | 		if canDoSearchSystem32() { | ||||||
|  | 			const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 | ||||||
|  | 			flags = LOAD_LIBRARY_SEARCH_SYSTEM32 | ||||||
|  | 		} else if isBaseName(name) { | ||||||
|  | 			// WindowsXP or unpatched Windows machine | ||||||
|  | 			// trying to load "foo.dll" out of the system | ||||||
|  | 			// folder, but LoadLibraryEx doesn't support | ||||||
|  | 			// that yet on their system, so emulate it. | ||||||
|  | 			systemdir, err := GetSystemDirectory() | ||||||
|  | 			if err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
|  | 			loadDLL = systemdir + "\\" + name | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	h, err := LoadLibraryEx(loadDLL, 0, flags) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &DLL{Name: name, Handle: h}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type errString string | ||||||
|  | 
 | ||||||
|  | func (s errString) Error() string { return string(s) } | ||||||
							
								
								
									
										61
									
								
								vendor/golang.org/x/sys/windows/env_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/golang.org/x/sys/windows/env_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | // Copyright 2010 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. | ||||||
|  | 
 | ||||||
|  | // Windows environment variables. | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | 	"unicode/utf16" | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func Getenv(key string) (value string, found bool) { | ||||||
|  | 	return syscall.Getenv(key) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Setenv(key, value string) error { | ||||||
|  | 	return syscall.Setenv(key, value) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Clearenv() { | ||||||
|  | 	syscall.Clearenv() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Environ() []string { | ||||||
|  | 	return syscall.Environ() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Returns a default environment associated with the token, rather than the current | ||||||
|  | // process. If inheritExisting is true, then this environment also inherits the | ||||||
|  | // environment of the current process. | ||||||
|  | func (token Token) Environ(inheritExisting bool) (env []string, err error) { | ||||||
|  | 	var block *uint16 | ||||||
|  | 	err = CreateEnvironmentBlock(&block, token, inheritExisting) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer DestroyEnvironmentBlock(block) | ||||||
|  | 	blockp := uintptr(unsafe.Pointer(block)) | ||||||
|  | 	for { | ||||||
|  | 		entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:] | ||||||
|  | 		for i, v := range entry { | ||||||
|  | 			if v == 0 { | ||||||
|  | 				entry = entry[:i] | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if len(entry) == 0 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		env = append(env, string(utf16.Decode(entry))) | ||||||
|  | 		blockp += 2 * (uintptr(len(entry)) + 1) | ||||||
|  | 	} | ||||||
|  | 	return env, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Unsetenv(key string) error { | ||||||
|  | 	return syscall.Unsetenv(key) | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/sys/windows/eventlog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/sys/windows/eventlog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | // Copyright 2012 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	EVENTLOG_SUCCESS          = 0 | ||||||
|  | 	EVENTLOG_ERROR_TYPE       = 1 | ||||||
|  | 	EVENTLOG_WARNING_TYPE     = 2 | ||||||
|  | 	EVENTLOG_INFORMATION_TYPE = 4 | ||||||
|  | 	EVENTLOG_AUDIT_SUCCESS    = 8 | ||||||
|  | 	EVENTLOG_AUDIT_FAILURE    = 16 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | //sys	RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW | ||||||
|  | //sys	DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource | ||||||
|  | //sys	ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW | ||||||
							
								
								
									
										97
									
								
								vendor/golang.org/x/sys/windows/exec_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								vendor/golang.org/x/sys/windows/exec_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | |||||||
|  | // 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. | ||||||
|  | 
 | ||||||
|  | // Fork, exec, wait, etc. | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | // EscapeArg rewrites command line argument s as prescribed | ||||||
|  | // in http://msdn.microsoft.com/en-us/library/ms880421. | ||||||
|  | // This function returns "" (2 double quotes) if s is empty. | ||||||
|  | // Alternatively, these transformations are done: | ||||||
|  | // - every back slash (\) is doubled, but only if immediately | ||||||
|  | //   followed by double quote ("); | ||||||
|  | // - every double quote (") is escaped by back slash (\); | ||||||
|  | // - finally, s is wrapped with double quotes (arg -> "arg"), | ||||||
|  | //   but only if there is space or tab inside s. | ||||||
|  | func EscapeArg(s string) string { | ||||||
|  | 	if len(s) == 0 { | ||||||
|  | 		return "\"\"" | ||||||
|  | 	} | ||||||
|  | 	n := len(s) | ||||||
|  | 	hasSpace := false | ||||||
|  | 	for i := 0; i < len(s); i++ { | ||||||
|  | 		switch s[i] { | ||||||
|  | 		case '"', '\\': | ||||||
|  | 			n++ | ||||||
|  | 		case ' ', '\t': | ||||||
|  | 			hasSpace = true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if hasSpace { | ||||||
|  | 		n += 2 | ||||||
|  | 	} | ||||||
|  | 	if n == len(s) { | ||||||
|  | 		return s | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	qs := make([]byte, n) | ||||||
|  | 	j := 0 | ||||||
|  | 	if hasSpace { | ||||||
|  | 		qs[j] = '"' | ||||||
|  | 		j++ | ||||||
|  | 	} | ||||||
|  | 	slashes := 0 | ||||||
|  | 	for i := 0; i < len(s); i++ { | ||||||
|  | 		switch s[i] { | ||||||
|  | 		default: | ||||||
|  | 			slashes = 0 | ||||||
|  | 			qs[j] = s[i] | ||||||
|  | 		case '\\': | ||||||
|  | 			slashes++ | ||||||
|  | 			qs[j] = s[i] | ||||||
|  | 		case '"': | ||||||
|  | 			for ; slashes > 0; slashes-- { | ||||||
|  | 				qs[j] = '\\' | ||||||
|  | 				j++ | ||||||
|  | 			} | ||||||
|  | 			qs[j] = '\\' | ||||||
|  | 			j++ | ||||||
|  | 			qs[j] = s[i] | ||||||
|  | 		} | ||||||
|  | 		j++ | ||||||
|  | 	} | ||||||
|  | 	if hasSpace { | ||||||
|  | 		for ; slashes > 0; slashes-- { | ||||||
|  | 			qs[j] = '\\' | ||||||
|  | 			j++ | ||||||
|  | 		} | ||||||
|  | 		qs[j] = '"' | ||||||
|  | 		j++ | ||||||
|  | 	} | ||||||
|  | 	return string(qs[:j]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CloseOnExec(fd Handle) { | ||||||
|  | 	SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FullPath retrieves the full path of the specified file. | ||||||
|  | func FullPath(name string) (path string, err error) { | ||||||
|  | 	p, err := UTF16PtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	n := uint32(100) | ||||||
|  | 	for { | ||||||
|  | 		buf := make([]uint16, n) | ||||||
|  | 		n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", err | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(buf)) { | ||||||
|  | 			return UTF16ToString(buf[:n]), nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								vendor/golang.org/x/sys/windows/memory_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/golang.org/x/sys/windows/memory_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | // Copyright 2017 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 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	MEM_COMMIT      = 0x00001000 | ||||||
|  | 	MEM_RESERVE     = 0x00002000 | ||||||
|  | 	MEM_DECOMMIT    = 0x00004000 | ||||||
|  | 	MEM_RELEASE     = 0x00008000 | ||||||
|  | 	MEM_RESET       = 0x00080000 | ||||||
|  | 	MEM_TOP_DOWN    = 0x00100000 | ||||||
|  | 	MEM_WRITE_WATCH = 0x00200000 | ||||||
|  | 	MEM_PHYSICAL    = 0x00400000 | ||||||
|  | 	MEM_RESET_UNDO  = 0x01000000 | ||||||
|  | 	MEM_LARGE_PAGES = 0x20000000 | ||||||
|  | 
 | ||||||
|  | 	PAGE_NOACCESS          = 0x01 | ||||||
|  | 	PAGE_READONLY          = 0x02 | ||||||
|  | 	PAGE_READWRITE         = 0x04 | ||||||
|  | 	PAGE_WRITECOPY         = 0x08 | ||||||
|  | 	PAGE_EXECUTE_READ      = 0x20 | ||||||
|  | 	PAGE_EXECUTE_READWRITE = 0x40 | ||||||
|  | 	PAGE_EXECUTE_WRITECOPY = 0x80 | ||||||
|  | ) | ||||||
							
								
								
									
										63
									
								
								vendor/golang.org/x/sys/windows/mkerrors.bash
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/golang.org/x/sys/windows/mkerrors.bash
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | # 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. | ||||||
|  | 
 | ||||||
|  | set -e | ||||||
|  | shopt -s nullglob | ||||||
|  | 
 | ||||||
|  | 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; } | ||||||
|  | 
 | ||||||
|  | declare -A errors | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  | 	echo "// Code generated by 'mkerrors.bash'; DO NOT EDIT." | ||||||
|  | 	echo | ||||||
|  | 	echo "package windows" | ||||||
|  | 	echo "import \"syscall\"" | ||||||
|  | 	echo "const (" | ||||||
|  | 
 | ||||||
|  | 	while read -r line; do | ||||||
|  | 		unset vtype | ||||||
|  | 		if [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +([A-Z0-9_]+\()?([A-Z][A-Z0-9_]+k?)\)? ]]; then | ||||||
|  | 			key="${BASH_REMATCH[1]}" | ||||||
|  | 			value="${BASH_REMATCH[3]}" | ||||||
|  | 		elif [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +([A-Z0-9_]+\()?((0x)?[0-9A-Fa-f]+)L?\)? ]]; then | ||||||
|  | 			key="${BASH_REMATCH[1]}" | ||||||
|  | 			value="${BASH_REMATCH[3]}" | ||||||
|  | 			vtype="${BASH_REMATCH[2]}" | ||||||
|  | 		elif [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +\(\(([A-Z]+)\)((0x)?[0-9A-Fa-f]+)L?\) ]]; then | ||||||
|  | 			key="${BASH_REMATCH[1]}" | ||||||
|  | 			value="${BASH_REMATCH[3]}" | ||||||
|  | 			vtype="${BASH_REMATCH[2]}" | ||||||
|  | 		else | ||||||
|  | 			continue | ||||||
|  | 		fi | ||||||
|  | 		[[ -n $key && -n $value ]] || continue | ||||||
|  | 		[[ -z ${errors["$key"]} ]] || continue | ||||||
|  | 		errors["$key"]="$value" | ||||||
|  | 		if [[ -v vtype ]]; then | ||||||
|  | 			if [[ $key == FACILITY_* || $key == NO_ERROR ]]; then | ||||||
|  | 				vtype="" | ||||||
|  | 			elif [[ $vtype == *HANDLE* || $vtype == *HRESULT* ]]; then | ||||||
|  | 				vtype="Handle" | ||||||
|  | 			else | ||||||
|  | 				vtype="syscall.Errno" | ||||||
|  | 			fi | ||||||
|  | 			last_vtype="$vtype" | ||||||
|  | 		else | ||||||
|  | 			vtype="" | ||||||
|  | 			if [[ $last_vtype == Handle && $value == NO_ERROR ]]; then | ||||||
|  | 				value="S_OK" | ||||||
|  | 			elif [[ $last_vtype == syscall.Errno && $value == NO_ERROR ]]; then | ||||||
|  | 				value="ERROR_SUCCESS" | ||||||
|  | 			fi | ||||||
|  | 		fi | ||||||
|  | 
 | ||||||
|  | 		echo "$key $vtype = $value" | ||||||
|  | 	done < "$winerror" | ||||||
|  | 
 | ||||||
|  | 	echo ")" | ||||||
|  | } | gofmt > "zerrors_windows.go" | ||||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/sys/windows/mkknownfolderids.bash
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/sys/windows/mkknownfolderids.bash
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | # 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. | ||||||
|  | 
 | ||||||
|  | set -e | ||||||
|  | shopt -s nullglob | ||||||
|  | 
 | ||||||
|  | knownfolders="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/um/KnownFolders.h | sort -Vr | head -n 1)" | ||||||
|  | [[ -n $knownfolders ]] || { echo "Unable to find KnownFolders.h" >&2; exit 1; } | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  | 	echo "// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT." | ||||||
|  | 	echo | ||||||
|  | 	echo "package windows" | ||||||
|  | 	echo "type KNOWNFOLDERID GUID" | ||||||
|  | 	echo "var (" | ||||||
|  | 	while read -r line; do | ||||||
|  | 		[[ $line =~ DEFINE_KNOWN_FOLDER\((FOLDERID_[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+)\) ]] || continue | ||||||
|  | 		printf "%s = &KNOWNFOLDERID{0x%08x, 0x%04x, 0x%04x, [8]byte{0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}\n" \ | ||||||
|  | 			"${BASH_REMATCH[1]}" $(( "${BASH_REMATCH[2]}" )) $(( "${BASH_REMATCH[3]}" )) $(( "${BASH_REMATCH[4]}" )) \ | ||||||
|  | 			$(( "${BASH_REMATCH[5]}" )) $(( "${BASH_REMATCH[6]}" )) $(( "${BASH_REMATCH[7]}" )) $(( "${BASH_REMATCH[8]}" )) \ | ||||||
|  | 			$(( "${BASH_REMATCH[9]}" )) $(( "${BASH_REMATCH[10]}" )) $(( "${BASH_REMATCH[11]}" )) $(( "${BASH_REMATCH[12]}" )) | ||||||
|  | 	done < "$knownfolders" | ||||||
|  | 	echo ")" | ||||||
|  | } | gofmt > "zknownfolderids_windows.go" | ||||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/sys/windows/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/sys/windows/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | // 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. | ||||||
|  | 
 | ||||||
|  | // +build generate | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
							
								
								
									
										30
									
								
								vendor/golang.org/x/sys/windows/race.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/golang.org/x/sys/windows/race.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | // Copyright 2012 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. | ||||||
|  | 
 | ||||||
|  | // +build windows,race | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"runtime" | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const raceenabled = true | ||||||
|  | 
 | ||||||
|  | func raceAcquire(addr unsafe.Pointer) { | ||||||
|  | 	runtime.RaceAcquire(addr) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func raceReleaseMerge(addr unsafe.Pointer) { | ||||||
|  | 	runtime.RaceReleaseMerge(addr) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func raceReadRange(addr unsafe.Pointer, len int) { | ||||||
|  | 	runtime.RaceReadRange(addr, len) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func raceWriteRange(addr unsafe.Pointer, len int) { | ||||||
|  | 	runtime.RaceWriteRange(addr, len) | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								vendor/golang.org/x/sys/windows/race0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/golang.org/x/sys/windows/race0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | // Copyright 2012 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. | ||||||
|  | 
 | ||||||
|  | // +build windows,!race | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const raceenabled = false | ||||||
|  | 
 | ||||||
|  | func raceAcquire(addr unsafe.Pointer) { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func raceReleaseMerge(addr unsafe.Pointer) { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func raceReadRange(addr unsafe.Pointer, len int) { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func raceWriteRange(addr unsafe.Pointer, len int) { | ||||||
|  | } | ||||||
							
								
								
									
										198
									
								
								vendor/golang.org/x/sys/windows/registry/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								vendor/golang.org/x/sys/windows/registry/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,198 @@ | |||||||
|  | // Copyright 2015 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | // Package registry provides access to the Windows registry. | ||||||
|  | // | ||||||
|  | // Here is a simple example, opening a registry key and reading a string value from it. | ||||||
|  | // | ||||||
|  | //	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) | ||||||
|  | //	if err != nil { | ||||||
|  | //		log.Fatal(err) | ||||||
|  | //	} | ||||||
|  | //	defer k.Close() | ||||||
|  | // | ||||||
|  | //	s, _, err := k.GetStringValue("SystemRoot") | ||||||
|  | //	if err != nil { | ||||||
|  | //		log.Fatal(err) | ||||||
|  | //	} | ||||||
|  | //	fmt.Printf("Windows system root is %q\n", s) | ||||||
|  | // | ||||||
|  | package registry | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"io" | ||||||
|  | 	"syscall" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// Registry key security and access rights. | ||||||
|  | 	// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx | ||||||
|  | 	// for details. | ||||||
|  | 	ALL_ACCESS         = 0xf003f | ||||||
|  | 	CREATE_LINK        = 0x00020 | ||||||
|  | 	CREATE_SUB_KEY     = 0x00004 | ||||||
|  | 	ENUMERATE_SUB_KEYS = 0x00008 | ||||||
|  | 	EXECUTE            = 0x20019 | ||||||
|  | 	NOTIFY             = 0x00010 | ||||||
|  | 	QUERY_VALUE        = 0x00001 | ||||||
|  | 	READ               = 0x20019 | ||||||
|  | 	SET_VALUE          = 0x00002 | ||||||
|  | 	WOW64_32KEY        = 0x00200 | ||||||
|  | 	WOW64_64KEY        = 0x00100 | ||||||
|  | 	WRITE              = 0x20006 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Key is a handle to an open Windows registry key. | ||||||
|  | // Keys can be obtained by calling OpenKey; there are | ||||||
|  | // also some predefined root keys such as CURRENT_USER. | ||||||
|  | // Keys can be used directly in the Windows API. | ||||||
|  | type Key syscall.Handle | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// Windows defines some predefined root keys that are always open. | ||||||
|  | 	// An application can use these keys as entry points to the registry. | ||||||
|  | 	// Normally these keys are used in OpenKey to open new keys, | ||||||
|  | 	// but they can also be used anywhere a Key is required. | ||||||
|  | 	CLASSES_ROOT     = Key(syscall.HKEY_CLASSES_ROOT) | ||||||
|  | 	CURRENT_USER     = Key(syscall.HKEY_CURRENT_USER) | ||||||
|  | 	LOCAL_MACHINE    = Key(syscall.HKEY_LOCAL_MACHINE) | ||||||
|  | 	USERS            = Key(syscall.HKEY_USERS) | ||||||
|  | 	CURRENT_CONFIG   = Key(syscall.HKEY_CURRENT_CONFIG) | ||||||
|  | 	PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Close closes open key k. | ||||||
|  | func (k Key) Close() error { | ||||||
|  | 	return syscall.RegCloseKey(syscall.Handle(k)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // OpenKey opens a new key with path name relative to key k. | ||||||
|  | // It accepts any open key, including CURRENT_USER and others, | ||||||
|  | // and returns the new key and an error. | ||||||
|  | // The access parameter specifies desired access rights to the | ||||||
|  | // key to be opened. | ||||||
|  | func OpenKey(k Key, path string, access uint32) (Key, error) { | ||||||
|  | 	p, err := syscall.UTF16PtrFromString(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	var subkey syscall.Handle | ||||||
|  | 	err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	return Key(subkey), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // OpenRemoteKey opens a predefined registry key on another | ||||||
|  | // computer pcname. The key to be opened is specified by k, but | ||||||
|  | // can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. | ||||||
|  | // If pcname is "", OpenRemoteKey returns local computer key. | ||||||
|  | func OpenRemoteKey(pcname string, k Key) (Key, error) { | ||||||
|  | 	var err error | ||||||
|  | 	var p *uint16 | ||||||
|  | 	if pcname != "" { | ||||||
|  | 		p, err = syscall.UTF16PtrFromString(`\\` + pcname) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return 0, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	var remoteKey syscall.Handle | ||||||
|  | 	err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	return Key(remoteKey), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadSubKeyNames returns the names of subkeys of key k. | ||||||
|  | // The parameter n controls the number of returned names, | ||||||
|  | // analogous to the way os.File.Readdirnames works. | ||||||
|  | func (k Key) ReadSubKeyNames(n int) ([]string, error) { | ||||||
|  | 	names := make([]string, 0) | ||||||
|  | 	// Registry key size limit is 255 bytes and described there: | ||||||
|  | 	// https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx | ||||||
|  | 	buf := make([]uint16, 256) //plus extra room for terminating zero byte | ||||||
|  | loopItems: | ||||||
|  | 	for i := uint32(0); ; i++ { | ||||||
|  | 		if n > 0 { | ||||||
|  | 			if len(names) == n { | ||||||
|  | 				return names, nil | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		l := uint32(len(buf)) | ||||||
|  | 		for { | ||||||
|  | 			err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) | ||||||
|  | 			if err == nil { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 			if err == syscall.ERROR_MORE_DATA { | ||||||
|  | 				// Double buffer size and try again. | ||||||
|  | 				l = uint32(2 * len(buf)) | ||||||
|  | 				buf = make([]uint16, l) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			if err == _ERROR_NO_MORE_ITEMS { | ||||||
|  | 				break loopItems | ||||||
|  | 			} | ||||||
|  | 			return names, err | ||||||
|  | 		} | ||||||
|  | 		names = append(names, syscall.UTF16ToString(buf[:l])) | ||||||
|  | 	} | ||||||
|  | 	if n > len(names) { | ||||||
|  | 		return names, io.EOF | ||||||
|  | 	} | ||||||
|  | 	return names, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CreateKey creates a key named path under open key k. | ||||||
|  | // CreateKey returns the new key and a boolean flag that reports | ||||||
|  | // whether the key already existed. | ||||||
|  | // The access parameter specifies the access rights for the key | ||||||
|  | // to be created. | ||||||
|  | func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { | ||||||
|  | 	var h syscall.Handle | ||||||
|  | 	var d uint32 | ||||||
|  | 	err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), | ||||||
|  | 		0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, false, err | ||||||
|  | 	} | ||||||
|  | 	return Key(h), d == _REG_OPENED_EXISTING_KEY, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteKey deletes the subkey path of key k and its values. | ||||||
|  | func DeleteKey(k Key, path string) error { | ||||||
|  | 	return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // A KeyInfo describes the statistics of a key. It is returned by Stat. | ||||||
|  | type KeyInfo struct { | ||||||
|  | 	SubKeyCount     uint32 | ||||||
|  | 	MaxSubKeyLen    uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte | ||||||
|  | 	ValueCount      uint32 | ||||||
|  | 	MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte | ||||||
|  | 	MaxValueLen     uint32 // longest data component among the key's values, in bytes | ||||||
|  | 	lastWriteTime   syscall.Filetime | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ModTime returns the key's last write time. | ||||||
|  | func (ki *KeyInfo) ModTime() time.Time { | ||||||
|  | 	return time.Unix(0, ki.lastWriteTime.Nanoseconds()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Stat retrieves information about the open key k. | ||||||
|  | func (k Key) Stat() (*KeyInfo, error) { | ||||||
|  | 	var ki KeyInfo | ||||||
|  | 	err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, | ||||||
|  | 		&ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, | ||||||
|  | 		&ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &ki, nil | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/sys/windows/registry/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/sys/windows/registry/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | // Copyright 2015 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. | ||||||
|  | 
 | ||||||
|  | // +build generate | ||||||
|  | 
 | ||||||
|  | package registry | ||||||
|  | 
 | ||||||
|  | //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go | ||||||
							
								
								
									
										32
									
								
								vendor/golang.org/x/sys/windows/registry/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								vendor/golang.org/x/sys/windows/registry/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | // Copyright 2015 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | package registry | ||||||
|  | 
 | ||||||
|  | import "syscall" | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_REG_OPTION_NON_VOLATILE = 0 | ||||||
|  | 
 | ||||||
|  | 	_REG_CREATED_NEW_KEY     = 1 | ||||||
|  | 	_REG_OPENED_EXISTING_KEY = 2 | ||||||
|  | 
 | ||||||
|  | 	_ERROR_NO_MORE_ITEMS syscall.Errno = 259 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func LoadRegLoadMUIString() error { | ||||||
|  | 	return procRegLoadMUIStringW.Find() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //sys	regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW | ||||||
|  | //sys	regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW | ||||||
|  | //sys	regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW | ||||||
|  | //sys	regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW | ||||||
|  | //sys	regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW | ||||||
|  | //sys   regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW | ||||||
|  | //sys	regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW | ||||||
|  | 
 | ||||||
|  | //sys	expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW | ||||||
							
								
								
									
										387
									
								
								vendor/golang.org/x/sys/windows/registry/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										387
									
								
								vendor/golang.org/x/sys/windows/registry/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,387 @@ | |||||||
|  | // Copyright 2015 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | package registry | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"io" | ||||||
|  | 	"syscall" | ||||||
|  | 	"unicode/utf16" | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// Registry value types. | ||||||
|  | 	NONE                       = 0 | ||||||
|  | 	SZ                         = 1 | ||||||
|  | 	EXPAND_SZ                  = 2 | ||||||
|  | 	BINARY                     = 3 | ||||||
|  | 	DWORD                      = 4 | ||||||
|  | 	DWORD_BIG_ENDIAN           = 5 | ||||||
|  | 	LINK                       = 6 | ||||||
|  | 	MULTI_SZ                   = 7 | ||||||
|  | 	RESOURCE_LIST              = 8 | ||||||
|  | 	FULL_RESOURCE_DESCRIPTOR   = 9 | ||||||
|  | 	RESOURCE_REQUIREMENTS_LIST = 10 | ||||||
|  | 	QWORD                      = 11 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// ErrShortBuffer is returned when the buffer was too short for the operation. | ||||||
|  | 	ErrShortBuffer = syscall.ERROR_MORE_DATA | ||||||
|  | 
 | ||||||
|  | 	// ErrNotExist is returned when a registry key or value does not exist. | ||||||
|  | 	ErrNotExist = syscall.ERROR_FILE_NOT_FOUND | ||||||
|  | 
 | ||||||
|  | 	// ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. | ||||||
|  | 	ErrUnexpectedType = errors.New("unexpected key value type") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // GetValue retrieves the type and data for the specified value associated | ||||||
|  | // with an open key k. It fills up buffer buf and returns the retrieved | ||||||
|  | // byte count n. If buf is too small to fit the stored value it returns | ||||||
|  | // ErrShortBuffer error along with the required buffer size n. | ||||||
|  | // If no buffer is provided, it returns true and actual buffer size n. | ||||||
|  | // If no buffer is provided, GetValue returns the value's type only. | ||||||
|  | // If the value does not exist, the error returned is ErrNotExist. | ||||||
|  | // | ||||||
|  | // GetValue is a low level function. If value's type is known, use the appropriate | ||||||
|  | // Get*Value function instead. | ||||||
|  | func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { | ||||||
|  | 	pname, err := syscall.UTF16PtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, 0, err | ||||||
|  | 	} | ||||||
|  | 	var pbuf *byte | ||||||
|  | 	if len(buf) > 0 { | ||||||
|  | 		pbuf = (*byte)(unsafe.Pointer(&buf[0])) | ||||||
|  | 	} | ||||||
|  | 	l := uint32(len(buf)) | ||||||
|  | 	err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return int(l), valtype, err | ||||||
|  | 	} | ||||||
|  | 	return int(l), valtype, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (k Key) getValue(name string, buf []byte) (data []byte, valtype uint32, err error) { | ||||||
|  | 	p, err := syscall.UTF16PtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, 0, err | ||||||
|  | 	} | ||||||
|  | 	var t uint32 | ||||||
|  | 	n := uint32(len(buf)) | ||||||
|  | 	for { | ||||||
|  | 		err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) | ||||||
|  | 		if err == nil { | ||||||
|  | 			return buf[:n], t, nil | ||||||
|  | 		} | ||||||
|  | 		if err != syscall.ERROR_MORE_DATA { | ||||||
|  | 			return nil, 0, err | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(buf)) { | ||||||
|  | 			return nil, 0, err | ||||||
|  | 		} | ||||||
|  | 		buf = make([]byte, n) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetStringValue retrieves the string value for the specified | ||||||
|  | // value name associated with an open key k. It also returns the value's type. | ||||||
|  | // If value does not exist, GetStringValue returns ErrNotExist. | ||||||
|  | // If value is not SZ or EXPAND_SZ, it will return the correct value | ||||||
|  | // type and ErrUnexpectedType. | ||||||
|  | func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { | ||||||
|  | 	data, typ, err2 := k.getValue(name, make([]byte, 64)) | ||||||
|  | 	if err2 != nil { | ||||||
|  | 		return "", typ, err2 | ||||||
|  | 	} | ||||||
|  | 	switch typ { | ||||||
|  | 	case SZ, EXPAND_SZ: | ||||||
|  | 	default: | ||||||
|  | 		return "", typ, ErrUnexpectedType | ||||||
|  | 	} | ||||||
|  | 	if len(data) == 0 { | ||||||
|  | 		return "", typ, nil | ||||||
|  | 	} | ||||||
|  | 	u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] | ||||||
|  | 	return syscall.UTF16ToString(u), typ, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetMUIStringValue retrieves the localized string value for | ||||||
|  | // the specified value name associated with an open key k. | ||||||
|  | // If the value name doesn't exist or the localized string value | ||||||
|  | // can't be resolved, GetMUIStringValue returns ErrNotExist. | ||||||
|  | // GetMUIStringValue panics if the system doesn't support | ||||||
|  | // regLoadMUIString; use LoadRegLoadMUIString to check if | ||||||
|  | // regLoadMUIString is supported before calling this function. | ||||||
|  | func (k Key) GetMUIStringValue(name string) (string, error) { | ||||||
|  | 	pname, err := syscall.UTF16PtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buf := make([]uint16, 1024) | ||||||
|  | 	var buflen uint32 | ||||||
|  | 	var pdir *uint16 | ||||||
|  | 
 | ||||||
|  | 	err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) | ||||||
|  | 	if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path | ||||||
|  | 
 | ||||||
|  | 		// Try to resolve the string value using the system directory as | ||||||
|  | 		// a DLL search path; this assumes the string value is of the form | ||||||
|  | 		// @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. | ||||||
|  | 
 | ||||||
|  | 		// This approach works with tzres.dll but may have to be revised | ||||||
|  | 		// in the future to allow callers to provide custom search paths. | ||||||
|  | 
 | ||||||
|  | 		var s string | ||||||
|  | 		s, err = ExpandString("%SystemRoot%\\system32\\") | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", err | ||||||
|  | 		} | ||||||
|  | 		pdir, err = syscall.UTF16PtrFromString(s) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed | ||||||
|  | 		if buflen <= uint32(len(buf)) { | ||||||
|  | 			break // Buffer not growing, assume race; break | ||||||
|  | 		} | ||||||
|  | 		buf = make([]uint16, buflen) | ||||||
|  | 		err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return syscall.UTF16ToString(buf), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ExpandString expands environment-variable strings and replaces | ||||||
|  | // them with the values defined for the current user. | ||||||
|  | // Use ExpandString to expand EXPAND_SZ strings. | ||||||
|  | func ExpandString(value string) (string, error) { | ||||||
|  | 	if value == "" { | ||||||
|  | 		return "", nil | ||||||
|  | 	} | ||||||
|  | 	p, err := syscall.UTF16PtrFromString(value) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	r := make([]uint16, 100) | ||||||
|  | 	for { | ||||||
|  | 		n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", err | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(r)) { | ||||||
|  | 			u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] | ||||||
|  | 			return syscall.UTF16ToString(u), nil | ||||||
|  | 		} | ||||||
|  | 		r = make([]uint16, n) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetStringsValue retrieves the []string value for the specified | ||||||
|  | // value name associated with an open key k. It also returns the value's type. | ||||||
|  | // If value does not exist, GetStringsValue returns ErrNotExist. | ||||||
|  | // If value is not MULTI_SZ, it will return the correct value | ||||||
|  | // type and ErrUnexpectedType. | ||||||
|  | func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { | ||||||
|  | 	data, typ, err2 := k.getValue(name, make([]byte, 64)) | ||||||
|  | 	if err2 != nil { | ||||||
|  | 		return nil, typ, err2 | ||||||
|  | 	} | ||||||
|  | 	if typ != MULTI_SZ { | ||||||
|  | 		return nil, typ, ErrUnexpectedType | ||||||
|  | 	} | ||||||
|  | 	if len(data) == 0 { | ||||||
|  | 		return nil, typ, nil | ||||||
|  | 	} | ||||||
|  | 	p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] | ||||||
|  | 	if len(p) == 0 { | ||||||
|  | 		return nil, typ, nil | ||||||
|  | 	} | ||||||
|  | 	if p[len(p)-1] == 0 { | ||||||
|  | 		p = p[:len(p)-1] // remove terminating null | ||||||
|  | 	} | ||||||
|  | 	val = make([]string, 0, 5) | ||||||
|  | 	from := 0 | ||||||
|  | 	for i, c := range p { | ||||||
|  | 		if c == 0 { | ||||||
|  | 			val = append(val, string(utf16.Decode(p[from:i]))) | ||||||
|  | 			from = i + 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return val, typ, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetIntegerValue retrieves the integer value for the specified | ||||||
|  | // value name associated with an open key k. It also returns the value's type. | ||||||
|  | // If value does not exist, GetIntegerValue returns ErrNotExist. | ||||||
|  | // If value is not DWORD or QWORD, it will return the correct value | ||||||
|  | // type and ErrUnexpectedType. | ||||||
|  | func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { | ||||||
|  | 	data, typ, err2 := k.getValue(name, make([]byte, 8)) | ||||||
|  | 	if err2 != nil { | ||||||
|  | 		return 0, typ, err2 | ||||||
|  | 	} | ||||||
|  | 	switch typ { | ||||||
|  | 	case DWORD: | ||||||
|  | 		if len(data) != 4 { | ||||||
|  | 			return 0, typ, errors.New("DWORD value is not 4 bytes long") | ||||||
|  | 		} | ||||||
|  | 		var val32 uint32 | ||||||
|  | 		copy((*[4]byte)(unsafe.Pointer(&val32))[:], data) | ||||||
|  | 		return uint64(val32), DWORD, nil | ||||||
|  | 	case QWORD: | ||||||
|  | 		if len(data) != 8 { | ||||||
|  | 			return 0, typ, errors.New("QWORD value is not 8 bytes long") | ||||||
|  | 		} | ||||||
|  | 		copy((*[8]byte)(unsafe.Pointer(&val))[:], data) | ||||||
|  | 		return val, QWORD, nil | ||||||
|  | 	default: | ||||||
|  | 		return 0, typ, ErrUnexpectedType | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetBinaryValue retrieves the binary value for the specified | ||||||
|  | // value name associated with an open key k. It also returns the value's type. | ||||||
|  | // If value does not exist, GetBinaryValue returns ErrNotExist. | ||||||
|  | // If value is not BINARY, it will return the correct value | ||||||
|  | // type and ErrUnexpectedType. | ||||||
|  | func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { | ||||||
|  | 	data, typ, err2 := k.getValue(name, make([]byte, 64)) | ||||||
|  | 	if err2 != nil { | ||||||
|  | 		return nil, typ, err2 | ||||||
|  | 	} | ||||||
|  | 	if typ != BINARY { | ||||||
|  | 		return nil, typ, ErrUnexpectedType | ||||||
|  | 	} | ||||||
|  | 	return data, typ, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (k Key) setValue(name string, valtype uint32, data []byte) error { | ||||||
|  | 	p, err := syscall.UTF16PtrFromString(name) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if len(data) == 0 { | ||||||
|  | 		return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) | ||||||
|  | 	} | ||||||
|  | 	return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetDWordValue sets the data and type of a name value | ||||||
|  | // under key k to value and DWORD. | ||||||
|  | func (k Key) SetDWordValue(name string, value uint32) error { | ||||||
|  | 	return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetQWordValue sets the data and type of a name value | ||||||
|  | // under key k to value and QWORD. | ||||||
|  | func (k Key) SetQWordValue(name string, value uint64) error { | ||||||
|  | 	return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (k Key) setStringValue(name string, valtype uint32, value string) error { | ||||||
|  | 	v, err := syscall.UTF16FromString(value) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] | ||||||
|  | 	return k.setValue(name, valtype, buf) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetStringValue sets the data and type of a name value | ||||||
|  | // under key k to value and SZ. The value must not contain a zero byte. | ||||||
|  | func (k Key) SetStringValue(name, value string) error { | ||||||
|  | 	return k.setStringValue(name, SZ, value) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetExpandStringValue sets the data and type of a name value | ||||||
|  | // under key k to value and EXPAND_SZ. The value must not contain a zero byte. | ||||||
|  | func (k Key) SetExpandStringValue(name, value string) error { | ||||||
|  | 	return k.setStringValue(name, EXPAND_SZ, value) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetStringsValue sets the data and type of a name value | ||||||
|  | // under key k to value and MULTI_SZ. The value strings | ||||||
|  | // must not contain a zero byte. | ||||||
|  | func (k Key) SetStringsValue(name string, value []string) error { | ||||||
|  | 	ss := "" | ||||||
|  | 	for _, s := range value { | ||||||
|  | 		for i := 0; i < len(s); i++ { | ||||||
|  | 			if s[i] == 0 { | ||||||
|  | 				return errors.New("string cannot have 0 inside") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		ss += s + "\x00" | ||||||
|  | 	} | ||||||
|  | 	v := utf16.Encode([]rune(ss + "\x00")) | ||||||
|  | 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] | ||||||
|  | 	return k.setValue(name, MULTI_SZ, buf) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetBinaryValue sets the data and type of a name value | ||||||
|  | // under key k to value and BINARY. | ||||||
|  | func (k Key) SetBinaryValue(name string, value []byte) error { | ||||||
|  | 	return k.setValue(name, BINARY, value) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteValue removes a named value from the key k. | ||||||
|  | func (k Key) DeleteValue(name string) error { | ||||||
|  | 	return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadValueNames returns the value names of key k. | ||||||
|  | // The parameter n controls the number of returned names, | ||||||
|  | // analogous to the way os.File.Readdirnames works. | ||||||
|  | func (k Key) ReadValueNames(n int) ([]string, error) { | ||||||
|  | 	ki, err := k.Stat() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	names := make([]string, 0, ki.ValueCount) | ||||||
|  | 	buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character | ||||||
|  | loopItems: | ||||||
|  | 	for i := uint32(0); ; i++ { | ||||||
|  | 		if n > 0 { | ||||||
|  | 			if len(names) == n { | ||||||
|  | 				return names, nil | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		l := uint32(len(buf)) | ||||||
|  | 		for { | ||||||
|  | 			err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) | ||||||
|  | 			if err == nil { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 			if err == syscall.ERROR_MORE_DATA { | ||||||
|  | 				// Double buffer size and try again. | ||||||
|  | 				l = uint32(2 * len(buf)) | ||||||
|  | 				buf = make([]uint16, l) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			if err == _ERROR_NO_MORE_ITEMS { | ||||||
|  | 				break loopItems | ||||||
|  | 			} | ||||||
|  | 			return names, err | ||||||
|  | 		} | ||||||
|  | 		names = append(names, syscall.UTF16ToString(buf[:l])) | ||||||
|  | 	} | ||||||
|  | 	if n > len(names) { | ||||||
|  | 		return names, io.EOF | ||||||
|  | 	} | ||||||
|  | 	return names, nil | ||||||
|  | } | ||||||
							
								
								
									
										120
									
								
								vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | |||||||
|  | // Code generated by 'go generate'; DO NOT EDIT. | ||||||
|  | 
 | ||||||
|  | package registry | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | 	"unsafe" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/sys/windows" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var _ unsafe.Pointer | ||||||
|  | 
 | ||||||
|  | // Do the interface allocations only once for common | ||||||
|  | // Errno values. | ||||||
|  | const ( | ||||||
|  | 	errnoERROR_IO_PENDING = 997 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // errnoErr returns common boxed Errno values, to prevent | ||||||
|  | // allocations at runtime. | ||||||
|  | func errnoErr(e syscall.Errno) error { | ||||||
|  | 	switch e { | ||||||
|  | 	case 0: | ||||||
|  | 		return nil | ||||||
|  | 	case errnoERROR_IO_PENDING: | ||||||
|  | 		return errERROR_IO_PENDING | ||||||
|  | 	} | ||||||
|  | 	// TODO: add more here, after collecting data on the common | ||||||
|  | 	// error values see on Windows. (perhaps when running | ||||||
|  | 	// all.bat?) | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") | ||||||
|  | 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | ||||||
|  | 
 | ||||||
|  | 	procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW") | ||||||
|  | 	procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW") | ||||||
|  | 	procRegSetValueExW            = modadvapi32.NewProc("RegSetValueExW") | ||||||
|  | 	procRegEnumValueW             = modadvapi32.NewProc("RegEnumValueW") | ||||||
|  | 	procRegDeleteValueW           = modadvapi32.NewProc("RegDeleteValueW") | ||||||
|  | 	procRegLoadMUIStringW         = modadvapi32.NewProc("RegLoadMUIStringW") | ||||||
|  | 	procRegConnectRegistryW       = modadvapi32.NewProc("RegConnectRegistryW") | ||||||
|  | 	procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | 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))) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		regerrno = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { | ||||||
|  | 	r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		regerrno = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { | ||||||
|  | 	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 { | ||||||
|  | 		regerrno = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { | ||||||
|  | 	r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		regerrno = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	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) { | ||||||
|  | 	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 { | ||||||
|  | 		regerrno = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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 expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { | ||||||
|  | 	r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) | ||||||
|  | 	n = uint32(r0) | ||||||
|  | 	if n == 0 { | ||||||
|  | 		if e1 != 0 { | ||||||
|  | 			err = errnoErr(e1) | ||||||
|  | 		} else { | ||||||
|  | 			err = syscall.EINVAL | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										854
									
								
								vendor/golang.org/x/sys/windows/security_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										854
									
								
								vendor/golang.org/x/sys/windows/security_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,854 @@ | |||||||
|  | // Copyright 2012 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | 	"unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	STANDARD_RIGHTS_REQUIRED = 0xf0000 | ||||||
|  | 	STANDARD_RIGHTS_READ     = 0x20000 | ||||||
|  | 	STANDARD_RIGHTS_WRITE    = 0x20000 | ||||||
|  | 	STANDARD_RIGHTS_EXECUTE  = 0x20000 | ||||||
|  | 	STANDARD_RIGHTS_ALL      = 0x1F0000 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	NameUnknown          = 0 | ||||||
|  | 	NameFullyQualifiedDN = 1 | ||||||
|  | 	NameSamCompatible    = 2 | ||||||
|  | 	NameDisplay          = 3 | ||||||
|  | 	NameUniqueId         = 6 | ||||||
|  | 	NameCanonical        = 7 | ||||||
|  | 	NameUserPrincipal    = 8 | ||||||
|  | 	NameCanonicalEx      = 9 | ||||||
|  | 	NameServicePrincipal = 10 | ||||||
|  | 	NameDnsDomain        = 12 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. | ||||||
|  | // http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx | ||||||
|  | //sys	TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW | ||||||
|  | //sys	GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW | ||||||
|  | 
 | ||||||
|  | // TranslateAccountName converts a directory service | ||||||
|  | // object name from one format to another. | ||||||
|  | func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) { | ||||||
|  | 	u, e := UTF16PtrFromString(username) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return "", e | ||||||
|  | 	} | ||||||
|  | 	n := uint32(50) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]uint16, n) | ||||||
|  | 		e = TranslateName(u, from, to, &b[0], &n) | ||||||
|  | 		if e == nil { | ||||||
|  | 			return UTF16ToString(b[:n]), nil | ||||||
|  | 		} | ||||||
|  | 		if e != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			return "", e | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(b)) { | ||||||
|  | 			return "", e | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// do not reorder | ||||||
|  | 	NetSetupUnknownStatus = iota | ||||||
|  | 	NetSetupUnjoined | ||||||
|  | 	NetSetupWorkgroupName | ||||||
|  | 	NetSetupDomainName | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type UserInfo10 struct { | ||||||
|  | 	Name       *uint16 | ||||||
|  | 	Comment    *uint16 | ||||||
|  | 	UsrComment *uint16 | ||||||
|  | 	FullName   *uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //sys	NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo | ||||||
|  | //sys	NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation | ||||||
|  | //sys	NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// do not reorder | ||||||
|  | 	SidTypeUser = 1 + iota | ||||||
|  | 	SidTypeGroup | ||||||
|  | 	SidTypeDomain | ||||||
|  | 	SidTypeAlias | ||||||
|  | 	SidTypeWellKnownGroup | ||||||
|  | 	SidTypeDeletedAccount | ||||||
|  | 	SidTypeInvalid | ||||||
|  | 	SidTypeUnknown | ||||||
|  | 	SidTypeComputer | ||||||
|  | 	SidTypeLabel | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SidIdentifierAuthority struct { | ||||||
|  | 	Value [6]byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	SECURITY_NULL_SID_AUTHORITY        = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}} | ||||||
|  | 	SECURITY_WORLD_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}} | ||||||
|  | 	SECURITY_LOCAL_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}} | ||||||
|  | 	SECURITY_CREATOR_SID_AUTHORITY     = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}} | ||||||
|  | 	SECURITY_NON_UNIQUE_AUTHORITY      = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}} | ||||||
|  | 	SECURITY_NT_AUTHORITY              = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}} | ||||||
|  | 	SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	SECURITY_NULL_RID                   = 0 | ||||||
|  | 	SECURITY_WORLD_RID                  = 0 | ||||||
|  | 	SECURITY_LOCAL_RID                  = 0 | ||||||
|  | 	SECURITY_CREATOR_OWNER_RID          = 0 | ||||||
|  | 	SECURITY_CREATOR_GROUP_RID          = 1 | ||||||
|  | 	SECURITY_DIALUP_RID                 = 1 | ||||||
|  | 	SECURITY_NETWORK_RID                = 2 | ||||||
|  | 	SECURITY_BATCH_RID                  = 3 | ||||||
|  | 	SECURITY_INTERACTIVE_RID            = 4 | ||||||
|  | 	SECURITY_LOGON_IDS_RID              = 5 | ||||||
|  | 	SECURITY_SERVICE_RID                = 6 | ||||||
|  | 	SECURITY_LOCAL_SYSTEM_RID           = 18 | ||||||
|  | 	SECURITY_BUILTIN_DOMAIN_RID         = 32 | ||||||
|  | 	SECURITY_PRINCIPAL_SELF_RID         = 10 | ||||||
|  | 	SECURITY_CREATOR_OWNER_SERVER_RID   = 0x2 | ||||||
|  | 	SECURITY_CREATOR_GROUP_SERVER_RID   = 0x3 | ||||||
|  | 	SECURITY_LOGON_IDS_RID_COUNT        = 0x3 | ||||||
|  | 	SECURITY_ANONYMOUS_LOGON_RID        = 0x7 | ||||||
|  | 	SECURITY_PROXY_RID                  = 0x8 | ||||||
|  | 	SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9 | ||||||
|  | 	SECURITY_SERVER_LOGON_RID           = SECURITY_ENTERPRISE_CONTROLLERS_RID | ||||||
|  | 	SECURITY_AUTHENTICATED_USER_RID     = 0xb | ||||||
|  | 	SECURITY_RESTRICTED_CODE_RID        = 0xc | ||||||
|  | 	SECURITY_NT_NON_UNIQUE_RID          = 0x15 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Predefined domain-relative RIDs for local groups. | ||||||
|  | // See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379649(v=vs.85).aspx | ||||||
|  | const ( | ||||||
|  | 	DOMAIN_ALIAS_RID_ADMINS                         = 0x220 | ||||||
|  | 	DOMAIN_ALIAS_RID_USERS                          = 0x221 | ||||||
|  | 	DOMAIN_ALIAS_RID_GUESTS                         = 0x222 | ||||||
|  | 	DOMAIN_ALIAS_RID_POWER_USERS                    = 0x223 | ||||||
|  | 	DOMAIN_ALIAS_RID_ACCOUNT_OPS                    = 0x224 | ||||||
|  | 	DOMAIN_ALIAS_RID_SYSTEM_OPS                     = 0x225 | ||||||
|  | 	DOMAIN_ALIAS_RID_PRINT_OPS                      = 0x226 | ||||||
|  | 	DOMAIN_ALIAS_RID_BACKUP_OPS                     = 0x227 | ||||||
|  | 	DOMAIN_ALIAS_RID_REPLICATOR                     = 0x228 | ||||||
|  | 	DOMAIN_ALIAS_RID_RAS_SERVERS                    = 0x229 | ||||||
|  | 	DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               = 0x22a | ||||||
|  | 	DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           = 0x22b | ||||||
|  | 	DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      = 0x22c | ||||||
|  | 	DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 0x22d | ||||||
|  | 	DOMAIN_ALIAS_RID_MONITORING_USERS               = 0x22e | ||||||
|  | 	DOMAIN_ALIAS_RID_LOGGING_USERS                  = 0x22f | ||||||
|  | 	DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            = 0x230 | ||||||
|  | 	DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             = 0x231 | ||||||
|  | 	DOMAIN_ALIAS_RID_DCOM_USERS                     = 0x232 | ||||||
|  | 	DOMAIN_ALIAS_RID_IUSERS                         = 0x238 | ||||||
|  | 	DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               = 0x239 | ||||||
|  | 	DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     = 0x23b | ||||||
|  | 	DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP = 0x23c | ||||||
|  | 	DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        = 0x23d | ||||||
|  | 	DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP      = 0x23e | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | //sys	LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW | ||||||
|  | //sys	LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW | ||||||
|  | //sys	ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW | ||||||
|  | //sys	ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW | ||||||
|  | //sys	GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid | ||||||
|  | //sys	CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid | ||||||
|  | //sys	AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid | ||||||
|  | //sys	createWellKnownSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID, sid *SID, sizeSid *uint32) (err error) = advapi32.CreateWellKnownSid | ||||||
|  | //sys	isWellKnownSid(sid *SID, sidType WELL_KNOWN_SID_TYPE) (isWellKnown bool) = advapi32.IsWellKnownSid | ||||||
|  | //sys	FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid | ||||||
|  | //sys	EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid | ||||||
|  | //sys	getSidIdentifierAuthority(sid *SID) (authority *SidIdentifierAuthority) = advapi32.GetSidIdentifierAuthority | ||||||
|  | //sys	getSidSubAuthorityCount(sid *SID) (count *uint8) = advapi32.GetSidSubAuthorityCount | ||||||
|  | //sys	getSidSubAuthority(sid *SID, index uint32) (subAuthority *uint32) = advapi32.GetSidSubAuthority | ||||||
|  | //sys	isValidSid(sid *SID) (isValid bool) = advapi32.IsValidSid | ||||||
|  | 
 | ||||||
|  | // The security identifier (SID) structure is a variable-length | ||||||
|  | // structure used to uniquely identify users or groups. | ||||||
|  | type SID struct{} | ||||||
|  | 
 | ||||||
|  | // StringToSid converts a string-format security identifier | ||||||
|  | // SID into a valid, functional SID. | ||||||
|  | func StringToSid(s string) (*SID, error) { | ||||||
|  | 	var sid *SID | ||||||
|  | 	p, e := UTF16PtrFromString(s) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, e | ||||||
|  | 	} | ||||||
|  | 	e = ConvertStringSidToSid(p, &sid) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, e | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree((Handle)(unsafe.Pointer(sid))) | ||||||
|  | 	return sid.Copy() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // LookupSID retrieves a security identifier SID for the account | ||||||
|  | // and the name of the domain on which the account was found. | ||||||
|  | // System specify target computer to search. | ||||||
|  | func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { | ||||||
|  | 	if len(account) == 0 { | ||||||
|  | 		return nil, "", 0, syscall.EINVAL | ||||||
|  | 	} | ||||||
|  | 	acc, e := UTF16PtrFromString(account) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, "", 0, e | ||||||
|  | 	} | ||||||
|  | 	var sys *uint16 | ||||||
|  | 	if len(system) > 0 { | ||||||
|  | 		sys, e = UTF16PtrFromString(system) | ||||||
|  | 		if e != nil { | ||||||
|  | 			return nil, "", 0, e | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	n := uint32(50) | ||||||
|  | 	dn := uint32(50) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]byte, n) | ||||||
|  | 		db := make([]uint16, dn) | ||||||
|  | 		sid = (*SID)(unsafe.Pointer(&b[0])) | ||||||
|  | 		e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType) | ||||||
|  | 		if e == nil { | ||||||
|  | 			return sid, UTF16ToString(db), accType, nil | ||||||
|  | 		} | ||||||
|  | 		if e != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			return nil, "", 0, e | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(b)) { | ||||||
|  | 			return nil, "", 0, e | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // String converts SID to a string format | ||||||
|  | // suitable for display, storage, or transmission. | ||||||
|  | func (sid *SID) String() (string, error) { | ||||||
|  | 	var s *uint16 | ||||||
|  | 	e := ConvertSidToStringSid(sid, &s) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return "", e | ||||||
|  | 	} | ||||||
|  | 	defer LocalFree((Handle)(unsafe.Pointer(s))) | ||||||
|  | 	return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Len returns the length, in bytes, of a valid security identifier SID. | ||||||
|  | func (sid *SID) Len() int { | ||||||
|  | 	return int(GetLengthSid(sid)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Copy creates a duplicate of security identifier SID. | ||||||
|  | func (sid *SID) Copy() (*SID, error) { | ||||||
|  | 	b := make([]byte, sid.Len()) | ||||||
|  | 	sid2 := (*SID)(unsafe.Pointer(&b[0])) | ||||||
|  | 	e := CopySid(uint32(len(b)), sid2, sid) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, e | ||||||
|  | 	} | ||||||
|  | 	return sid2, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IdentifierAuthority returns the identifier authority of the SID. | ||||||
|  | func (sid *SID) IdentifierAuthority() SidIdentifierAuthority { | ||||||
|  | 	return *getSidIdentifierAuthority(sid) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SubAuthorityCount returns the number of sub-authorities in the SID. | ||||||
|  | func (sid *SID) SubAuthorityCount() uint8 { | ||||||
|  | 	return *getSidSubAuthorityCount(sid) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SubAuthority returns the sub-authority of the SID as specified by | ||||||
|  | // the index, which must be less than sid.SubAuthorityCount(). | ||||||
|  | func (sid *SID) SubAuthority(idx uint32) uint32 { | ||||||
|  | 	if idx >= uint32(sid.SubAuthorityCount()) { | ||||||
|  | 		panic("sub-authority index out of range") | ||||||
|  | 	} | ||||||
|  | 	return *getSidSubAuthority(sid, idx) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsValid returns whether the SID has a valid revision and length. | ||||||
|  | func (sid *SID) IsValid() bool { | ||||||
|  | 	return isValidSid(sid) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Equals compares two SIDs for equality. | ||||||
|  | func (sid *SID) Equals(sid2 *SID) bool { | ||||||
|  | 	return EqualSid(sid, sid2) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsWellKnown determines whether the SID matches the well-known sidType. | ||||||
|  | func (sid *SID) IsWellKnown(sidType WELL_KNOWN_SID_TYPE) bool { | ||||||
|  | 	return isWellKnownSid(sid, sidType) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // LookupAccount retrieves the name of the account for this SID | ||||||
|  | // and the name of the first domain on which this SID is found. | ||||||
|  | // System specify target computer to search for. | ||||||
|  | func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { | ||||||
|  | 	var sys *uint16 | ||||||
|  | 	if len(system) > 0 { | ||||||
|  | 		sys, err = UTF16PtrFromString(system) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", "", 0, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	n := uint32(50) | ||||||
|  | 	dn := uint32(50) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]uint16, n) | ||||||
|  | 		db := make([]uint16, dn) | ||||||
|  | 		e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType) | ||||||
|  | 		if e == nil { | ||||||
|  | 			return UTF16ToString(b), UTF16ToString(db), accType, nil | ||||||
|  | 		} | ||||||
|  | 		if e != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			return "", "", 0, e | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(b)) { | ||||||
|  | 			return "", "", 0, e | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Various types of pre-specified SIDs that can be synthesized and compared at runtime. | ||||||
|  | type WELL_KNOWN_SID_TYPE uint32 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	WinNullSid                                    = 0 | ||||||
|  | 	WinWorldSid                                   = 1 | ||||||
|  | 	WinLocalSid                                   = 2 | ||||||
|  | 	WinCreatorOwnerSid                            = 3 | ||||||
|  | 	WinCreatorGroupSid                            = 4 | ||||||
|  | 	WinCreatorOwnerServerSid                      = 5 | ||||||
|  | 	WinCreatorGroupServerSid                      = 6 | ||||||
|  | 	WinNtAuthoritySid                             = 7 | ||||||
|  | 	WinDialupSid                                  = 8 | ||||||
|  | 	WinNetworkSid                                 = 9 | ||||||
|  | 	WinBatchSid                                   = 10 | ||||||
|  | 	WinInteractiveSid                             = 11 | ||||||
|  | 	WinServiceSid                                 = 12 | ||||||
|  | 	WinAnonymousSid                               = 13 | ||||||
|  | 	WinProxySid                                   = 14 | ||||||
|  | 	WinEnterpriseControllersSid                   = 15 | ||||||
|  | 	WinSelfSid                                    = 16 | ||||||
|  | 	WinAuthenticatedUserSid                       = 17 | ||||||
|  | 	WinRestrictedCodeSid                          = 18 | ||||||
|  | 	WinTerminalServerSid                          = 19 | ||||||
|  | 	WinRemoteLogonIdSid                           = 20 | ||||||
|  | 	WinLogonIdsSid                                = 21 | ||||||
|  | 	WinLocalSystemSid                             = 22 | ||||||
|  | 	WinLocalServiceSid                            = 23 | ||||||
|  | 	WinNetworkServiceSid                          = 24 | ||||||
|  | 	WinBuiltinDomainSid                           = 25 | ||||||
|  | 	WinBuiltinAdministratorsSid                   = 26 | ||||||
|  | 	WinBuiltinUsersSid                            = 27 | ||||||
|  | 	WinBuiltinGuestsSid                           = 28 | ||||||
|  | 	WinBuiltinPowerUsersSid                       = 29 | ||||||
|  | 	WinBuiltinAccountOperatorsSid                 = 30 | ||||||
|  | 	WinBuiltinSystemOperatorsSid                  = 31 | ||||||
|  | 	WinBuiltinPrintOperatorsSid                   = 32 | ||||||
|  | 	WinBuiltinBackupOperatorsSid                  = 33 | ||||||
|  | 	WinBuiltinReplicatorSid                       = 34 | ||||||
|  | 	WinBuiltinPreWindows2000CompatibleAccessSid   = 35 | ||||||
|  | 	WinBuiltinRemoteDesktopUsersSid               = 36 | ||||||
|  | 	WinBuiltinNetworkConfigurationOperatorsSid    = 37 | ||||||
|  | 	WinAccountAdministratorSid                    = 38 | ||||||
|  | 	WinAccountGuestSid                            = 39 | ||||||
|  | 	WinAccountKrbtgtSid                           = 40 | ||||||
|  | 	WinAccountDomainAdminsSid                     = 41 | ||||||
|  | 	WinAccountDomainUsersSid                      = 42 | ||||||
|  | 	WinAccountDomainGuestsSid                     = 43 | ||||||
|  | 	WinAccountComputersSid                        = 44 | ||||||
|  | 	WinAccountControllersSid                      = 45 | ||||||
|  | 	WinAccountCertAdminsSid                       = 46 | ||||||
|  | 	WinAccountSchemaAdminsSid                     = 47 | ||||||
|  | 	WinAccountEnterpriseAdminsSid                 = 48 | ||||||
|  | 	WinAccountPolicyAdminsSid                     = 49 | ||||||
|  | 	WinAccountRasAndIasServersSid                 = 50 | ||||||
|  | 	WinNTLMAuthenticationSid                      = 51 | ||||||
|  | 	WinDigestAuthenticationSid                    = 52 | ||||||
|  | 	WinSChannelAuthenticationSid                  = 53 | ||||||
|  | 	WinThisOrganizationSid                        = 54 | ||||||
|  | 	WinOtherOrganizationSid                       = 55 | ||||||
|  | 	WinBuiltinIncomingForestTrustBuildersSid      = 56 | ||||||
|  | 	WinBuiltinPerfMonitoringUsersSid              = 57 | ||||||
|  | 	WinBuiltinPerfLoggingUsersSid                 = 58 | ||||||
|  | 	WinBuiltinAuthorizationAccessSid              = 59 | ||||||
|  | 	WinBuiltinTerminalServerLicenseServersSid     = 60 | ||||||
|  | 	WinBuiltinDCOMUsersSid                        = 61 | ||||||
|  | 	WinBuiltinIUsersSid                           = 62 | ||||||
|  | 	WinIUserSid                                   = 63 | ||||||
|  | 	WinBuiltinCryptoOperatorsSid                  = 64 | ||||||
|  | 	WinUntrustedLabelSid                          = 65 | ||||||
|  | 	WinLowLabelSid                                = 66 | ||||||
|  | 	WinMediumLabelSid                             = 67 | ||||||
|  | 	WinHighLabelSid                               = 68 | ||||||
|  | 	WinSystemLabelSid                             = 69 | ||||||
|  | 	WinWriteRestrictedCodeSid                     = 70 | ||||||
|  | 	WinCreatorOwnerRightsSid                      = 71 | ||||||
|  | 	WinCacheablePrincipalsGroupSid                = 72 | ||||||
|  | 	WinNonCacheablePrincipalsGroupSid             = 73 | ||||||
|  | 	WinEnterpriseReadonlyControllersSid           = 74 | ||||||
|  | 	WinAccountReadonlyControllersSid              = 75 | ||||||
|  | 	WinBuiltinEventLogReadersGroup                = 76 | ||||||
|  | 	WinNewEnterpriseReadonlyControllersSid        = 77 | ||||||
|  | 	WinBuiltinCertSvcDComAccessGroup              = 78 | ||||||
|  | 	WinMediumPlusLabelSid                         = 79 | ||||||
|  | 	WinLocalLogonSid                              = 80 | ||||||
|  | 	WinConsoleLogonSid                            = 81 | ||||||
|  | 	WinThisOrganizationCertificateSid             = 82 | ||||||
|  | 	WinApplicationPackageAuthoritySid             = 83 | ||||||
|  | 	WinBuiltinAnyPackageSid                       = 84 | ||||||
|  | 	WinCapabilityInternetClientSid                = 85 | ||||||
|  | 	WinCapabilityInternetClientServerSid          = 86 | ||||||
|  | 	WinCapabilityPrivateNetworkClientServerSid    = 87 | ||||||
|  | 	WinCapabilityPicturesLibrarySid               = 88 | ||||||
|  | 	WinCapabilityVideosLibrarySid                 = 89 | ||||||
|  | 	WinCapabilityMusicLibrarySid                  = 90 | ||||||
|  | 	WinCapabilityDocumentsLibrarySid              = 91 | ||||||
|  | 	WinCapabilitySharedUserCertificatesSid        = 92 | ||||||
|  | 	WinCapabilityEnterpriseAuthenticationSid      = 93 | ||||||
|  | 	WinCapabilityRemovableStorageSid              = 94 | ||||||
|  | 	WinBuiltinRDSRemoteAccessServersSid           = 95 | ||||||
|  | 	WinBuiltinRDSEndpointServersSid               = 96 | ||||||
|  | 	WinBuiltinRDSManagementServersSid             = 97 | ||||||
|  | 	WinUserModeDriversSid                         = 98 | ||||||
|  | 	WinBuiltinHyperVAdminsSid                     = 99 | ||||||
|  | 	WinAccountCloneableControllersSid             = 100 | ||||||
|  | 	WinBuiltinAccessControlAssistanceOperatorsSid = 101 | ||||||
|  | 	WinBuiltinRemoteManagementUsersSid            = 102 | ||||||
|  | 	WinAuthenticationAuthorityAssertedSid         = 103 | ||||||
|  | 	WinAuthenticationServiceAssertedSid           = 104 | ||||||
|  | 	WinLocalAccountSid                            = 105 | ||||||
|  | 	WinLocalAccountAndAdministratorSid            = 106 | ||||||
|  | 	WinAccountProtectedUsersSid                   = 107 | ||||||
|  | 	WinCapabilityAppointmentsSid                  = 108 | ||||||
|  | 	WinCapabilityContactsSid                      = 109 | ||||||
|  | 	WinAccountDefaultSystemManagedSid             = 110 | ||||||
|  | 	WinBuiltinDefaultSystemManagedGroupSid        = 111 | ||||||
|  | 	WinBuiltinStorageReplicaAdminsSid             = 112 | ||||||
|  | 	WinAccountKeyAdminsSid                        = 113 | ||||||
|  | 	WinAccountEnterpriseKeyAdminsSid              = 114 | ||||||
|  | 	WinAuthenticationKeyTrustSid                  = 115 | ||||||
|  | 	WinAuthenticationKeyPropertyMFASid            = 116 | ||||||
|  | 	WinAuthenticationKeyPropertyAttestationSid    = 117 | ||||||
|  | 	WinAuthenticationFreshKeyAuthSid              = 118 | ||||||
|  | 	WinBuiltinDeviceOwnersSid                     = 119 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Creates a SID for a well-known predefined alias, generally using the constants of the form | ||||||
|  | // Win*Sid, for the local machine. | ||||||
|  | func CreateWellKnownSid(sidType WELL_KNOWN_SID_TYPE) (*SID, error) { | ||||||
|  | 	return CreateWellKnownDomainSid(sidType, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Creates a SID for a well-known predefined alias, generally using the constants of the form | ||||||
|  | // Win*Sid, for the domain specified by the domainSid parameter. | ||||||
|  | func CreateWellKnownDomainSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID) (*SID, error) { | ||||||
|  | 	n := uint32(50) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]byte, n) | ||||||
|  | 		sid := (*SID)(unsafe.Pointer(&b[0])) | ||||||
|  | 		err := createWellKnownSid(sidType, domainSid, sid, &n) | ||||||
|  | 		if err == nil { | ||||||
|  | 			return sid, nil | ||||||
|  | 		} | ||||||
|  | 		if err != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(b)) { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// do not reorder | ||||||
|  | 	TOKEN_ASSIGN_PRIMARY = 1 << iota | ||||||
|  | 	TOKEN_DUPLICATE | ||||||
|  | 	TOKEN_IMPERSONATE | ||||||
|  | 	TOKEN_QUERY | ||||||
|  | 	TOKEN_QUERY_SOURCE | ||||||
|  | 	TOKEN_ADJUST_PRIVILEGES | ||||||
|  | 	TOKEN_ADJUST_GROUPS | ||||||
|  | 	TOKEN_ADJUST_DEFAULT | ||||||
|  | 	TOKEN_ADJUST_SESSIONID | ||||||
|  | 
 | ||||||
|  | 	TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | | ||||||
|  | 		TOKEN_ASSIGN_PRIMARY | | ||||||
|  | 		TOKEN_DUPLICATE | | ||||||
|  | 		TOKEN_IMPERSONATE | | ||||||
|  | 		TOKEN_QUERY | | ||||||
|  | 		TOKEN_QUERY_SOURCE | | ||||||
|  | 		TOKEN_ADJUST_PRIVILEGES | | ||||||
|  | 		TOKEN_ADJUST_GROUPS | | ||||||
|  | 		TOKEN_ADJUST_DEFAULT | | ||||||
|  | 		TOKEN_ADJUST_SESSIONID | ||||||
|  | 	TOKEN_READ  = STANDARD_RIGHTS_READ | TOKEN_QUERY | ||||||
|  | 	TOKEN_WRITE = STANDARD_RIGHTS_WRITE | | ||||||
|  | 		TOKEN_ADJUST_PRIVILEGES | | ||||||
|  | 		TOKEN_ADJUST_GROUPS | | ||||||
|  | 		TOKEN_ADJUST_DEFAULT | ||||||
|  | 	TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// do not reorder | ||||||
|  | 	TokenUser = 1 + iota | ||||||
|  | 	TokenGroups | ||||||
|  | 	TokenPrivileges | ||||||
|  | 	TokenOwner | ||||||
|  | 	TokenPrimaryGroup | ||||||
|  | 	TokenDefaultDacl | ||||||
|  | 	TokenSource | ||||||
|  | 	TokenType | ||||||
|  | 	TokenImpersonationLevel | ||||||
|  | 	TokenStatistics | ||||||
|  | 	TokenRestrictedSids | ||||||
|  | 	TokenSessionId | ||||||
|  | 	TokenGroupsAndPrivileges | ||||||
|  | 	TokenSessionReference | ||||||
|  | 	TokenSandBoxInert | ||||||
|  | 	TokenAuditPolicy | ||||||
|  | 	TokenOrigin | ||||||
|  | 	TokenElevationType | ||||||
|  | 	TokenLinkedToken | ||||||
|  | 	TokenElevation | ||||||
|  | 	TokenHasRestrictions | ||||||
|  | 	TokenAccessInformation | ||||||
|  | 	TokenVirtualizationAllowed | ||||||
|  | 	TokenVirtualizationEnabled | ||||||
|  | 	TokenIntegrityLevel | ||||||
|  | 	TokenUIAccess | ||||||
|  | 	TokenMandatoryPolicy | ||||||
|  | 	TokenLogonSid | ||||||
|  | 	MaxTokenInfoClass | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Group attributes inside of Tokengroups.Groups[i].Attributes | ||||||
|  | const ( | ||||||
|  | 	SE_GROUP_MANDATORY          = 0x00000001 | ||||||
|  | 	SE_GROUP_ENABLED_BY_DEFAULT = 0x00000002 | ||||||
|  | 	SE_GROUP_ENABLED            = 0x00000004 | ||||||
|  | 	SE_GROUP_OWNER              = 0x00000008 | ||||||
|  | 	SE_GROUP_USE_FOR_DENY_ONLY  = 0x00000010 | ||||||
|  | 	SE_GROUP_INTEGRITY          = 0x00000020 | ||||||
|  | 	SE_GROUP_INTEGRITY_ENABLED  = 0x00000040 | ||||||
|  | 	SE_GROUP_LOGON_ID           = 0xC0000000 | ||||||
|  | 	SE_GROUP_RESOURCE           = 0x20000000 | ||||||
|  | 	SE_GROUP_VALID_ATTRIBUTES   = SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_USE_FOR_DENY_ONLY | SE_GROUP_LOGON_ID | SE_GROUP_RESOURCE | SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Privilege attributes | ||||||
|  | const ( | ||||||
|  | 	SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001 | ||||||
|  | 	SE_PRIVILEGE_ENABLED            = 0x00000002 | ||||||
|  | 	SE_PRIVILEGE_REMOVED            = 0x00000004 | ||||||
|  | 	SE_PRIVILEGE_USED_FOR_ACCESS    = 0x80000000 | ||||||
|  | 	SE_PRIVILEGE_VALID_ATTRIBUTES   = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_REMOVED | SE_PRIVILEGE_USED_FOR_ACCESS | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Token types | ||||||
|  | const ( | ||||||
|  | 	TokenPrimary       = 1 | ||||||
|  | 	TokenImpersonation = 2 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Impersonation levels | ||||||
|  | const ( | ||||||
|  | 	SecurityAnonymous      = 0 | ||||||
|  | 	SecurityIdentification = 1 | ||||||
|  | 	SecurityImpersonation  = 2 | ||||||
|  | 	SecurityDelegation     = 3 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type LUID struct { | ||||||
|  | 	LowPart  uint32 | ||||||
|  | 	HighPart int32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type LUIDAndAttributes struct { | ||||||
|  | 	Luid       LUID | ||||||
|  | 	Attributes uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SIDAndAttributes struct { | ||||||
|  | 	Sid        *SID | ||||||
|  | 	Attributes uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Tokenuser struct { | ||||||
|  | 	User SIDAndAttributes | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Tokenprimarygroup struct { | ||||||
|  | 	PrimaryGroup *SID | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Tokengroups struct { | ||||||
|  | 	GroupCount uint32 | ||||||
|  | 	Groups     [1]SIDAndAttributes // Use AllGroups() for iterating. | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllGroups returns a slice that can be used to iterate over the groups in g. | ||||||
|  | func (g *Tokengroups) AllGroups() []SIDAndAttributes { | ||||||
|  | 	return (*[(1 << 28) - 1]SIDAndAttributes)(unsafe.Pointer(&g.Groups[0]))[:g.GroupCount:g.GroupCount] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Tokenprivileges struct { | ||||||
|  | 	PrivilegeCount uint32 | ||||||
|  | 	Privileges     [1]LUIDAndAttributes // Use AllPrivileges() for iterating. | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllPrivileges returns a slice that can be used to iterate over the privileges in p. | ||||||
|  | func (p *Tokenprivileges) AllPrivileges() []LUIDAndAttributes { | ||||||
|  | 	return (*[(1 << 27) - 1]LUIDAndAttributes)(unsafe.Pointer(&p.Privileges[0]))[:p.PrivilegeCount:p.PrivilegeCount] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Tokenmandatorylabel struct { | ||||||
|  | 	Label SIDAndAttributes | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (tml *Tokenmandatorylabel) Size() uint32 { | ||||||
|  | 	return uint32(unsafe.Sizeof(Tokenmandatorylabel{})) + GetLengthSid(tml.Label.Sid) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Authorization Functions | ||||||
|  | //sys	checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership | ||||||
|  | //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	ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf | ||||||
|  | //sys	RevertToSelf() (err error) = advapi32.RevertToSelf | ||||||
|  | //sys	SetThreadToken(thread *Handle, token Token) (err error) = advapi32.SetThreadToken | ||||||
|  | //sys	LookupPrivilegeValue(systemname *uint16, name *uint16, luid *LUID) (err error) = advapi32.LookupPrivilegeValueW | ||||||
|  | //sys	AdjustTokenPrivileges(token Token, disableAllPrivileges bool, newstate *Tokenprivileges, buflen uint32, prevstate *Tokenprivileges, returnlen *uint32) (err error) = advapi32.AdjustTokenPrivileges | ||||||
|  | //sys	AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) = advapi32.AdjustTokenGroups | ||||||
|  | //sys	GetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation | ||||||
|  | //sys	SetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32) (err error) = advapi32.SetTokenInformation | ||||||
|  | //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	getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW | ||||||
|  | 
 | ||||||
|  | // An access token contains the security information for a logon session. | ||||||
|  | // The system creates an access token when a user logs on, and every | ||||||
|  | // process executed on behalf of the user has a copy of the token. | ||||||
|  | // The token identifies the user, the user's groups, and the user's | ||||||
|  | // privileges. The system uses the token to control access to securable | ||||||
|  | // objects and to control the ability of the user to perform various | ||||||
|  | // system-related operations on the local computer. | ||||||
|  | type Token Handle | ||||||
|  | 
 | ||||||
|  | // OpenCurrentProcessToken opens the access token | ||||||
|  | // associated with current process. It is a real | ||||||
|  | // token that needs to be closed, unlike | ||||||
|  | // GetCurrentProcessToken. | ||||||
|  | func OpenCurrentProcessToken() (Token, error) { | ||||||
|  | 	p, e := GetCurrentProcess() | ||||||
|  | 	if e != nil { | ||||||
|  | 		return 0, e | ||||||
|  | 	} | ||||||
|  | 	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 | ||||||
|  | // the current process. It is a pseudo token that does not need | ||||||
|  | // to be closed. | ||||||
|  | func GetCurrentProcessToken() Token { | ||||||
|  | 	return Token(^uintptr(4 - 1)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetCurrentThreadToken return the access token associated with | ||||||
|  | // the current thread. It is a pseudo token that does not need | ||||||
|  | // to be closed. | ||||||
|  | func GetCurrentThreadToken() Token { | ||||||
|  | 	return Token(^uintptr(5 - 1)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetCurrentThreadEffectiveToken returns the effective access token | ||||||
|  | // associated with the current thread. It is a pseudo token that does | ||||||
|  | // not need to be closed. | ||||||
|  | func GetCurrentThreadEffectiveToken() Token { | ||||||
|  | 	return Token(^uintptr(6 - 1)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Close releases access to access token. | ||||||
|  | func (t Token) Close() error { | ||||||
|  | 	return CloseHandle(Handle(t)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // getInfo retrieves a specified type of information about an access token. | ||||||
|  | func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) { | ||||||
|  | 	n := uint32(initSize) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]byte, n) | ||||||
|  | 		e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n) | ||||||
|  | 		if e == nil { | ||||||
|  | 			return unsafe.Pointer(&b[0]), nil | ||||||
|  | 		} | ||||||
|  | 		if e != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			return nil, e | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(b)) { | ||||||
|  | 			return nil, e | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetTokenUser retrieves access token t user account information. | ||||||
|  | func (t Token) GetTokenUser() (*Tokenuser, error) { | ||||||
|  | 	i, e := t.getInfo(TokenUser, 50) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, e | ||||||
|  | 	} | ||||||
|  | 	return (*Tokenuser)(i), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetTokenGroups retrieves group accounts associated with access token t. | ||||||
|  | func (t Token) GetTokenGroups() (*Tokengroups, error) { | ||||||
|  | 	i, e := t.getInfo(TokenGroups, 50) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, e | ||||||
|  | 	} | ||||||
|  | 	return (*Tokengroups)(i), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetTokenPrimaryGroup retrieves access token t primary group information. | ||||||
|  | // A pointer to a SID structure representing a group that will become | ||||||
|  | // the primary group of any objects created by a process using this access token. | ||||||
|  | func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) { | ||||||
|  | 	i, e := t.getInfo(TokenPrimaryGroup, 50) | ||||||
|  | 	if e != nil { | ||||||
|  | 		return nil, e | ||||||
|  | 	} | ||||||
|  | 	return (*Tokenprimarygroup)(i), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetUserProfileDirectory retrieves path to the | ||||||
|  | // root directory of the access token t user's profile. | ||||||
|  | func (t Token) GetUserProfileDirectory() (string, error) { | ||||||
|  | 	n := uint32(100) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]uint16, n) | ||||||
|  | 		e := GetUserProfileDirectory(t, &b[0], &n) | ||||||
|  | 		if e == nil { | ||||||
|  | 			return UTF16ToString(b), nil | ||||||
|  | 		} | ||||||
|  | 		if e != ERROR_INSUFFICIENT_BUFFER { | ||||||
|  | 			return "", e | ||||||
|  | 		} | ||||||
|  | 		if n <= uint32(len(b)) { | ||||||
|  | 			return "", e | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsElevated returns whether the current token is elevated from a UAC perspective. | ||||||
|  | func (token Token) IsElevated() bool { | ||||||
|  | 	var isElevated uint32 | ||||||
|  | 	var outLen uint32 | ||||||
|  | 	err := GetTokenInformation(token, TokenElevation, (*byte)(unsafe.Pointer(&isElevated)), uint32(unsafe.Sizeof(isElevated)), &outLen) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return outLen == uint32(unsafe.Sizeof(isElevated)) && isElevated != 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetLinkedToken returns the linked token, which may be an elevated UAC token. | ||||||
|  | func (token Token) GetLinkedToken() (Token, error) { | ||||||
|  | 	var linkedToken Token | ||||||
|  | 	var outLen uint32 | ||||||
|  | 	err := GetTokenInformation(token, TokenLinkedToken, (*byte)(unsafe.Pointer(&linkedToken)), uint32(unsafe.Sizeof(linkedToken)), &outLen) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return Token(0), err | ||||||
|  | 	} | ||||||
|  | 	return linkedToken, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetSystemDirectory retrieves path to current location of the system | ||||||
|  | // directory, which is typically, though not always, C:\Windows\System32. | ||||||
|  | func GetSystemDirectory() (string, error) { | ||||||
|  | 	n := uint32(MAX_PATH) | ||||||
|  | 	for { | ||||||
|  | 		b := make([]uint16, n) | ||||||
|  | 		l, e := getSystemDirectory(&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. | ||||||
|  | func (t Token) IsMember(sid *SID) (bool, error) { | ||||||
|  | 	var b int32 | ||||||
|  | 	if e := checkTokenMembership(t, sid, &b); e != nil { | ||||||
|  | 		return false, e | ||||||
|  | 	} | ||||||
|  | 	return b != 0, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	WTS_CONSOLE_CONNECT        = 0x1 | ||||||
|  | 	WTS_CONSOLE_DISCONNECT     = 0x2 | ||||||
|  | 	WTS_REMOTE_CONNECT         = 0x3 | ||||||
|  | 	WTS_REMOTE_DISCONNECT      = 0x4 | ||||||
|  | 	WTS_SESSION_LOGON          = 0x5 | ||||||
|  | 	WTS_SESSION_LOGOFF         = 0x6 | ||||||
|  | 	WTS_SESSION_LOCK           = 0x7 | ||||||
|  | 	WTS_SESSION_UNLOCK         = 0x8 | ||||||
|  | 	WTS_SESSION_REMOTE_CONTROL = 0x9 | ||||||
|  | 	WTS_SESSION_CREATE         = 0xa | ||||||
|  | 	WTS_SESSION_TERMINATE      = 0xb | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	WTSActive       = 0 | ||||||
|  | 	WTSConnected    = 1 | ||||||
|  | 	WTSConnectQuery = 2 | ||||||
|  | 	WTSShadow       = 3 | ||||||
|  | 	WTSDisconnected = 4 | ||||||
|  | 	WTSIdle         = 5 | ||||||
|  | 	WTSListen       = 6 | ||||||
|  | 	WTSReset        = 7 | ||||||
|  | 	WTSDown         = 8 | ||||||
|  | 	WTSInit         = 9 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type WTSSESSION_NOTIFICATION struct { | ||||||
|  | 	Size      uint32 | ||||||
|  | 	SessionID uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type WTS_SESSION_INFO struct { | ||||||
|  | 	SessionID         uint32 | ||||||
|  | 	WindowStationName *uint16 | ||||||
|  | 	State             uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //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 WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory | ||||||
							
								
								
									
										225
									
								
								vendor/golang.org/x/sys/windows/service.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								vendor/golang.org/x/sys/windows/service.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,225 @@ | |||||||
|  | // Copyright 2012 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	SC_MANAGER_CONNECT            = 1 | ||||||
|  | 	SC_MANAGER_CREATE_SERVICE     = 2 | ||||||
|  | 	SC_MANAGER_ENUMERATE_SERVICE  = 4 | ||||||
|  | 	SC_MANAGER_LOCK               = 8 | ||||||
|  | 	SC_MANAGER_QUERY_LOCK_STATUS  = 16 | ||||||
|  | 	SC_MANAGER_MODIFY_BOOT_CONFIG = 32 | ||||||
|  | 	SC_MANAGER_ALL_ACCESS         = 0xf003f | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | //sys	OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	SERVICE_KERNEL_DRIVER       = 1 | ||||||
|  | 	SERVICE_FILE_SYSTEM_DRIVER  = 2 | ||||||
|  | 	SERVICE_ADAPTER             = 4 | ||||||
|  | 	SERVICE_RECOGNIZER_DRIVER   = 8 | ||||||
|  | 	SERVICE_WIN32_OWN_PROCESS   = 16 | ||||||
|  | 	SERVICE_WIN32_SHARE_PROCESS = 32 | ||||||
|  | 	SERVICE_WIN32               = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS | ||||||
|  | 	SERVICE_INTERACTIVE_PROCESS = 256 | ||||||
|  | 	SERVICE_DRIVER              = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER | ||||||
|  | 	SERVICE_TYPE_ALL            = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS | ||||||
|  | 
 | ||||||
|  | 	SERVICE_BOOT_START   = 0 | ||||||
|  | 	SERVICE_SYSTEM_START = 1 | ||||||
|  | 	SERVICE_AUTO_START   = 2 | ||||||
|  | 	SERVICE_DEMAND_START = 3 | ||||||
|  | 	SERVICE_DISABLED     = 4 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_ERROR_IGNORE   = 0 | ||||||
|  | 	SERVICE_ERROR_NORMAL   = 1 | ||||||
|  | 	SERVICE_ERROR_SEVERE   = 2 | ||||||
|  | 	SERVICE_ERROR_CRITICAL = 3 | ||||||
|  | 
 | ||||||
|  | 	SC_STATUS_PROCESS_INFO = 0 | ||||||
|  | 
 | ||||||
|  | 	SC_ACTION_NONE        = 0 | ||||||
|  | 	SC_ACTION_RESTART     = 1 | ||||||
|  | 	SC_ACTION_REBOOT      = 2 | ||||||
|  | 	SC_ACTION_RUN_COMMAND = 3 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_STOPPED          = 1 | ||||||
|  | 	SERVICE_START_PENDING    = 2 | ||||||
|  | 	SERVICE_STOP_PENDING     = 3 | ||||||
|  | 	SERVICE_RUNNING          = 4 | ||||||
|  | 	SERVICE_CONTINUE_PENDING = 5 | ||||||
|  | 	SERVICE_PAUSE_PENDING    = 6 | ||||||
|  | 	SERVICE_PAUSED           = 7 | ||||||
|  | 	SERVICE_NO_CHANGE        = 0xffffffff | ||||||
|  | 
 | ||||||
|  | 	SERVICE_ACCEPT_STOP                  = 1 | ||||||
|  | 	SERVICE_ACCEPT_PAUSE_CONTINUE        = 2 | ||||||
|  | 	SERVICE_ACCEPT_SHUTDOWN              = 4 | ||||||
|  | 	SERVICE_ACCEPT_PARAMCHANGE           = 8 | ||||||
|  | 	SERVICE_ACCEPT_NETBINDCHANGE         = 16 | ||||||
|  | 	SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 | ||||||
|  | 	SERVICE_ACCEPT_POWEREVENT            = 64 | ||||||
|  | 	SERVICE_ACCEPT_SESSIONCHANGE         = 128 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_CONTROL_STOP                  = 1 | ||||||
|  | 	SERVICE_CONTROL_PAUSE                 = 2 | ||||||
|  | 	SERVICE_CONTROL_CONTINUE              = 3 | ||||||
|  | 	SERVICE_CONTROL_INTERROGATE           = 4 | ||||||
|  | 	SERVICE_CONTROL_SHUTDOWN              = 5 | ||||||
|  | 	SERVICE_CONTROL_PARAMCHANGE           = 6 | ||||||
|  | 	SERVICE_CONTROL_NETBINDADD            = 7 | ||||||
|  | 	SERVICE_CONTROL_NETBINDREMOVE         = 8 | ||||||
|  | 	SERVICE_CONTROL_NETBINDENABLE         = 9 | ||||||
|  | 	SERVICE_CONTROL_NETBINDDISABLE        = 10 | ||||||
|  | 	SERVICE_CONTROL_DEVICEEVENT           = 11 | ||||||
|  | 	SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 | ||||||
|  | 	SERVICE_CONTROL_POWEREVENT            = 13 | ||||||
|  | 	SERVICE_CONTROL_SESSIONCHANGE         = 14 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_ACTIVE    = 1 | ||||||
|  | 	SERVICE_INACTIVE  = 2 | ||||||
|  | 	SERVICE_STATE_ALL = 3 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_QUERY_CONFIG         = 1 | ||||||
|  | 	SERVICE_CHANGE_CONFIG        = 2 | ||||||
|  | 	SERVICE_QUERY_STATUS         = 4 | ||||||
|  | 	SERVICE_ENUMERATE_DEPENDENTS = 8 | ||||||
|  | 	SERVICE_START                = 16 | ||||||
|  | 	SERVICE_STOP                 = 32 | ||||||
|  | 	SERVICE_PAUSE_CONTINUE       = 64 | ||||||
|  | 	SERVICE_INTERROGATE          = 128 | ||||||
|  | 	SERVICE_USER_DEFINED_CONTROL = 256 | ||||||
|  | 	SERVICE_ALL_ACCESS           = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL | ||||||
|  | 
 | ||||||
|  | 	SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_CONFIG_DESCRIPTION              = 1 | ||||||
|  | 	SERVICE_CONFIG_FAILURE_ACTIONS          = 2 | ||||||
|  | 	SERVICE_CONFIG_DELAYED_AUTO_START_INFO  = 3 | ||||||
|  | 	SERVICE_CONFIG_FAILURE_ACTIONS_FLAG     = 4 | ||||||
|  | 	SERVICE_CONFIG_SERVICE_SID_INFO         = 5 | ||||||
|  | 	SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 6 | ||||||
|  | 	SERVICE_CONFIG_PRESHUTDOWN_INFO         = 7 | ||||||
|  | 	SERVICE_CONFIG_TRIGGER_INFO             = 8 | ||||||
|  | 	SERVICE_CONFIG_PREFERRED_NODE           = 9 | ||||||
|  | 	SERVICE_CONFIG_LAUNCH_PROTECTED         = 12 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_SID_TYPE_NONE         = 0 | ||||||
|  | 	SERVICE_SID_TYPE_UNRESTRICTED = 1 | ||||||
|  | 	SERVICE_SID_TYPE_RESTRICTED   = 2 | SERVICE_SID_TYPE_UNRESTRICTED | ||||||
|  | 
 | ||||||
|  | 	SC_ENUM_PROCESS_INFO = 0 | ||||||
|  | 
 | ||||||
|  | 	SERVICE_NOTIFY_STATUS_CHANGE    = 2 | ||||||
|  | 	SERVICE_NOTIFY_STOPPED          = 0x00000001 | ||||||
|  | 	SERVICE_NOTIFY_START_PENDING    = 0x00000002 | ||||||
|  | 	SERVICE_NOTIFY_STOP_PENDING     = 0x00000004 | ||||||
|  | 	SERVICE_NOTIFY_RUNNING          = 0x00000008 | ||||||
|  | 	SERVICE_NOTIFY_CONTINUE_PENDING = 0x00000010 | ||||||
|  | 	SERVICE_NOTIFY_PAUSE_PENDING    = 0x00000020 | ||||||
|  | 	SERVICE_NOTIFY_PAUSED           = 0x00000040 | ||||||
|  | 	SERVICE_NOTIFY_CREATED          = 0x00000080 | ||||||
|  | 	SERVICE_NOTIFY_DELETED          = 0x00000100 | ||||||
|  | 	SERVICE_NOTIFY_DELETE_PENDING   = 0x00000200 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SERVICE_STATUS struct { | ||||||
|  | 	ServiceType             uint32 | ||||||
|  | 	CurrentState            uint32 | ||||||
|  | 	ControlsAccepted        uint32 | ||||||
|  | 	Win32ExitCode           uint32 | ||||||
|  | 	ServiceSpecificExitCode uint32 | ||||||
|  | 	CheckPoint              uint32 | ||||||
|  | 	WaitHint                uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SERVICE_TABLE_ENTRY struct { | ||||||
|  | 	ServiceName *uint16 | ||||||
|  | 	ServiceProc uintptr | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type QUERY_SERVICE_CONFIG struct { | ||||||
|  | 	ServiceType      uint32 | ||||||
|  | 	StartType        uint32 | ||||||
|  | 	ErrorControl     uint32 | ||||||
|  | 	BinaryPathName   *uint16 | ||||||
|  | 	LoadOrderGroup   *uint16 | ||||||
|  | 	TagId            uint32 | ||||||
|  | 	Dependencies     *uint16 | ||||||
|  | 	ServiceStartName *uint16 | ||||||
|  | 	DisplayName      *uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SERVICE_DESCRIPTION struct { | ||||||
|  | 	Description *uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SERVICE_STATUS_PROCESS struct { | ||||||
|  | 	ServiceType             uint32 | ||||||
|  | 	CurrentState            uint32 | ||||||
|  | 	ControlsAccepted        uint32 | ||||||
|  | 	Win32ExitCode           uint32 | ||||||
|  | 	ServiceSpecificExitCode uint32 | ||||||
|  | 	CheckPoint              uint32 | ||||||
|  | 	WaitHint                uint32 | ||||||
|  | 	ProcessId               uint32 | ||||||
|  | 	ServiceFlags            uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ENUM_SERVICE_STATUS_PROCESS struct { | ||||||
|  | 	ServiceName          *uint16 | ||||||
|  | 	DisplayName          *uint16 | ||||||
|  | 	ServiceStatusProcess SERVICE_STATUS_PROCESS | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SERVICE_NOTIFY struct { | ||||||
|  | 	Version               uint32 | ||||||
|  | 	NotifyCallback        uintptr | ||||||
|  | 	Context               uintptr | ||||||
|  | 	NotificationStatus    uint32 | ||||||
|  | 	ServiceStatus         SERVICE_STATUS_PROCESS | ||||||
|  | 	NotificationTriggered uint32 | ||||||
|  | 	ServiceNames          *uint16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SERVICE_FAILURE_ACTIONS struct { | ||||||
|  | 	ResetPeriod  uint32 | ||||||
|  | 	RebootMsg    *uint16 | ||||||
|  | 	Command      *uint16 | ||||||
|  | 	ActionsCount uint32 | ||||||
|  | 	Actions      *SC_ACTION | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SC_ACTION struct { | ||||||
|  | 	Type  uint32 | ||||||
|  | 	Delay uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type QUERY_SERVICE_LOCK_STATUS struct { | ||||||
|  | 	IsLocked     uint32 | ||||||
|  | 	LockOwner    *uint16 | ||||||
|  | 	LockDuration uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //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	OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW | ||||||
|  | //sys	DeleteService(service Handle) (err error) = advapi32.DeleteService | ||||||
|  | //sys	StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW | ||||||
|  | //sys	QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus | ||||||
|  | //sys	QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceLockStatusW | ||||||
|  | //sys	ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService | ||||||
|  | //sys	StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW | ||||||
|  | //sys	SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus | ||||||
|  | //sys	ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW | ||||||
|  | //sys	QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW | ||||||
|  | //sys	ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W | ||||||
|  | //sys	QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W | ||||||
|  | //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	NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/str.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/str.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | // 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | func itoa(val int) string { // do it here rather than with fmt to avoid dependency | ||||||
|  | 	if val < 0 { | ||||||
|  | 		return "-" + itoa(-val) | ||||||
|  | 	} | ||||||
|  | 	var buf [32]byte // big enough for int64 | ||||||
|  | 	i := len(buf) - 1 | ||||||
|  | 	for val >= 10 { | ||||||
|  | 		buf[i] = byte(val%10 + '0') | ||||||
|  | 		i-- | ||||||
|  | 		val /= 10 | ||||||
|  | 	} | ||||||
|  | 	buf[i] = byte(val + '0') | ||||||
|  | 	return string(buf[i:]) | ||||||
|  | } | ||||||
							
								
								
									
										74
									
								
								vendor/golang.org/x/sys/windows/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								vendor/golang.org/x/sys/windows/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,74 @@ | |||||||
|  | // 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. | ||||||
|  | 
 | ||||||
|  | // +build windows | ||||||
|  | 
 | ||||||
|  | // Package windows contains an interface to the low-level operating system | ||||||
|  | // primitives. OS details vary depending on the underlying system, and | ||||||
|  | // by default, godoc will display the OS-specific documentation for the current | ||||||
|  | // system. If you want godoc to display syscall documentation for another | ||||||
|  | // system, set $GOOS and $GOARCH to the desired system. For example, if | ||||||
|  | // you want to view documentation for freebsd/arm on linux/amd64, set $GOOS | ||||||
|  | // to freebsd and $GOARCH to arm. | ||||||
|  | // | ||||||
|  | // The primary use of this package is inside other packages that provide a more | ||||||
|  | // portable interface to the system, such as "os", "time" and "net".  Use | ||||||
|  | // those packages rather than this one if you can. | ||||||
|  | // | ||||||
|  | // For details of the functions and data types in this package consult | ||||||
|  | // the manuals for the appropriate operating system. | ||||||
|  | // | ||||||
|  | // These calls return err == nil to indicate success; otherwise | ||||||
|  | // err represents an operating system error describing the failure and | ||||||
|  | // holds a value of type syscall.Errno. | ||||||
|  | package windows // import "golang.org/x/sys/windows" | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // ByteSliceFromString returns a NUL-terminated slice of bytes | ||||||
|  | // containing the text of s. If s contains a NUL byte at any | ||||||
|  | // location, it returns (nil, syscall.EINVAL). | ||||||
|  | func ByteSliceFromString(s string) ([]byte, error) { | ||||||
|  | 	for i := 0; i < len(s); i++ { | ||||||
|  | 		if s[i] == 0 { | ||||||
|  | 			return nil, syscall.EINVAL | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	a := make([]byte, len(s)+1) | ||||||
|  | 	copy(a, s) | ||||||
|  | 	return a, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BytePtrFromString returns a pointer to a NUL-terminated array of | ||||||
|  | // bytes containing the text of s. If s contains a NUL byte at any | ||||||
|  | // location, it returns (nil, syscall.EINVAL). | ||||||
|  | func BytePtrFromString(s string) (*byte, error) { | ||||||
|  | 	a, err := ByteSliceFromString(s) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &a[0], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Single-word zero for use when we need a valid pointer to 0 bytes. | ||||||
|  | // See mksyscall.pl. | ||||||
|  | var _zero uintptr | ||||||
|  | 
 | ||||||
|  | func (ts *Timespec) Unix() (sec int64, nsec int64) { | ||||||
|  | 	return int64(ts.Sec), int64(ts.Nsec) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (tv *Timeval) Unix() (sec int64, nsec int64) { | ||||||
|  | 	return int64(tv.Sec), int64(tv.Usec) * 1000 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (ts *Timespec) Nano() int64 { | ||||||
|  | 	return int64(ts.Sec)*1e9 + int64(ts.Nsec) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (tv *Timeval) Nano() int64 { | ||||||
|  | 	return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 | ||||||
|  | } | ||||||
							
								
								
									
										1320
									
								
								vendor/golang.org/x/sys/windows/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1320
									
								
								vendor/golang.org/x/sys/windows/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1665
									
								
								vendor/golang.org/x/sys/windows/types_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1665
									
								
								vendor/golang.org/x/sys/windows/types_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_386.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_386.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | // 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 | ||||||
|  | 	Description  [WSADESCRIPTION_LEN + 1]byte | ||||||
|  | 	SystemStatus [WSASYS_STATUS_LEN + 1]byte | ||||||
|  | 	MaxSockets   uint16 | ||||||
|  | 	MaxUdpDg     uint16 | ||||||
|  | 	VendorInfo   *byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Servent struct { | ||||||
|  | 	Name    *byte | ||||||
|  | 	Aliases **byte | ||||||
|  | 	Port    uint16 | ||||||
|  | 	Proto   *byte | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | // 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 | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | // 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. | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | type WSAData struct { | ||||||
|  | 	Version      uint16 | ||||||
|  | 	HighVersion  uint16 | ||||||
|  | 	Description  [WSADESCRIPTION_LEN + 1]byte | ||||||
|  | 	SystemStatus [WSASYS_STATUS_LEN + 1]byte | ||||||
|  | 	MaxSockets   uint16 | ||||||
|  | 	MaxUdpDg     uint16 | ||||||
|  | 	VendorInfo   *byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Servent struct { | ||||||
|  | 	Name    *byte | ||||||
|  | 	Aliases **byte | ||||||
|  | 	Port    uint16 | ||||||
|  | 	Proto   *byte | ||||||
|  | } | ||||||
							
								
								
									
										6853
									
								
								vendor/golang.org/x/sys/windows/zerrors_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6853
									
								
								vendor/golang.org/x/sys/windows/zerrors_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										149
									
								
								vendor/golang.org/x/sys/windows/zknownfolderids_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								vendor/golang.org/x/sys/windows/zknownfolderids_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | |||||||
|  | // Code generated by 'mkknownfolderids.bash'; DO NOT EDIT. | ||||||
|  | 
 | ||||||
|  | package windows | ||||||
|  | 
 | ||||||
|  | type KNOWNFOLDERID GUID | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	FOLDERID_NetworkFolder          = &KNOWNFOLDERID{0xd20beec4, 0x5ca8, 0x4905, [8]byte{0xae, 0x3b, 0xbf, 0x25, 0x1e, 0xa0, 0x9b, 0x53}} | ||||||
|  | 	FOLDERID_ComputerFolder         = &KNOWNFOLDERID{0x0ac0837c, 0xbbf8, 0x452a, [8]byte{0x85, 0x0d, 0x79, 0xd0, 0x8e, 0x66, 0x7c, 0xa7}} | ||||||
|  | 	FOLDERID_InternetFolder         = &KNOWNFOLDERID{0x4d9f7874, 0x4e0c, 0x4904, [8]byte{0x96, 0x7b, 0x40, 0xb0, 0xd2, 0x0c, 0x3e, 0x4b}} | ||||||
|  | 	FOLDERID_ControlPanelFolder     = &KNOWNFOLDERID{0x82a74aeb, 0xaeb4, 0x465c, [8]byte{0xa0, 0x14, 0xd0, 0x97, 0xee, 0x34, 0x6d, 0x63}} | ||||||
|  | 	FOLDERID_PrintersFolder         = &KNOWNFOLDERID{0x76fc4e2d, 0xd6ad, 0x4519, [8]byte{0xa6, 0x63, 0x37, 0xbd, 0x56, 0x06, 0x81, 0x85}} | ||||||
|  | 	FOLDERID_SyncManagerFolder      = &KNOWNFOLDERID{0x43668bf8, 0xc14e, 0x49b2, [8]byte{0x97, 0xc9, 0x74, 0x77, 0x84, 0xd7, 0x84, 0xb7}} | ||||||
|  | 	FOLDERID_SyncSetupFolder        = &KNOWNFOLDERID{0x0f214138, 0xb1d3, 0x4a90, [8]byte{0xbb, 0xa9, 0x27, 0xcb, 0xc0, 0xc5, 0x38, 0x9a}} | ||||||
|  | 	FOLDERID_ConflictFolder         = &KNOWNFOLDERID{0x4bfefb45, 0x347d, 0x4006, [8]byte{0xa5, 0xbe, 0xac, 0x0c, 0xb0, 0x56, 0x71, 0x92}} | ||||||
|  | 	FOLDERID_SyncResultsFolder      = &KNOWNFOLDERID{0x289a9a43, 0xbe44, 0x4057, [8]byte{0xa4, 0x1b, 0x58, 0x7a, 0x76, 0xd7, 0xe7, 0xf9}} | ||||||
|  | 	FOLDERID_RecycleBinFolder       = &KNOWNFOLDERID{0xb7534046, 0x3ecb, 0x4c18, [8]byte{0xbe, 0x4e, 0x64, 0xcd, 0x4c, 0xb7, 0xd6, 0xac}} | ||||||
|  | 	FOLDERID_ConnectionsFolder      = &KNOWNFOLDERID{0x6f0cd92b, 0x2e97, 0x45d1, [8]byte{0x88, 0xff, 0xb0, 0xd1, 0x86, 0xb8, 0xde, 0xdd}} | ||||||
|  | 	FOLDERID_Fonts                  = &KNOWNFOLDERID{0xfd228cb7, 0xae11, 0x4ae3, [8]byte{0x86, 0x4c, 0x16, 0xf3, 0x91, 0x0a, 0xb8, 0xfe}} | ||||||
|  | 	FOLDERID_Desktop                = &KNOWNFOLDERID{0xb4bfcc3a, 0xdb2c, 0x424c, [8]byte{0xb0, 0x29, 0x7f, 0xe9, 0x9a, 0x87, 0xc6, 0x41}} | ||||||
|  | 	FOLDERID_Startup                = &KNOWNFOLDERID{0xb97d20bb, 0xf46a, 0x4c97, [8]byte{0xba, 0x10, 0x5e, 0x36, 0x08, 0x43, 0x08, 0x54}} | ||||||
|  | 	FOLDERID_Programs               = &KNOWNFOLDERID{0xa77f5d77, 0x2e2b, 0x44c3, [8]byte{0xa6, 0xa2, 0xab, 0xa6, 0x01, 0x05, 0x4a, 0x51}} | ||||||
|  | 	FOLDERID_StartMenu              = &KNOWNFOLDERID{0x625b53c3, 0xab48, 0x4ec1, [8]byte{0xba, 0x1f, 0xa1, 0xef, 0x41, 0x46, 0xfc, 0x19}} | ||||||
|  | 	FOLDERID_Recent                 = &KNOWNFOLDERID{0xae50c081, 0xebd2, 0x438a, [8]byte{0x86, 0x55, 0x8a, 0x09, 0x2e, 0x34, 0x98, 0x7a}} | ||||||
|  | 	FOLDERID_SendTo                 = &KNOWNFOLDERID{0x8983036c, 0x27c0, 0x404b, [8]byte{0x8f, 0x08, 0x10, 0x2d, 0x10, 0xdc, 0xfd, 0x74}} | ||||||
|  | 	FOLDERID_Documents              = &KNOWNFOLDERID{0xfdd39ad0, 0x238f, 0x46af, [8]byte{0xad, 0xb4, 0x6c, 0x85, 0x48, 0x03, 0x69, 0xc7}} | ||||||
|  | 	FOLDERID_Favorites              = &KNOWNFOLDERID{0x1777f761, 0x68ad, 0x4d8a, [8]byte{0x87, 0xbd, 0x30, 0xb7, 0x59, 0xfa, 0x33, 0xdd}} | ||||||
|  | 	FOLDERID_NetHood                = &KNOWNFOLDERID{0xc5abbf53, 0xe17f, 0x4121, [8]byte{0x89, 0x00, 0x86, 0x62, 0x6f, 0xc2, 0xc9, 0x73}} | ||||||
|  | 	FOLDERID_PrintHood              = &KNOWNFOLDERID{0x9274bd8d, 0xcfd1, 0x41c3, [8]byte{0xb3, 0x5e, 0xb1, 0x3f, 0x55, 0xa7, 0x58, 0xf4}} | ||||||
|  | 	FOLDERID_Templates              = &KNOWNFOLDERID{0xa63293e8, 0x664e, 0x48db, [8]byte{0xa0, 0x79, 0xdf, 0x75, 0x9e, 0x05, 0x09, 0xf7}} | ||||||
|  | 	FOLDERID_CommonStartup          = &KNOWNFOLDERID{0x82a5ea35, 0xd9cd, 0x47c5, [8]byte{0x96, 0x29, 0xe1, 0x5d, 0x2f, 0x71, 0x4e, 0x6e}} | ||||||
|  | 	FOLDERID_CommonPrograms         = &KNOWNFOLDERID{0x0139d44e, 0x6afe, 0x49f2, [8]byte{0x86, 0x90, 0x3d, 0xaf, 0xca, 0xe6, 0xff, 0xb8}} | ||||||
|  | 	FOLDERID_CommonStartMenu        = &KNOWNFOLDERID{0xa4115719, 0xd62e, 0x491d, [8]byte{0xaa, 0x7c, 0xe7, 0x4b, 0x8b, 0xe3, 0xb0, 0x67}} | ||||||
|  | 	FOLDERID_PublicDesktop          = &KNOWNFOLDERID{0xc4aa340d, 0xf20f, 0x4863, [8]byte{0xaf, 0xef, 0xf8, 0x7e, 0xf2, 0xe6, 0xba, 0x25}} | ||||||
|  | 	FOLDERID_ProgramData            = &KNOWNFOLDERID{0x62ab5d82, 0xfdc1, 0x4dc3, [8]byte{0xa9, 0xdd, 0x07, 0x0d, 0x1d, 0x49, 0x5d, 0x97}} | ||||||
|  | 	FOLDERID_CommonTemplates        = &KNOWNFOLDERID{0xb94237e7, 0x57ac, 0x4347, [8]byte{0x91, 0x51, 0xb0, 0x8c, 0x6c, 0x32, 0xd1, 0xf7}} | ||||||
|  | 	FOLDERID_PublicDocuments        = &KNOWNFOLDERID{0xed4824af, 0xdce4, 0x45a8, [8]byte{0x81, 0xe2, 0xfc, 0x79, 0x65, 0x08, 0x36, 0x34}} | ||||||
|  | 	FOLDERID_RoamingAppData         = &KNOWNFOLDERID{0x3eb685db, 0x65f9, 0x4cf6, [8]byte{0xa0, 0x3a, 0xe3, 0xef, 0x65, 0x72, 0x9f, 0x3d}} | ||||||
|  | 	FOLDERID_LocalAppData           = &KNOWNFOLDERID{0xf1b32785, 0x6fba, 0x4fcf, [8]byte{0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91}} | ||||||
|  | 	FOLDERID_LocalAppDataLow        = &KNOWNFOLDERID{0xa520a1a4, 0x1780, 0x4ff6, [8]byte{0xbd, 0x18, 0x16, 0x73, 0x43, 0xc5, 0xaf, 0x16}} | ||||||
|  | 	FOLDERID_InternetCache          = &KNOWNFOLDERID{0x352481e8, 0x33be, 0x4251, [8]byte{0xba, 0x85, 0x60, 0x07, 0xca, 0xed, 0xcf, 0x9d}} | ||||||
|  | 	FOLDERID_Cookies                = &KNOWNFOLDERID{0x2b0f765d, 0xc0e9, 0x4171, [8]byte{0x90, 0x8e, 0x08, 0xa6, 0x11, 0xb8, 0x4f, 0xf6}} | ||||||
|  | 	FOLDERID_History                = &KNOWNFOLDERID{0xd9dc8a3b, 0xb784, 0x432e, [8]byte{0xa7, 0x81, 0x5a, 0x11, 0x30, 0xa7, 0x59, 0x63}} | ||||||
|  | 	FOLDERID_System                 = &KNOWNFOLDERID{0x1ac14e77, 0x02e7, 0x4e5d, [8]byte{0xb7, 0x44, 0x2e, 0xb1, 0xae, 0x51, 0x98, 0xb7}} | ||||||
|  | 	FOLDERID_SystemX86              = &KNOWNFOLDERID{0xd65231b0, 0xb2f1, 0x4857, [8]byte{0xa4, 0xce, 0xa8, 0xe7, 0xc6, 0xea, 0x7d, 0x27}} | ||||||
|  | 	FOLDERID_Windows                = &KNOWNFOLDERID{0xf38bf404, 0x1d43, 0x42f2, [8]byte{0x93, 0x05, 0x67, 0xde, 0x0b, 0x28, 0xfc, 0x23}} | ||||||
|  | 	FOLDERID_Profile                = &KNOWNFOLDERID{0x5e6c858f, 0x0e22, 0x4760, [8]byte{0x9a, 0xfe, 0xea, 0x33, 0x17, 0xb6, 0x71, 0x73}} | ||||||
|  | 	FOLDERID_Pictures               = &KNOWNFOLDERID{0x33e28130, 0x4e1e, 0x4676, [8]byte{0x83, 0x5a, 0x98, 0x39, 0x5c, 0x3b, 0xc3, 0xbb}} | ||||||
|  | 	FOLDERID_ProgramFilesX86        = &KNOWNFOLDERID{0x7c5a40ef, 0xa0fb, 0x4bfc, [8]byte{0x87, 0x4a, 0xc0, 0xf2, 0xe0, 0xb9, 0xfa, 0x8e}} | ||||||
|  | 	FOLDERID_ProgramFilesCommonX86  = &KNOWNFOLDERID{0xde974d24, 0xd9c6, 0x4d3e, [8]byte{0xbf, 0x91, 0xf4, 0x45, 0x51, 0x20, 0xb9, 0x17}} | ||||||
|  | 	FOLDERID_ProgramFilesX64        = &KNOWNFOLDERID{0x6d809377, 0x6af0, 0x444b, [8]byte{0x89, 0x57, 0xa3, 0x77, 0x3f, 0x02, 0x20, 0x0e}} | ||||||
|  | 	FOLDERID_ProgramFilesCommonX64  = &KNOWNFOLDERID{0x6365d5a7, 0x0f0d, 0x45e5, [8]byte{0x87, 0xf6, 0x0d, 0xa5, 0x6b, 0x6a, 0x4f, 0x7d}} | ||||||
|  | 	FOLDERID_ProgramFiles           = &KNOWNFOLDERID{0x905e63b6, 0xc1bf, 0x494e, [8]byte{0xb2, 0x9c, 0x65, 0xb7, 0x32, 0xd3, 0xd2, 0x1a}} | ||||||
|  | 	FOLDERID_ProgramFilesCommon     = &KNOWNFOLDERID{0xf7f1ed05, 0x9f6d, 0x47a2, [8]byte{0xaa, 0xae, 0x29, 0xd3, 0x17, 0xc6, 0xf0, 0x66}} | ||||||
|  | 	FOLDERID_UserProgramFiles       = &KNOWNFOLDERID{0x5cd7aee2, 0x2219, 0x4a67, [8]byte{0xb8, 0x5d, 0x6c, 0x9c, 0xe1, 0x56, 0x60, 0xcb}} | ||||||
|  | 	FOLDERID_UserProgramFilesCommon = &KNOWNFOLDERID{0xbcbd3057, 0xca5c, 0x4622, [8]byte{0xb4, 0x2d, 0xbc, 0x56, 0xdb, 0x0a, 0xe5, 0x16}} | ||||||
|  | 	FOLDERID_AdminTools             = &KNOWNFOLDERID{0x724ef170, 0xa42d, 0x4fef, [8]byte{0x9f, 0x26, 0xb6, 0x0e, 0x84, 0x6f, 0xba, 0x4f}} | ||||||
|  | 	FOLDERID_CommonAdminTools       = &KNOWNFOLDERID{0xd0384e7d, 0xbac3, 0x4797, [8]byte{0x8f, 0x14, 0xcb, 0xa2, 0x29, 0xb3, 0x92, 0xb5}} | ||||||
|  | 	FOLDERID_Music                  = &KNOWNFOLDERID{0x4bd8d571, 0x6d19, 0x48d3, [8]byte{0xbe, 0x97, 0x42, 0x22, 0x20, 0x08, 0x0e, 0x43}} | ||||||
|  | 	FOLDERID_Videos                 = &KNOWNFOLDERID{0x18989b1d, 0x99b5, 0x455b, [8]byte{0x84, 0x1c, 0xab, 0x7c, 0x74, 0xe4, 0xdd, 0xfc}} | ||||||
|  | 	FOLDERID_Ringtones              = &KNOWNFOLDERID{0xc870044b, 0xf49e, 0x4126, [8]byte{0xa9, 0xc3, 0xb5, 0x2a, 0x1f, 0xf4, 0x11, 0xe8}} | ||||||
|  | 	FOLDERID_PublicPictures         = &KNOWNFOLDERID{0xb6ebfb86, 0x6907, 0x413c, [8]byte{0x9a, 0xf7, 0x4f, 0xc2, 0xab, 0xf0, 0x7c, 0xc5}} | ||||||
|  | 	FOLDERID_PublicMusic            = &KNOWNFOLDERID{0x3214fab5, 0x9757, 0x4298, [8]byte{0xbb, 0x61, 0x92, 0xa9, 0xde, 0xaa, 0x44, 0xff}} | ||||||
|  | 	FOLDERID_PublicVideos           = &KNOWNFOLDERID{0x2400183a, 0x6185, 0x49fb, [8]byte{0xa2, 0xd8, 0x4a, 0x39, 0x2a, 0x60, 0x2b, 0xa3}} | ||||||
|  | 	FOLDERID_PublicRingtones        = &KNOWNFOLDERID{0xe555ab60, 0x153b, 0x4d17, [8]byte{0x9f, 0x04, 0xa5, 0xfe, 0x99, 0xfc, 0x15, 0xec}} | ||||||
|  | 	FOLDERID_ResourceDir            = &KNOWNFOLDERID{0x8ad10c31, 0x2adb, 0x4296, [8]byte{0xa8, 0xf7, 0xe4, 0x70, 0x12, 0x32, 0xc9, 0x72}} | ||||||
|  | 	FOLDERID_LocalizedResourcesDir  = &KNOWNFOLDERID{0x2a00375e, 0x224c, 0x49de, [8]byte{0xb8, 0xd1, 0x44, 0x0d, 0xf7, 0xef, 0x3d, 0xdc}} | ||||||
|  | 	FOLDERID_CommonOEMLinks         = &KNOWNFOLDERID{0xc1bae2d0, 0x10df, 0x4334, [8]byte{0xbe, 0xdd, 0x7a, 0xa2, 0x0b, 0x22, 0x7a, 0x9d}} | ||||||
|  | 	FOLDERID_CDBurning              = &KNOWNFOLDERID{0x9e52ab10, 0xf80d, 0x49df, [8]byte{0xac, 0xb8, 0x43, 0x30, 0xf5, 0x68, 0x78, 0x55}} | ||||||
|  | 	FOLDERID_UserProfiles           = &KNOWNFOLDERID{0x0762d272, 0xc50a, 0x4bb0, [8]byte{0xa3, 0x82, 0x69, 0x7d, 0xcd, 0x72, 0x9b, 0x80}} | ||||||
|  | 	FOLDERID_Playlists              = &KNOWNFOLDERID{0xde92c1c7, 0x837f, 0x4f69, [8]byte{0xa3, 0xbb, 0x86, 0xe6, 0x31, 0x20, 0x4a, 0x23}} | ||||||
|  | 	FOLDERID_SamplePlaylists        = &KNOWNFOLDERID{0x15ca69b3, 0x30ee, 0x49c1, [8]byte{0xac, 0xe1, 0x6b, 0x5e, 0xc3, 0x72, 0xaf, 0xb5}} | ||||||
|  | 	FOLDERID_SampleMusic            = &KNOWNFOLDERID{0xb250c668, 0xf57d, 0x4ee1, [8]byte{0xa6, 0x3c, 0x29, 0x0e, 0xe7, 0xd1, 0xaa, 0x1f}} | ||||||
|  | 	FOLDERID_SamplePictures         = &KNOWNFOLDERID{0xc4900540, 0x2379, 0x4c75, [8]byte{0x84, 0x4b, 0x64, 0xe6, 0xfa, 0xf8, 0x71, 0x6b}} | ||||||
|  | 	FOLDERID_SampleVideos           = &KNOWNFOLDERID{0x859ead94, 0x2e85, 0x48ad, [8]byte{0xa7, 0x1a, 0x09, 0x69, 0xcb, 0x56, 0xa6, 0xcd}} | ||||||
|  | 	FOLDERID_PhotoAlbums            = &KNOWNFOLDERID{0x69d2cf90, 0xfc33, 0x4fb7, [8]byte{0x9a, 0x0c, 0xeb, 0xb0, 0xf0, 0xfc, 0xb4, 0x3c}} | ||||||
|  | 	FOLDERID_Public                 = &KNOWNFOLDERID{0xdfdf76a2, 0xc82a, 0x4d63, [8]byte{0x90, 0x6a, 0x56, 0x44, 0xac, 0x45, 0x73, 0x85}} | ||||||
|  | 	FOLDERID_ChangeRemovePrograms   = &KNOWNFOLDERID{0xdf7266ac, 0x9274, 0x4867, [8]byte{0x8d, 0x55, 0x3b, 0xd6, 0x61, 0xde, 0x87, 0x2d}} | ||||||
|  | 	FOLDERID_AppUpdates             = &KNOWNFOLDERID{0xa305ce99, 0xf527, 0x492b, [8]byte{0x8b, 0x1a, 0x7e, 0x76, 0xfa, 0x98, 0xd6, 0xe4}} | ||||||
|  | 	FOLDERID_AddNewPrograms         = &KNOWNFOLDERID{0xde61d971, 0x5ebc, 0x4f02, [8]byte{0xa3, 0xa9, 0x6c, 0x82, 0x89, 0x5e, 0x5c, 0x04}} | ||||||
|  | 	FOLDERID_Downloads              = &KNOWNFOLDERID{0x374de290, 0x123f, 0x4565, [8]byte{0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b}} | ||||||
|  | 	FOLDERID_PublicDownloads        = &KNOWNFOLDERID{0x3d644c9b, 0x1fb8, 0x4f30, [8]byte{0x9b, 0x45, 0xf6, 0x70, 0x23, 0x5f, 0x79, 0xc0}} | ||||||
|  | 	FOLDERID_SavedSearches          = &KNOWNFOLDERID{0x7d1d3a04, 0xdebb, 0x4115, [8]byte{0x95, 0xcf, 0x2f, 0x29, 0xda, 0x29, 0x20, 0xda}} | ||||||
|  | 	FOLDERID_QuickLaunch            = &KNOWNFOLDERID{0x52a4f021, 0x7b75, 0x48a9, [8]byte{0x9f, 0x6b, 0x4b, 0x87, 0xa2, 0x10, 0xbc, 0x8f}} | ||||||
|  | 	FOLDERID_Contacts               = &KNOWNFOLDERID{0x56784854, 0xc6cb, 0x462b, [8]byte{0x81, 0x69, 0x88, 0xe3, 0x50, 0xac, 0xb8, 0x82}} | ||||||
|  | 	FOLDERID_SidebarParts           = &KNOWNFOLDERID{0xa75d362e, 0x50fc, 0x4fb7, [8]byte{0xac, 0x2c, 0xa8, 0xbe, 0xaa, 0x31, 0x44, 0x93}} | ||||||
|  | 	FOLDERID_SidebarDefaultParts    = &KNOWNFOLDERID{0x7b396e54, 0x9ec5, 0x4300, [8]byte{0xbe, 0x0a, 0x24, 0x82, 0xeb, 0xae, 0x1a, 0x26}} | ||||||
|  | 	FOLDERID_PublicGameTasks        = &KNOWNFOLDERID{0xdebf2536, 0xe1a8, 0x4c59, [8]byte{0xb6, 0xa2, 0x41, 0x45, 0x86, 0x47, 0x6a, 0xea}} | ||||||
|  | 	FOLDERID_GameTasks              = &KNOWNFOLDERID{0x054fae61, 0x4dd8, 0x4787, [8]byte{0x80, 0xb6, 0x09, 0x02, 0x20, 0xc4, 0xb7, 0x00}} | ||||||
|  | 	FOLDERID_SavedGames             = &KNOWNFOLDERID{0x4c5c32ff, 0xbb9d, 0x43b0, [8]byte{0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4}} | ||||||
|  | 	FOLDERID_Games                  = &KNOWNFOLDERID{0xcac52c1a, 0xb53d, 0x4edc, [8]byte{0x92, 0xd7, 0x6b, 0x2e, 0x8a, 0xc1, 0x94, 0x34}} | ||||||
|  | 	FOLDERID_SEARCH_MAPI            = &KNOWNFOLDERID{0x98ec0e18, 0x2098, 0x4d44, [8]byte{0x86, 0x44, 0x66, 0x97, 0x93, 0x15, 0xa2, 0x81}} | ||||||
|  | 	FOLDERID_SEARCH_CSC             = &KNOWNFOLDERID{0xee32e446, 0x31ca, 0x4aba, [8]byte{0x81, 0x4f, 0xa5, 0xeb, 0xd2, 0xfd, 0x6d, 0x5e}} | ||||||
|  | 	FOLDERID_Links                  = &KNOWNFOLDERID{0xbfb9d5e0, 0xc6a9, 0x404c, [8]byte{0xb2, 0xb2, 0xae, 0x6d, 0xb6, 0xaf, 0x49, 0x68}} | ||||||
|  | 	FOLDERID_UsersFiles             = &KNOWNFOLDERID{0xf3ce0f7c, 0x4901, 0x4acc, [8]byte{0x86, 0x48, 0xd5, 0xd4, 0x4b, 0x04, 0xef, 0x8f}} | ||||||
|  | 	FOLDERID_UsersLibraries         = &KNOWNFOLDERID{0xa302545d, 0xdeff, 0x464b, [8]byte{0xab, 0xe8, 0x61, 0xc8, 0x64, 0x8d, 0x93, 0x9b}} | ||||||
|  | 	FOLDERID_SearchHome             = &KNOWNFOLDERID{0x190337d1, 0xb8ca, 0x4121, [8]byte{0xa6, 0x39, 0x6d, 0x47, 0x2d, 0x16, 0x97, 0x2a}} | ||||||
|  | 	FOLDERID_OriginalImages         = &KNOWNFOLDERID{0x2c36c0aa, 0x5812, 0x4b87, [8]byte{0xbf, 0xd0, 0x4c, 0xd0, 0xdf, 0xb1, 0x9b, 0x39}} | ||||||
|  | 	FOLDERID_DocumentsLibrary       = &KNOWNFOLDERID{0x7b0db17d, 0x9cd2, 0x4a93, [8]byte{0x97, 0x33, 0x46, 0xcc, 0x89, 0x02, 0x2e, 0x7c}} | ||||||
|  | 	FOLDERID_MusicLibrary           = &KNOWNFOLDERID{0x2112ab0a, 0xc86a, 0x4ffe, [8]byte{0xa3, 0x68, 0x0d, 0xe9, 0x6e, 0x47, 0x01, 0x2e}} | ||||||
|  | 	FOLDERID_PicturesLibrary        = &KNOWNFOLDERID{0xa990ae9f, 0xa03b, 0x4e80, [8]byte{0x94, 0xbc, 0x99, 0x12, 0xd7, 0x50, 0x41, 0x04}} | ||||||
|  | 	FOLDERID_VideosLibrary          = &KNOWNFOLDERID{0x491e922f, 0x5643, 0x4af4, [8]byte{0xa7, 0xeb, 0x4e, 0x7a, 0x13, 0x8d, 0x81, 0x74}} | ||||||
|  | 	FOLDERID_RecordedTVLibrary      = &KNOWNFOLDERID{0x1a6fdba2, 0xf42d, 0x4358, [8]byte{0xa7, 0x98, 0xb7, 0x4d, 0x74, 0x59, 0x26, 0xc5}} | ||||||
|  | 	FOLDERID_HomeGroup              = &KNOWNFOLDERID{0x52528a6b, 0xb9e3, 0x4add, [8]byte{0xb6, 0x0d, 0x58, 0x8c, 0x2d, 0xba, 0x84, 0x2d}} | ||||||
|  | 	FOLDERID_HomeGroupCurrentUser   = &KNOWNFOLDERID{0x9b74b6a3, 0x0dfd, 0x4f11, [8]byte{0x9e, 0x78, 0x5f, 0x78, 0x00, 0xf2, 0xe7, 0x72}} | ||||||
|  | 	FOLDERID_DeviceMetadataStore    = &KNOWNFOLDERID{0x5ce4a5e9, 0xe4eb, 0x479d, [8]byte{0xb8, 0x9f, 0x13, 0x0c, 0x02, 0x88, 0x61, 0x55}} | ||||||
|  | 	FOLDERID_Libraries              = &KNOWNFOLDERID{0x1b3ea5dc, 0xb587, 0x4786, [8]byte{0xb4, 0xef, 0xbd, 0x1d, 0xc3, 0x32, 0xae, 0xae}} | ||||||
|  | 	FOLDERID_PublicLibraries        = &KNOWNFOLDERID{0x48daf80b, 0xe6cf, 0x4f4e, [8]byte{0xb8, 0x00, 0x0e, 0x69, 0xd8, 0x4e, 0xe3, 0x84}} | ||||||
|  | 	FOLDERID_UserPinned             = &KNOWNFOLDERID{0x9e3995ab, 0x1f9c, 0x4f13, [8]byte{0xb8, 0x27, 0x48, 0xb2, 0x4b, 0x6c, 0x71, 0x74}} | ||||||
|  | 	FOLDERID_ImplicitAppShortcuts   = &KNOWNFOLDERID{0xbcb5256f, 0x79f6, 0x4cee, [8]byte{0xb7, 0x25, 0xdc, 0x34, 0xe4, 0x02, 0xfd, 0x46}} | ||||||
|  | 	FOLDERID_AccountPictures        = &KNOWNFOLDERID{0x008ca0b1, 0x55b4, 0x4c56, [8]byte{0xb8, 0xa8, 0x4d, 0xe4, 0xb2, 0x99, 0xd3, 0xbe}} | ||||||
|  | 	FOLDERID_PublicUserTiles        = &KNOWNFOLDERID{0x0482af6c, 0x08f1, 0x4c34, [8]byte{0x8c, 0x90, 0xe1, 0x7e, 0xc9, 0x8b, 0x1e, 0x17}} | ||||||
|  | 	FOLDERID_AppsFolder             = &KNOWNFOLDERID{0x1e87508d, 0x89c2, 0x42f0, [8]byte{0x8a, 0x7e, 0x64, 0x5a, 0x0f, 0x50, 0xca, 0x58}} | ||||||
|  | 	FOLDERID_StartMenuAllPrograms   = &KNOWNFOLDERID{0xf26305ef, 0x6948, 0x40b9, [8]byte{0xb2, 0x55, 0x81, 0x45, 0x3d, 0x09, 0xc7, 0x85}} | ||||||
|  | 	FOLDERID_CommonStartMenuPlaces  = &KNOWNFOLDERID{0xa440879f, 0x87a0, 0x4f7d, [8]byte{0xb7, 0x00, 0x02, 0x07, 0xb9, 0x66, 0x19, 0x4a}} | ||||||
|  | 	FOLDERID_ApplicationShortcuts   = &KNOWNFOLDERID{0xa3918781, 0xe5f2, 0x4890, [8]byte{0xb3, 0xd9, 0xa7, 0xe5, 0x43, 0x32, 0x32, 0x8c}} | ||||||
|  | 	FOLDERID_RoamingTiles           = &KNOWNFOLDERID{0x00bcfc5a, 0xed94, 0x4e48, [8]byte{0x96, 0xa1, 0x3f, 0x62, 0x17, 0xf2, 0x19, 0x90}} | ||||||
|  | 	FOLDERID_RoamedTileImages       = &KNOWNFOLDERID{0xaaa8d5a5, 0xf1d6, 0x4259, [8]byte{0xba, 0xa8, 0x78, 0xe7, 0xef, 0x60, 0x83, 0x5e}} | ||||||
|  | 	FOLDERID_Screenshots            = &KNOWNFOLDERID{0xb7bede81, 0xdf94, 0x4682, [8]byte{0xa7, 0xd8, 0x57, 0xa5, 0x26, 0x20, 0xb8, 0x6f}} | ||||||
|  | 	FOLDERID_CameraRoll             = &KNOWNFOLDERID{0xab5fb87b, 0x7ce2, 0x4f83, [8]byte{0x91, 0x5d, 0x55, 0x08, 0x46, 0xc9, 0x53, 0x7b}} | ||||||
|  | 	FOLDERID_SkyDrive               = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}} | ||||||
|  | 	FOLDERID_OneDrive               = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}} | ||||||
|  | 	FOLDERID_SkyDriveDocuments      = &KNOWNFOLDERID{0x24d89e24, 0x2f19, 0x4534, [8]byte{0x9d, 0xde, 0x6a, 0x66, 0x71, 0xfb, 0xb8, 0xfe}} | ||||||
|  | 	FOLDERID_SkyDrivePictures       = &KNOWNFOLDERID{0x339719b5, 0x8c47, 0x4894, [8]byte{0x94, 0xc2, 0xd8, 0xf7, 0x7a, 0xdd, 0x44, 0xa6}} | ||||||
|  | 	FOLDERID_SkyDriveMusic          = &KNOWNFOLDERID{0xc3f2459e, 0x80d6, 0x45dc, [8]byte{0xbf, 0xef, 0x1f, 0x76, 0x9f, 0x2b, 0xe7, 0x30}} | ||||||
|  | 	FOLDERID_SkyDriveCameraRoll     = &KNOWNFOLDERID{0x767e6811, 0x49cb, 0x4273, [8]byte{0x87, 0xc2, 0x20, 0xf3, 0x55, 0xe1, 0x08, 0x5b}} | ||||||
|  | 	FOLDERID_SearchHistory          = &KNOWNFOLDERID{0x0d4c3db6, 0x03a3, 0x462f, [8]byte{0xa0, 0xe6, 0x08, 0x92, 0x4c, 0x41, 0xb5, 0xd4}} | ||||||
|  | 	FOLDERID_SearchTemplates        = &KNOWNFOLDERID{0x7e636bfe, 0xdfa9, 0x4d5e, [8]byte{0xb4, 0x56, 0xd7, 0xb3, 0x98, 0x51, 0xd8, 0xa9}} | ||||||
|  | 	FOLDERID_CameraRollLibrary      = &KNOWNFOLDERID{0x2b20df75, 0x1eda, 0x4039, [8]byte{0x80, 0x97, 0x38, 0x79, 0x82, 0x27, 0xd5, 0xb7}} | ||||||
|  | 	FOLDERID_SavedPictures          = &KNOWNFOLDERID{0x3b193882, 0xd3ad, 0x4eab, [8]byte{0x96, 0x5a, 0x69, 0x82, 0x9d, 0x1f, 0xb5, 0x9f}} | ||||||
|  | 	FOLDERID_SavedPicturesLibrary   = &KNOWNFOLDERID{0xe25b5812, 0xbe88, 0x4bd9, [8]byte{0x94, 0xb0, 0x29, 0x23, 0x34, 0x77, 0xb6, 0xc3}} | ||||||
|  | 	FOLDERID_RetailDemo             = &KNOWNFOLDERID{0x12d4c69e, 0x24ad, 0x4923, [8]byte{0xbe, 0x19, 0x31, 0x32, 0x1c, 0x43, 0xa7, 0x67}} | ||||||
|  | 	FOLDERID_Device                 = &KNOWNFOLDERID{0x1c2ac1dc, 0x4358, 0x4b6c, [8]byte{0x97, 0x33, 0xaf, 0x21, 0x15, 0x65, 0x76, 0xf0}} | ||||||
|  | 	FOLDERID_DevelopmentFiles       = &KNOWNFOLDERID{0xdbe8e08e, 0x3053, 0x4bbc, [8]byte{0xb1, 0x83, 0x2a, 0x7b, 0x2b, 0x19, 0x1e, 0x59}} | ||||||
|  | 	FOLDERID_Objects3D              = &KNOWNFOLDERID{0x31c0dd25, 0x9439, 0x4f12, [8]byte{0xbf, 0x41, 0x7f, 0xf4, 0xed, 0xa3, 0x87, 0x22}} | ||||||
|  | 	FOLDERID_AppCaptures            = &KNOWNFOLDERID{0xedc0fe71, 0x98d8, 0x4f4a, [8]byte{0xb9, 0x20, 0xc8, 0xdc, 0x13, 0x3c, 0xb1, 0x65}} | ||||||
|  | 	FOLDERID_LocalDocuments         = &KNOWNFOLDERID{0xf42ee2d3, 0x909f, 0x4907, [8]byte{0x88, 0x71, 0x4c, 0x22, 0xfc, 0x0b, 0xf7, 0x56}} | ||||||
|  | 	FOLDERID_LocalPictures          = &KNOWNFOLDERID{0x0ddd015d, 0xb06c, 0x45d5, [8]byte{0x8c, 0x4c, 0xf5, 0x97, 0x13, 0x85, 0x46, 0x39}} | ||||||
|  | 	FOLDERID_LocalVideos            = &KNOWNFOLDERID{0x35286a68, 0x3c57, 0x41a1, [8]byte{0xbb, 0xb1, 0x0e, 0xae, 0x73, 0xd7, 0x6c, 0x95}} | ||||||
|  | 	FOLDERID_LocalMusic             = &KNOWNFOLDERID{0xa0c69a99, 0x21c8, 0x4671, [8]byte{0x87, 0x03, 0x79, 0x34, 0x16, 0x2f, 0xcf, 0x1d}} | ||||||
|  | 	FOLDERID_LocalDownloads         = &KNOWNFOLDERID{0x7d83ee9b, 0x2244, 0x4e70, [8]byte{0xb1, 0xf5, 0x53, 0x93, 0x04, 0x2a, 0xf1, 0xe4}} | ||||||
|  | 	FOLDERID_RecordedCalls          = &KNOWNFOLDERID{0x2f8b40c2, 0x83ed, 0x48ee, [8]byte{0xb3, 0x83, 0xa1, 0xf1, 0x57, 0xec, 0x6f, 0x9a}} | ||||||
|  | 	FOLDERID_AllAppMods             = &KNOWNFOLDERID{0x7ad67899, 0x66af, 0x43ba, [8]byte{0x91, 0x56, 0x6a, 0xad, 0x42, 0xe6, 0xc5, 0x96}} | ||||||
|  | 	FOLDERID_CurrentAppMods         = &KNOWNFOLDERID{0x3db40b20, 0x2a30, 0x4dbe, [8]byte{0x91, 0x7e, 0x77, 0x1d, 0xd2, 0x1d, 0xd0, 0x99}} | ||||||
|  | 	FOLDERID_AppDataDesktop         = &KNOWNFOLDERID{0xb2c5e279, 0x7add, 0x439f, [8]byte{0xb2, 0x8c, 0xc4, 0x1f, 0xe1, 0xbb, 0xf6, 0x72}} | ||||||
|  | 	FOLDERID_AppDataDocuments       = &KNOWNFOLDERID{0x7be16610, 0x1f7f, 0x44ac, [8]byte{0xbf, 0xf0, 0x83, 0xe1, 0x5f, 0x2f, 0xfc, 0xa1}} | ||||||
|  | 	FOLDERID_AppDataFavorites       = &KNOWNFOLDERID{0x7cfbefbc, 0xde1f, 0x45aa, [8]byte{0xb8, 0x43, 0xa5, 0x42, 0xac, 0x53, 0x6c, 0xc9}} | ||||||
|  | 	FOLDERID_AppDataProgramData     = &KNOWNFOLDERID{0x559d40a3, 0xa036, 0x40fa, [8]byte{0xaf, 0x61, 0x84, 0xcb, 0x43, 0x0a, 0x4d, 0x34}} | ||||||
|  | ) | ||||||
							
								
								
									
										3337
									
								
								vendor/golang.org/x/sys/windows/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3337
									
								
								vendor/golang.org/x/sys/windows/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | # git.rootprojects.org/root/go-gitver v1.1.3 | ||||||
|  | git.rootprojects.org/root/go-gitver | ||||||
|  | git.rootprojects.org/root/go-gitver/gitver | ||||||
|  | # golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 | ||||||
|  | golang.org/x/sys/windows/registry | ||||||
|  | golang.org/x/sys/windows | ||||||
| @ -56,7 +56,7 @@ func NormalizePathEntry(pathentry string) (string, string) { | |||||||
| 	if strings.HasPrefix(strings.ToLower(absentry)+sep, strings.ToLower(home)+sep) { | 	if strings.HasPrefix(strings.ToLower(absentry)+sep, strings.ToLower(home)+sep) { | ||||||
| 		// %USERPROFILE% is allowed, but only for user PATH | 		// %USERPROFILE% is allowed, but only for user PATH | ||||||
| 		// https://superuser.com/a/442163/73857 | 		// https://superuser.com/a/442163/73857 | ||||||
| 		homeentry = `%USERPROFILE%` + pathentry[len(home):] | 		homeentry = `%USERPROFILE%` + absentry[len(home):] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if absentry == pathentry { | 	if absentry == pathentry { | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| // +build windows,unsafe | // +build windows,!nounsafe | ||||||
| 
 | 
 | ||||||
| package winpath | package winpath | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -29,12 +29,6 @@ func add(p string) (bool, error) { | |||||||
| 		return false, nil | 		return false, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	k, err := registry.OpenKey(registry.CURRENT_USER, `Environment`, registry.SET_VALUE) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	defer k.Close() |  | ||||||
| 
 |  | ||||||
| 	cur = append([]string{p}, cur...) | 	cur = append([]string{p}, cur...) | ||||||
| 	err = write(cur) | 	err = write(cur) | ||||||
| 	if nil != err { | 	if nil != err { | ||||||
| @ -63,7 +57,7 @@ func remove(p string) (bool, error) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = write(cur) | 	err = write(newpaths) | ||||||
| 	if nil != err { | 	if nil != err { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| @ -74,15 +68,15 @@ func remove(p string) (bool, error) { | |||||||
| func write(cur []string) error { | func write(cur []string) error { | ||||||
| 	// TODO --system to add to the system PATH rather than the user PATH | 	// TODO --system to add to the system PATH rather than the user PATH | ||||||
| 
 | 
 | ||||||
| 	k, err := registry.OpenKey(registry.CURRENT_USER, `Environment`, registry.QUERY_VALUE) | 	k, err := registry.OpenKey(registry.CURRENT_USER, `Environment`, registry.SET_VALUE) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return fmt.Errorf("Can't open HKCU Environment for writes: %s", err) | ||||||
| 	} | 	} | ||||||
| 	defer k.Close() | 	defer k.Close() | ||||||
| 
 | 
 | ||||||
| 	err = k.SetStringValue(`Path`, strings.Join(cur, string(os.PathListSeparator))) | 	err = k.SetStringValue(`Path`, strings.Join(cur, string(os.PathListSeparator))) | ||||||
| 	if nil != err { | 	if nil != err { | ||||||
| 		return err | 		return fmt.Errorf("Can't set HKCU Environment[Path]: %s", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = k.Close() | 	err = k.Close() | ||||||
| @ -104,7 +98,7 @@ func paths() ([]string, error) { | |||||||
| 	// TBH, it's a mess to do this on *nix systems. | 	// TBH, it's a mess to do this on *nix systems. | ||||||
| 	k, err := registry.OpenKey(registry.CURRENT_USER, `Environment`, registry.QUERY_VALUE) | 	k, err := registry.OpenKey(registry.CURRENT_USER, `Environment`, registry.QUERY_VALUE) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, fmt.Errorf("Can't open HKCU Environment for reads: %s", err) | ||||||
| 	} | 	} | ||||||
| 	defer k.Close() | 	defer k.Close() | ||||||
| 
 | 
 | ||||||
| @ -112,7 +106,7 @@ func paths() ([]string, error) { | |||||||
| 	// PATH, Path, path will all work. | 	// PATH, Path, path will all work. | ||||||
| 	s, _, err := k.GetStringValue("Path") | 	s, _, err := k.GetStringValue("Path") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, fmt.Errorf("Can't query HKCU Environment[Path]: %s", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// ";" on Windows | 	// ";" on Windows | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user