diff options
| author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-31 17:37:20 +0100 |
|---|---|---|
| committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-02-26 18:23:16 +0000 |
| commit | ba9168bd07bfed6071e3eadcaae40b5481c52c24 (patch) | |
| tree | f3bc91445860c95f0ec11095ef415cdfbd275a51 /src/syscall/syscall_windows.go | |
| parent | f41460145ef6b75303e5f766a676274f456387d3 (diff) | |
| download | go-ba9168bd07bfed6071e3eadcaae40b5481c52c24.tar.xz | |
syscall: add support for proc thread attribute lists
This will allow us to pass additional attributes when starting
processes.
Updates #44011.
Change-Id: I4af365c5544a6d421830f247593ec970200e5e03
Reviewed-on: https://go-review.googlesource.com/c/go/+/288296
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Trust: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Diffstat (limited to 'src/syscall/syscall_windows.go')
| -rw-r--r-- | src/syscall/syscall_windows.go | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index ee5311b176..cc8dc487d3 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -284,6 +284,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. //sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW //sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW +//sys initializeProcThreadAttributeList(attrlist *_PROC_THREAD_ATTRIBUTE_LIST, attrcount uint32, flags uint32, size *uintptr) (err error) = InitializeProcThreadAttributeList +//sys deleteProcThreadAttributeList(attrlist *_PROC_THREAD_ATTRIBUTE_LIST) = DeleteProcThreadAttributeList +//sys updateProcThreadAttribute(attrlist *_PROC_THREAD_ATTRIBUTE_LIST, flags uint32, attr uintptr, value uintptr, size uintptr, prevvalue uintptr, returnedsize *uintptr) (err error) = UpdateProcThreadAttribute // syscall interface implementation for other packages @@ -1240,3 +1243,23 @@ func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overla func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) error { return postQueuedCompletionStatus(cphandle, qty, uintptr(key), overlapped) } + +// newProcThreadAttributeList allocates new PROC_THREAD_ATTRIBUTE_LIST, with +// the requested maximum number of attributes, which must be cleaned up by +// deleteProcThreadAttributeList. +func newProcThreadAttributeList(maxAttrCount uint32) (*_PROC_THREAD_ATTRIBUTE_LIST, error) { + var size uintptr + err := initializeProcThreadAttributeList(nil, maxAttrCount, 0, &size) + if err != ERROR_INSUFFICIENT_BUFFER { + if err == nil { + return nil, errorspkg.New("unable to query buffer size from InitializeProcThreadAttributeList") + } + return nil, err + } + al := (*_PROC_THREAD_ATTRIBUTE_LIST)(unsafe.Pointer(&make([]byte, size)[0])) + err = initializeProcThreadAttributeList(al, maxAttrCount, 0, &size) + if err != nil { + return nil, err + } + return al, nil +} |
