![dependabot[bot]](/assets/img/avatar_default.png)
Bumps the golang group with 5 updates: | Package | From | To | | --- | --- | --- | | [github.com/Microsoft/hcsshim](https://github.com/Microsoft/hcsshim) | `0.11.4` | `0.12.0` | | [github.com/alexflint/go-filemutex](https://github.com/alexflint/go-filemutex) | `1.2.0` | `1.3.0` | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.13.2` | `2.16.0` | | [github.com/onsi/gomega](https://github.com/onsi/gomega) | `1.30.0` | `1.31.1` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.15.0` | `0.17.0` | Updates `github.com/Microsoft/hcsshim` from 0.11.4 to 0.12.0 - [Release notes](https://github.com/Microsoft/hcsshim/releases) - [Commits](https://github.com/Microsoft/hcsshim/compare/v0.11.4...v0.12.0) Updates `github.com/alexflint/go-filemutex` from 1.2.0 to 1.3.0 - [Release notes](https://github.com/alexflint/go-filemutex/releases) - [Commits](https://github.com/alexflint/go-filemutex/compare/v1.2.0...v1.3.0) Updates `github.com/onsi/ginkgo/v2` from 2.13.2 to 2.16.0 - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.13.2...v2.16.0) Updates `github.com/onsi/gomega` from 1.30.0 to 1.31.1 - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.30.0...v1.31.1) Updates `golang.org/x/sys` from 0.15.0 to 0.17.0 - [Commits](https://github.com/golang/sys/compare/v0.15.0...v0.17.0) --- updated-dependencies: - dependency-name: github.com/Microsoft/hcsshim dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/alexflint/go-filemutex dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] <support@github.com>
84 lines
2.5 KiB
Go
84 lines
2.5 KiB
Go
//go:build windows
|
|
|
|
package winapi
|
|
|
|
import (
|
|
"errors"
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
// Uint16BufferToSlice wraps a uint16 pointer-and-length into a slice
|
|
// for easier interop with Go APIs
|
|
func Uint16BufferToSlice(buffer *uint16, bufferLength int) (result []uint16) {
|
|
result = unsafe.Slice(buffer, bufferLength)
|
|
return
|
|
}
|
|
|
|
// UnicodeString corresponds to UNICODE_STRING win32 struct defined here
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_unicode_string
|
|
type UnicodeString struct {
|
|
Length uint16
|
|
MaximumLength uint16
|
|
Buffer *uint16
|
|
}
|
|
|
|
// NTSTRSAFE_UNICODE_STRING_MAX_CCH is a constant defined in ntstrsafe.h. This value
|
|
// denotes the maximum number of wide chars a path can have.
|
|
const NTSTRSAFE_UNICODE_STRING_MAX_CCH = 32767
|
|
|
|
// String converts a UnicodeString to a golang string
|
|
func (uni UnicodeString) String() string {
|
|
// UnicodeString is not guaranteed to be null terminated, therefore
|
|
// use the UnicodeString's Length field
|
|
return windows.UTF16ToString(Uint16BufferToSlice(uni.Buffer, int(uni.Length/2)))
|
|
}
|
|
|
|
// NewUnicodeString allocates a new UnicodeString and copies `s` into
|
|
// the buffer of the new UnicodeString.
|
|
func NewUnicodeString(s string) (*UnicodeString, error) {
|
|
buf, err := windows.UTF16FromString(s)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(buf) > NTSTRSAFE_UNICODE_STRING_MAX_CCH {
|
|
return nil, syscall.ENAMETOOLONG
|
|
}
|
|
|
|
uni := &UnicodeString{
|
|
// The length is in bytes and should not include the trailing null character.
|
|
Length: uint16((len(buf) - 1) * 2),
|
|
MaximumLength: uint16((len(buf) - 1) * 2),
|
|
Buffer: &buf[0],
|
|
}
|
|
return uni, nil
|
|
}
|
|
|
|
// ConvertStringSetToSlice is a helper function used to convert the contents of
|
|
// `buf` into a string slice. `buf` contains a set of null terminated strings
|
|
// with an additional null at the end to indicate the end of the set.
|
|
func ConvertStringSetToSlice(buf []byte) ([]string, error) {
|
|
var results []string
|
|
prev := 0
|
|
for i := range buf {
|
|
if buf[i] == 0 {
|
|
if prev == i {
|
|
// found two null characters in a row, return result
|
|
return results, nil
|
|
}
|
|
results = append(results, string(buf[prev:i]))
|
|
prev = i + 1
|
|
}
|
|
}
|
|
return nil, errors.New("string set malformed: missing null terminator at end of buffer")
|
|
}
|
|
|
|
// ParseUtf16LE parses a UTF-16LE byte array into a string (without passing
|
|
// through a uint16 or rune array).
|
|
func ParseUtf16LE(b []byte) string {
|
|
return windows.UTF16PtrToString((*uint16)(unsafe.Pointer(&b[0])))
|
|
}
|