summaryrefslogtreecommitdiff
path: root/vendor/github.com/Microsoft/go-winio/internal
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/Microsoft/go-winio/internal')
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/fs/doc.go2
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/fs/fs.go262
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/fs/security.go12
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go61
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/socket/socket.go12
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go9
-rw-r--r--vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go132
7 files changed, 13 insertions, 477 deletions
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go b/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go
deleted file mode 100644
index 1f65388..0000000
--- a/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// This package contains Win32 filesystem functionality.
-package fs
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go b/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go
deleted file mode 100644
index 0cd9621..0000000
--- a/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go
+++ /dev/null
@@ -1,262 +0,0 @@
-//go:build windows
-
-package fs
-
-import (
- "golang.org/x/sys/windows"
-
- "github.com/Microsoft/go-winio/internal/stringbuffer"
-)
-
-//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go fs.go
-
-// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew
-//sys CreateFile(name string, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) [failretval==windows.InvalidHandle] = CreateFileW
-
-const NullHandle windows.Handle = 0
-
-// AccessMask defines standard, specific, and generic rights.
-//
-// Used with CreateFile and NtCreateFile (and co.).
-//
-// Bitmask:
-// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
-// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
-// +---------------+---------------+-------------------------------+
-// |G|G|G|G|Resvd|A| StandardRights| SpecificRights |
-// |R|W|E|A| |S| | |
-// +-+-------------+---------------+-------------------------------+
-//
-// GR Generic Read
-// GW Generic Write
-// GE Generic Exectue
-// GA Generic All
-// Resvd Reserved
-// AS Access Security System
-//
-// https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask
-//
-// https://learn.microsoft.com/en-us/windows/win32/secauthz/generic-access-rights
-//
-// https://learn.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants
-type AccessMask = windows.ACCESS_MASK
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- // Not actually any.
- //
- // For CreateFile: "query certain metadata such as file, directory, or device attributes without accessing that file or device"
- // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#parameters
- FILE_ANY_ACCESS AccessMask = 0
-
- GENERIC_READ AccessMask = 0x8000_0000
- GENERIC_WRITE AccessMask = 0x4000_0000
- GENERIC_EXECUTE AccessMask = 0x2000_0000
- GENERIC_ALL AccessMask = 0x1000_0000
- ACCESS_SYSTEM_SECURITY AccessMask = 0x0100_0000
-
- // Specific Object Access
- // from ntioapi.h
-
- FILE_READ_DATA AccessMask = (0x0001) // file & pipe
- FILE_LIST_DIRECTORY AccessMask = (0x0001) // directory
-
- FILE_WRITE_DATA AccessMask = (0x0002) // file & pipe
- FILE_ADD_FILE AccessMask = (0x0002) // directory
-
- FILE_APPEND_DATA AccessMask = (0x0004) // file
- FILE_ADD_SUBDIRECTORY AccessMask = (0x0004) // directory
- FILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004) // named pipe
-
- FILE_READ_EA AccessMask = (0x0008) // file & directory
- FILE_READ_PROPERTIES AccessMask = FILE_READ_EA
-
- FILE_WRITE_EA AccessMask = (0x0010) // file & directory
- FILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA
-
- FILE_EXECUTE AccessMask = (0x0020) // file
- FILE_TRAVERSE AccessMask = (0x0020) // directory
-
- FILE_DELETE_CHILD AccessMask = (0x0040) // directory
-
- FILE_READ_ATTRIBUTES AccessMask = (0x0080) // all
-
- FILE_WRITE_ATTRIBUTES AccessMask = (0x0100) // all
-
- FILE_ALL_ACCESS AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
- FILE_GENERIC_READ AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE)
- FILE_GENERIC_WRITE AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE)
- FILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE)
-
- SPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF
-
- // Standard Access
- // from ntseapi.h
-
- DELETE AccessMask = 0x0001_0000
- READ_CONTROL AccessMask = 0x0002_0000
- WRITE_DAC AccessMask = 0x0004_0000
- WRITE_OWNER AccessMask = 0x0008_0000
- SYNCHRONIZE AccessMask = 0x0010_0000
-
- STANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000
-
- STANDARD_RIGHTS_READ AccessMask = READ_CONTROL
- STANDARD_RIGHTS_WRITE AccessMask = READ_CONTROL
- STANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL
-
- STANDARD_RIGHTS_ALL AccessMask = 0x001F_0000
-)
-
-type FileShareMode uint32
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- FILE_SHARE_NONE FileShareMode = 0x00
- FILE_SHARE_READ FileShareMode = 0x01
- FILE_SHARE_WRITE FileShareMode = 0x02
- FILE_SHARE_DELETE FileShareMode = 0x04
- FILE_SHARE_VALID_FLAGS FileShareMode = 0x07
-)
-
-type FileCreationDisposition uint32
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- // from winbase.h
-
- CREATE_NEW FileCreationDisposition = 0x01
- CREATE_ALWAYS FileCreationDisposition = 0x02
- OPEN_EXISTING FileCreationDisposition = 0x03
- OPEN_ALWAYS FileCreationDisposition = 0x04
- TRUNCATE_EXISTING FileCreationDisposition = 0x05
-)
-
-// Create disposition values for NtCreate*
-type NTFileCreationDisposition uint32
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- // From ntioapi.h
-
- FILE_SUPERSEDE NTFileCreationDisposition = 0x00
- FILE_OPEN NTFileCreationDisposition = 0x01
- FILE_CREATE NTFileCreationDisposition = 0x02
- FILE_OPEN_IF NTFileCreationDisposition = 0x03
- FILE_OVERWRITE NTFileCreationDisposition = 0x04
- FILE_OVERWRITE_IF NTFileCreationDisposition = 0x05
- FILE_MAXIMUM_DISPOSITION NTFileCreationDisposition = 0x05
-)
-
-// CreateFile and co. take flags or attributes together as one parameter.
-// Define alias until we can use generics to allow both
-//
-// https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants
-type FileFlagOrAttribute uint32
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- // from winnt.h
-
- FILE_FLAG_WRITE_THROUGH FileFlagOrAttribute = 0x8000_0000
- FILE_FLAG_OVERLAPPED FileFlagOrAttribute = 0x4000_0000
- FILE_FLAG_NO_BUFFERING FileFlagOrAttribute = 0x2000_0000
- FILE_FLAG_RANDOM_ACCESS FileFlagOrAttribute = 0x1000_0000
- FILE_FLAG_SEQUENTIAL_SCAN FileFlagOrAttribute = 0x0800_0000
- FILE_FLAG_DELETE_ON_CLOSE FileFlagOrAttribute = 0x0400_0000
- FILE_FLAG_BACKUP_SEMANTICS FileFlagOrAttribute = 0x0200_0000
- FILE_FLAG_POSIX_SEMANTICS FileFlagOrAttribute = 0x0100_0000
- FILE_FLAG_OPEN_REPARSE_POINT FileFlagOrAttribute = 0x0020_0000
- FILE_FLAG_OPEN_NO_RECALL FileFlagOrAttribute = 0x0010_0000
- FILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000
-)
-
-// NtCreate* functions take a dedicated CreateOptions parameter.
-//
-// https://learn.microsoft.com/en-us/windows/win32/api/Winternl/nf-winternl-ntcreatefile
-//
-// https://learn.microsoft.com/en-us/windows/win32/devnotes/nt-create-named-pipe-file
-type NTCreateOptions uint32
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- // From ntioapi.h
-
- FILE_DIRECTORY_FILE NTCreateOptions = 0x0000_0001
- FILE_WRITE_THROUGH NTCreateOptions = 0x0000_0002
- FILE_SEQUENTIAL_ONLY NTCreateOptions = 0x0000_0004
- FILE_NO_INTERMEDIATE_BUFFERING NTCreateOptions = 0x0000_0008
-
- FILE_SYNCHRONOUS_IO_ALERT NTCreateOptions = 0x0000_0010
- FILE_SYNCHRONOUS_IO_NONALERT NTCreateOptions = 0x0000_0020
- FILE_NON_DIRECTORY_FILE NTCreateOptions = 0x0000_0040
- FILE_CREATE_TREE_CONNECTION NTCreateOptions = 0x0000_0080
-
- FILE_COMPLETE_IF_OPLOCKED NTCreateOptions = 0x0000_0100
- FILE_NO_EA_KNOWLEDGE NTCreateOptions = 0x0000_0200
- FILE_DISABLE_TUNNELING NTCreateOptions = 0x0000_0400
- FILE_RANDOM_ACCESS NTCreateOptions = 0x0000_0800
-
- FILE_DELETE_ON_CLOSE NTCreateOptions = 0x0000_1000
- FILE_OPEN_BY_FILE_ID NTCreateOptions = 0x0000_2000
- FILE_OPEN_FOR_BACKUP_INTENT NTCreateOptions = 0x0000_4000
- FILE_NO_COMPRESSION NTCreateOptions = 0x0000_8000
-)
-
-type FileSQSFlag = FileFlagOrAttribute
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- // from winbase.h
-
- SECURITY_ANONYMOUS FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16)
- SECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification << 16)
- SECURITY_IMPERSONATION FileSQSFlag = FileSQSFlag(SecurityImpersonation << 16)
- SECURITY_DELEGATION FileSQSFlag = FileSQSFlag(SecurityDelegation << 16)
-
- SECURITY_SQOS_PRESENT FileSQSFlag = 0x0010_0000
- SECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F_0000
-)
-
-// GetFinalPathNameByHandle flags
-//
-// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew#parameters
-type GetFinalPathFlag uint32
-
-//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
-const (
- GetFinalPathDefaultFlag GetFinalPathFlag = 0x0
-
- FILE_NAME_NORMALIZED GetFinalPathFlag = 0x0
- FILE_NAME_OPENED GetFinalPathFlag = 0x8
-
- VOLUME_NAME_DOS GetFinalPathFlag = 0x0
- VOLUME_NAME_GUID GetFinalPathFlag = 0x1
- VOLUME_NAME_NT GetFinalPathFlag = 0x2
- VOLUME_NAME_NONE GetFinalPathFlag = 0x4
-)
-
-// getFinalPathNameByHandle facilitates calling the Windows API GetFinalPathNameByHandle
-// with the given handle and flags. It transparently takes care of creating a buffer of the
-// correct size for the call.
-//
-// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew
-func GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) (string, error) {
- b := stringbuffer.NewWString()
- //TODO: can loop infinitely if Win32 keeps returning the same (or a larger) n?
- for {
- n, err := windows.GetFinalPathNameByHandle(h, b.Pointer(), b.Cap(), uint32(flags))
- if err != nil {
- return "", err
- }
- // If the buffer wasn't large enough, n will be the total size needed (including null terminator).
- // Resize and try again.
- if n > b.Cap() {
- b.ResizeTo(n)
- continue
- }
- // If the buffer is large enough, n will be the size not including the null terminator.
- // Convert to a Go string and return.
- return b.String(), nil
- }
-}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/security.go b/vendor/github.com/Microsoft/go-winio/internal/fs/security.go
deleted file mode 100644
index 81760ac..0000000
--- a/vendor/github.com/Microsoft/go-winio/internal/fs/security.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package fs
-
-// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level
-type SecurityImpersonationLevel int32 // C default enums underlying type is `int`, which is Go `int32`
-
-// Impersonation levels
-const (
- SecurityAnonymous SecurityImpersonationLevel = 0
- SecurityIdentification SecurityImpersonationLevel = 1
- SecurityImpersonation SecurityImpersonationLevel = 2
- SecurityDelegation SecurityImpersonationLevel = 3
-)
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go
deleted file mode 100644
index a94e234..0000000
--- a/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go
+++ /dev/null
@@ -1,61 +0,0 @@
-//go:build windows
-
-// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
-
-package fs
-
-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)
- errERROR_EINVAL error = syscall.EINVAL
-)
-
-// errnoErr returns common boxed Errno values, to prevent
-// allocations at runtime.
-func errnoErr(e syscall.Errno) error {
- switch e {
- case 0:
- return errERROR_EINVAL
- case errnoERROR_IO_PENDING:
- return errERROR_IO_PENDING
- }
- return e
-}
-
-var (
- modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
-
- procCreateFileW = modkernel32.NewProc("CreateFileW")
-)
-
-func CreateFile(name string, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) {
- var _p0 *uint16
- _p0, err = syscall.UTF16PtrFromString(name)
- if err != nil {
- return
- }
- return _CreateFile(_p0, access, mode, sa, createmode, attrs, templatefile)
-}
-
-func _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) {
- r0, _, e1 := syscall.SyscallN(procCreateFileW.Addr(), uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile))
- handle = windows.Handle(r0)
- if handle == windows.InvalidHandle {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go b/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
index 88580d9..39e8c05 100644
--- a/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
+++ b/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
@@ -100,8 +100,8 @@ func (f *runtimeFunc) Load() error {
(*byte)(unsafe.Pointer(&f.addr)),
uint32(unsafe.Sizeof(f.addr)),
&n,
- nil, // overlapped
- 0, // completionRoutine
+ nil, //overlapped
+ 0, //completionRoutine
)
})
return f.err
@@ -156,7 +156,9 @@ func connectEx(
bytesSent *uint32,
overlapped *windows.Overlapped,
) (err error) {
- r1, _, e1 := syscall.SyscallN(connectExFunc.addr,
+ // todo: after upgrading to 1.18, switch from syscall.Syscall9 to syscall.SyscallN
+ r1, _, e1 := syscall.Syscall9(connectExFunc.addr,
+ 7,
uintptr(s),
uintptr(name),
uintptr(namelen),
@@ -164,8 +166,8 @@ func connectEx(
uintptr(sendDataLen),
uintptr(unsafe.Pointer(bytesSent)),
uintptr(unsafe.Pointer(overlapped)),
- )
-
+ 0,
+ 0)
if r1 == 0 {
if e1 != 0 {
err = error(e1)
diff --git a/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
index e150412..6d2e1a9 100644
--- a/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
+++ b/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
@@ -33,6 +33,9 @@ func errnoErr(e syscall.Errno) error {
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
}
@@ -45,7 +48,7 @@ var (
)
func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) {
- r1, _, e1 := syscall.SyscallN(procbind.Addr(), uintptr(s), uintptr(name), uintptr(namelen))
+ r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
if r1 == socketError {
err = errnoErr(e1)
}
@@ -53,7 +56,7 @@ func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) {
}
func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {
- r1, _, e1 := syscall.SyscallN(procgetpeername.Addr(), uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
+ r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
if r1 == socketError {
err = errnoErr(e1)
}
@@ -61,7 +64,7 @@ func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err err
}
func getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {
- r1, _, e1 := syscall.SyscallN(procgetsockname.Addr(), uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
+ r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
if r1 == socketError {
err = errnoErr(e1)
}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go b/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go
deleted file mode 100644
index 42ebc01..0000000
--- a/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package stringbuffer
-
-import (
- "sync"
- "unicode/utf16"
-)
-
-// TODO: worth exporting and using in mkwinsyscall?
-
-// Uint16BufferSize is the buffer size in the pool, chosen somewhat arbitrarily to accommodate
-// large path strings:
-// MAX_PATH (260) + size of volume GUID prefix (49) + null terminator = 310.
-const MinWStringCap = 310
-
-// use *[]uint16 since []uint16 creates an extra allocation where the slice header
-// is copied to heap and then referenced via pointer in the interface header that sync.Pool
-// stores.
-var pathPool = sync.Pool{ // if go1.18+ adds Pool[T], use that to store []uint16 directly
- New: func() interface{} {
- b := make([]uint16, MinWStringCap)
- return &b
- },
-}
-
-func newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) }
-
-// freeBuffer copies the slice header data, and puts a pointer to that in the pool.
-// This avoids taking a pointer to the slice header in WString, which can be set to nil.
-func freeBuffer(b []uint16) { pathPool.Put(&b) }
-
-// WString is a wide string buffer ([]uint16) meant for storing UTF-16 encoded strings
-// for interacting with Win32 APIs.
-// Sizes are specified as uint32 and not int.
-//
-// It is not thread safe.
-type WString struct {
- // type-def allows casting to []uint16 directly, use struct to prevent that and allow adding fields in the future.
-
- // raw buffer
- b []uint16
-}
-
-// NewWString returns a [WString] allocated from a shared pool with an
-// initial capacity of at least [MinWStringCap].
-// Since the buffer may have been previously used, its contents are not guaranteed to be empty.
-//
-// The buffer should be freed via [WString.Free]
-func NewWString() *WString {
- return &WString{
- b: newBuffer(),
- }
-}
-
-func (b *WString) Free() {
- if b.empty() {
- return
- }
- freeBuffer(b.b)
- b.b = nil
-}
-
-// ResizeTo grows the buffer to at least c and returns the new capacity, freeing the
-// previous buffer back into pool.
-func (b *WString) ResizeTo(c uint32) uint32 {
- // already sufficient (or n is 0)
- if c <= b.Cap() {
- return b.Cap()
- }
-
- if c <= MinWStringCap {
- c = MinWStringCap
- }
- // allocate at-least double buffer size, as is done in [bytes.Buffer] and other places
- if c <= 2*b.Cap() {
- c = 2 * b.Cap()
- }
-
- b2 := make([]uint16, c)
- if !b.empty() {
- copy(b2, b.b)
- freeBuffer(b.b)
- }
- b.b = b2
- return c
-}
-
-// Buffer returns the underlying []uint16 buffer.
-func (b *WString) Buffer() []uint16 {
- if b.empty() {
- return nil
- }
- return b.b
-}
-
-// Pointer returns a pointer to the first uint16 in the buffer.
-// If the [WString.Free] has already been called, the pointer will be nil.
-func (b *WString) Pointer() *uint16 {
- if b.empty() {
- return nil
- }
- return &b.b[0]
-}
-
-// String returns the returns the UTF-8 encoding of the UTF-16 string in the buffer.
-//
-// It assumes that the data is null-terminated.
-func (b *WString) String() string {
- // Using [windows.UTF16ToString] would require importing "golang.org/x/sys/windows"
- // and would make this code Windows-only, which makes no sense.
- // So copy UTF16ToString code into here.
- // If other windows-specific code is added, switch to [windows.UTF16ToString]
-
- s := b.b
- for i, v := range s {
- if v == 0 {
- s = s[:i]
- break
- }
- }
- return string(utf16.Decode(s))
-}
-
-// Cap returns the underlying buffer capacity.
-func (b *WString) Cap() uint32 {
- if b.empty() {
- return 0
- }
- return b.cap()
-}
-
-func (b *WString) cap() uint32 { return uint32(cap(b.b)) }
-func (b *WString) empty() bool { return b == nil || b.cap() == 0 }