...

Source file src/os/env_windows.go

     1	// Copyright 2019 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	package os
     6	
     7	import (
     8		"internal/syscall/windows"
     9		"syscall"
    10		"unicode/utf16"
    11		"unsafe"
    12	)
    13	
    14	func environForSysProcAttr(sys *syscall.SysProcAttr) (env []string, err error) {
    15		if sys == nil || sys.Token == 0 {
    16			return Environ(), nil
    17		}
    18		var block *uint16
    19		err = windows.CreateEnvironmentBlock(&block, sys.Token, false)
    20		if err != nil {
    21			return nil, err
    22		}
    23		defer windows.DestroyEnvironmentBlock(block)
    24		blockp := uintptr(unsafe.Pointer(block))
    25		for {
    26			entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:]
    27			for i, v := range entry {
    28				if v == 0 {
    29					entry = entry[:i]
    30					break
    31				}
    32			}
    33			if len(entry) == 0 {
    34				break
    35			}
    36			env = append(env, string(utf16.Decode(entry)))
    37			blockp += 2 * (uintptr(len(entry)) + 1)
    38		}
    39		return
    40	}
    41	

View as plain text