| // 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. | 
 |  | 
 | package os | 
 |  | 
 | import ( | 
 | 	"internal/syscall/windows" | 
 | 	"syscall" | 
 | 	"unicode/utf16" | 
 | 	"unsafe" | 
 | ) | 
 |  | 
 | func environForSysProcAttr(sys *syscall.SysProcAttr) (env []string, err error) { | 
 | 	if sys == nil || sys.Token == 0 { | 
 | 		return Environ(), nil | 
 | 	} | 
 | 	var block *uint16 | 
 | 	err = windows.CreateEnvironmentBlock(&block, sys.Token, false) | 
 | 	if err != nil { | 
 | 		return nil, err | 
 | 	} | 
 | 	defer windows.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 | 
 | } |