aboutsummaryrefslogtreecommitdiffstats
path: root/tun/wintun/setupapi
diff options
context:
space:
mode:
authorSimon Rozman <simon@rozman.si>2020-07-22 09:15:49 +0200
committerSimon Rozman <simon@rozman.si>2020-11-07 12:46:35 +0100
commit3e08b8aee0f6ae038f6316ca1bb84e5214db318f (patch)
tree34681cb00b6b22bded95e0df6ed271de18983646 /tun/wintun/setupapi
parentdevice: format a few things (diff)
downloadwireguard-go-3e08b8aee0f6ae038f6316ca1bb84e5214db318f.tar.xz
wireguard-go-3e08b8aee0f6ae038f6316ca1bb84e5214db318f.zip
wintun: migrate to wintun.dll API
Rather than having every application using Wintun driver reinvent the wheel, the Wintun device/adapter/interface management has been moved from wireguard-go to wintun.dll deployed with Wintun itself. Signed-off-by: Simon Rozman <simon@rozman.si>
Diffstat (limited to 'tun/wintun/setupapi')
-rw-r--r--tun/wintun/setupapi/mksyscall.go8
-rw-r--r--tun/wintun/setupapi/setupapi_windows.go506
-rw-r--r--tun/wintun/setupapi/setupapi_windows_test.go488
-rw-r--r--tun/wintun/setupapi/types32_windows.go13
-rw-r--r--tun/wintun/setupapi/types64_windows.go13
-rw-r--r--tun/wintun/setupapi/types_windows.go568
-rw-r--r--tun/wintun/setupapi/zsetupapi_windows.go398
-rw-r--r--tun/wintun/setupapi/zsetupapi_windows_test.go20
8 files changed, 0 insertions, 2014 deletions
diff --git a/tun/wintun/setupapi/mksyscall.go b/tun/wintun/setupapi/mksyscall.go
deleted file mode 100644
index 234851c..0000000
--- a/tun/wintun/setupapi/mksyscall.go
+++ /dev/null
@@ -1,8 +0,0 @@
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsetupapi_windows.go setupapi_windows.go
diff --git a/tun/wintun/setupapi/setupapi_windows.go b/tun/wintun/setupapi/setupapi_windows.go
deleted file mode 100644
index a804dd8..0000000
--- a/tun/wintun/setupapi/setupapi_windows.go
+++ /dev/null
@@ -1,506 +0,0 @@
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-import (
- "encoding/binary"
- "fmt"
- "runtime"
- "unsafe"
-
- "golang.org/x/sys/windows"
- "golang.org/x/sys/windows/registry"
-)
-
-//sys setupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr, machineName *uint16, reserved uintptr) (handle DevInfo, err error) [failretval==DevInfo(windows.InvalidHandle)] = setupapi.SetupDiCreateDeviceInfoListExW
-
-// SetupDiCreateDeviceInfoListEx function creates an empty device information set on a remote or a local computer and optionally associates the set with a device setup class.
-func SetupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr, machineName string) (deviceInfoSet DevInfo, err error) {
- var machineNameUTF16 *uint16
- if machineName != "" {
- machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
- if err != nil {
- return
- }
- }
- return setupDiCreateDeviceInfoListEx(classGUID, hwndParent, machineNameUTF16, 0)
-}
-
-//sys setupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo, deviceInfoSetDetailData *DevInfoListDetailData) (err error) = setupapi.SetupDiGetDeviceInfoListDetailW
-
-// SetupDiGetDeviceInfoListDetail function retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name.
-func SetupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo) (deviceInfoSetDetailData *DevInfoListDetailData, err error) {
- data := &DevInfoListDetailData{}
- data.size = sizeofDevInfoListDetailData
-
- return data, setupDiGetDeviceInfoListDetail(deviceInfoSet, data)
-}
-
-// DeviceInfoListDetail method retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name.
-func (deviceInfoSet DevInfo) DeviceInfoListDetail() (*DevInfoListDetailData, error) {
- return SetupDiGetDeviceInfoListDetail(deviceInfoSet)
-}
-
-//sys setupDiCreateDeviceInfo(deviceInfoSet DevInfo, DeviceName *uint16, classGUID *windows.GUID, DeviceDescription *uint16, hwndParent uintptr, CreationFlags DICD, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiCreateDeviceInfoW
-
-// SetupDiCreateDeviceInfo function creates a new device information element and adds it as a new member to the specified device information set.
-func SetupDiCreateDeviceInfo(deviceInfoSet DevInfo, deviceName string, classGUID *windows.GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (deviceInfoData *DevInfoData, err error) {
- deviceNameUTF16, err := windows.UTF16PtrFromString(deviceName)
- if err != nil {
- return
- }
-
- var deviceDescriptionUTF16 *uint16
- if deviceDescription != "" {
- deviceDescriptionUTF16, err = windows.UTF16PtrFromString(deviceDescription)
- if err != nil {
- return
- }
- }
-
- data := &DevInfoData{}
- data.size = uint32(unsafe.Sizeof(*data))
-
- return data, setupDiCreateDeviceInfo(deviceInfoSet, deviceNameUTF16, classGUID, deviceDescriptionUTF16, hwndParent, creationFlags, data)
-}
-
-// CreateDeviceInfo method creates a new device information element and adds it as a new member to the specified device information set.
-func (deviceInfoSet DevInfo) CreateDeviceInfo(deviceName string, classGUID *windows.GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (*DevInfoData, error) {
- return SetupDiCreateDeviceInfo(deviceInfoSet, deviceName, classGUID, deviceDescription, hwndParent, creationFlags)
-}
-
-//sys setupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex uint32, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiEnumDeviceInfo
-
-// SetupDiEnumDeviceInfo function returns a DevInfoData structure that specifies a device information element in a device information set.
-func SetupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex int) (*DevInfoData, error) {
- data := &DevInfoData{}
- data.size = uint32(unsafe.Sizeof(*data))
-
- return data, setupDiEnumDeviceInfo(deviceInfoSet, uint32(memberIndex), data)
-}
-
-// EnumDeviceInfo method returns a DevInfoData structure that specifies a device information element in a device information set.
-func (deviceInfoSet DevInfo) EnumDeviceInfo(memberIndex int) (*DevInfoData, error) {
- return SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex)
-}
-
-// SetupDiDestroyDeviceInfoList function deletes a device information set and frees all associated memory.
-//sys SetupDiDestroyDeviceInfoList(deviceInfoSet DevInfo) (err error) = setupapi.SetupDiDestroyDeviceInfoList
-
-// Close method deletes a device information set and frees all associated memory.
-func (deviceInfoSet DevInfo) Close() error {
- return SetupDiDestroyDeviceInfoList(deviceInfoSet)
-}
-
-//sys SetupDiBuildDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) = setupapi.SetupDiBuildDriverInfoList
-
-// BuildDriverInfoList method builds a list of drivers that is associated with a specific device or with the global class driver list for a device information set.
-func (deviceInfoSet DevInfo) BuildDriverInfoList(deviceInfoData *DevInfoData, driverType SPDIT) error {
- return SetupDiBuildDriverInfoList(deviceInfoSet, deviceInfoData, driverType)
-}
-
-//sys SetupDiCancelDriverInfoSearch(deviceInfoSet DevInfo) (err error) = setupapi.SetupDiCancelDriverInfoSearch
-
-// CancelDriverInfoSearch method cancels a driver list search that is currently in progress in a different thread.
-func (deviceInfoSet DevInfo) CancelDriverInfoSearch() error {
- return SetupDiCancelDriverInfoSearch(deviceInfoSet)
-}
-
-//sys setupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex uint32, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiEnumDriverInfoW
-
-// SetupDiEnumDriverInfo function enumerates the members of a driver list.
-func SetupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex int) (*DrvInfoData, error) {
- data := &DrvInfoData{}
- data.size = uint32(unsafe.Sizeof(*data))
-
- return data, setupDiEnumDriverInfo(deviceInfoSet, deviceInfoData, driverType, uint32(memberIndex), data)
-}
-
-// EnumDriverInfo method enumerates the members of a driver list.
-func (deviceInfoSet DevInfo) EnumDriverInfo(deviceInfoData *DevInfoData, driverType SPDIT, memberIndex int) (*DrvInfoData, error) {
- return SetupDiEnumDriverInfo(deviceInfoSet, deviceInfoData, driverType, memberIndex)
-}
-
-//sys setupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiGetSelectedDriverW
-
-// SetupDiGetSelectedDriver function retrieves the selected driver for a device information set or a particular device information element.
-func SetupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (*DrvInfoData, error) {
- data := &DrvInfoData{}
- data.size = uint32(unsafe.Sizeof(*data))
-
- return data, setupDiGetSelectedDriver(deviceInfoSet, deviceInfoData, data)
-}
-
-// SelectedDriver method retrieves the selected driver for a device information set or a particular device information element.
-func (deviceInfoSet DevInfo) SelectedDriver(deviceInfoData *DevInfoData) (*DrvInfoData, error) {
- return SetupDiGetSelectedDriver(deviceInfoSet, deviceInfoData)
-}
-
-//sys SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiSetSelectedDriverW
-
-// SetSelectedDriver method sets, or resets, the selected driver for a device information element or the selected class driver for a device information set.
-func (deviceInfoSet DevInfo) SetSelectedDriver(deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) error {
- return SetupDiSetSelectedDriver(deviceInfoSet, deviceInfoData, driverInfoData)
-}
-
-//sys setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *DrvInfoDetailData, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDriverInfoDetailW
-
-// SetupDiGetDriverInfoDetail function retrieves driver information detail for a device information set or a particular device information element in the device information set.
-func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) {
- reqSize := uint32(2048)
- for {
- buf := make([]byte, reqSize)
- data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
- data.size = sizeofDrvInfoDetailData
- err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, uint32(len(buf)), &reqSize)
- if err == windows.ERROR_INSUFFICIENT_BUFFER {
- continue
- }
- if err != nil {
- return nil, err
- }
- data.size = reqSize
- return data, nil
- }
-}
-
-// DriverInfoDetail method retrieves driver information detail for a device information set or a particular device information element in the device information set.
-func (deviceInfoSet DevInfo) DriverInfoDetail(deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) {
- return SetupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData)
-}
-
-//sys SetupDiDestroyDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) = setupapi.SetupDiDestroyDriverInfoList
-
-// DestroyDriverInfoList method deletes a driver list.
-func (deviceInfoSet DevInfo) DestroyDriverInfoList(deviceInfoData *DevInfoData, driverType SPDIT) error {
- return SetupDiDestroyDriverInfoList(deviceInfoSet, deviceInfoData, driverType)
-}
-
-//sys setupDiGetClassDevsEx(classGUID *windows.GUID, Enumerator *uint16, hwndParent uintptr, Flags DIGCF, deviceInfoSet DevInfo, machineName *uint16, reserved uintptr) (handle DevInfo, err error) [failretval==DevInfo(windows.InvalidHandle)] = setupapi.SetupDiGetClassDevsExW
-
-// SetupDiGetClassDevsEx function returns a handle to a device information set that contains requested device information elements for a local or a remote computer.
-func SetupDiGetClassDevsEx(classGUID *windows.GUID, enumerator string, hwndParent uintptr, flags DIGCF, deviceInfoSet DevInfo, machineName string) (handle DevInfo, err error) {
- var enumeratorUTF16 *uint16
- if enumerator != "" {
- enumeratorUTF16, err = windows.UTF16PtrFromString(enumerator)
- if err != nil {
- return
- }
- }
- var machineNameUTF16 *uint16
- if machineName != "" {
- machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
- if err != nil {
- return
- }
- }
- return setupDiGetClassDevsEx(classGUID, enumeratorUTF16, hwndParent, flags, deviceInfoSet, machineNameUTF16, 0)
-}
-
-// SetupDiCallClassInstaller function calls the appropriate class installer, and any registered co-installers, with the specified installation request (DIF code).
-//sys SetupDiCallClassInstaller(installFunction DI_FUNCTION, deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiCallClassInstaller
-
-// CallClassInstaller member calls the appropriate class installer, and any registered co-installers, with the specified installation request (DIF code).
-func (deviceInfoSet DevInfo) CallClassInstaller(installFunction DI_FUNCTION, deviceInfoData *DevInfoData) error {
- return SetupDiCallClassInstaller(installFunction, deviceInfoSet, deviceInfoData)
-}
-
-//sys setupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (key windows.Handle, err error) [failretval==windows.InvalidHandle] = setupapi.SetupDiOpenDevRegKey
-
-// SetupDiOpenDevRegKey function opens a registry key for device-specific configuration information.
-func SetupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, scope DICS_FLAG, hwProfile uint32, keyType DIREG, samDesired uint32) (registry.Key, error) {
- handle, err := setupDiOpenDevRegKey(deviceInfoSet, deviceInfoData, scope, hwProfile, keyType, samDesired)
- return registry.Key(handle), err
-}
-
-// OpenDevRegKey method opens a registry key for device-specific configuration information.
-func (deviceInfoSet DevInfo) OpenDevRegKey(DeviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (registry.Key, error) {
- return SetupDiOpenDevRegKey(deviceInfoSet, DeviceInfoData, Scope, HwProfile, KeyType, samDesired)
-}
-
-//sys setupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyRegDataType *uint32, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceRegistryPropertyW
-
-// SetupDiGetDeviceRegistryProperty function retrieves a specified Plug and Play device property.
-func SetupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP) (value interface{}, err error) {
- reqSize := uint32(256)
- for {
- var dataType uint32
- buf := make([]byte, reqSize)
- err = setupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &dataType, &buf[0], uint32(len(buf)), &reqSize)
- if err == windows.ERROR_INSUFFICIENT_BUFFER {
- continue
- }
- if err != nil {
- return
- }
- return getRegistryValue(buf[:reqSize], dataType)
- }
-}
-
-func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
- switch dataType {
- case windows.REG_SZ:
- ret := windows.UTF16ToString(bufToUTF16(buf))
- runtime.KeepAlive(buf)
- return ret, nil
- case windows.REG_EXPAND_SZ:
- ret, err := registry.ExpandString(windows.UTF16ToString(bufToUTF16(buf)))
- runtime.KeepAlive(buf)
- return ret, err
- case windows.REG_BINARY:
- return buf, nil
- case windows.REG_DWORD_LITTLE_ENDIAN:
- return binary.LittleEndian.Uint32(buf), nil
- case windows.REG_DWORD_BIG_ENDIAN:
- return binary.BigEndian.Uint32(buf), nil
- case windows.REG_MULTI_SZ:
- bufW := bufToUTF16(buf)
- a := []string{}
- for i := 0; i < len(bufW); {
- j := i + wcslen(bufW[i:])
- if i < j {
- a = append(a, windows.UTF16ToString(bufW[i:j]))
- }
- i = j + 1
- }
- runtime.KeepAlive(buf)
- return a, nil
- case windows.REG_QWORD_LITTLE_ENDIAN:
- return binary.LittleEndian.Uint64(buf), nil
- default:
- return nil, fmt.Errorf("Unsupported registry value type: %v", dataType)
- }
-}
-
-// bufToUTF16 function reinterprets []byte buffer as []uint16
-func bufToUTF16(buf []byte) []uint16 {
- sl := struct {
- addr *uint16
- len int
- cap int
- }{(*uint16)(unsafe.Pointer(&buf[0])), len(buf) / 2, cap(buf) / 2}
- return *(*[]uint16)(unsafe.Pointer(&sl))
-}
-
-// utf16ToBuf function reinterprets []uint16 as []byte
-func utf16ToBuf(buf []uint16) []byte {
- sl := struct {
- addr *byte
- len int
- cap int
- }{(*byte)(unsafe.Pointer(&buf[0])), len(buf) * 2, cap(buf) * 2}
- return *(*[]byte)(unsafe.Pointer(&sl))
-}
-
-func wcslen(str []uint16) int {
- for i := 0; i < len(str); i++ {
- if str[i] == 0 {
- return i
- }
- }
- return len(str)
-}
-
-// DeviceRegistryProperty method retrieves a specified Plug and Play device property.
-func (deviceInfoSet DevInfo) DeviceRegistryProperty(deviceInfoData *DevInfoData, property SPDRP) (interface{}, error) {
- return SetupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property)
-}
-
-//sys setupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffer *byte, propertyBufferSize uint32) (err error) = setupapi.SetupDiSetDeviceRegistryPropertyW
-
-// SetupDiSetDeviceRegistryProperty function sets a Plug and Play device property for a device.
-func SetupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffers []byte) error {
- return setupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &propertyBuffers[0], uint32(len(propertyBuffers)))
-}
-
-// SetDeviceRegistryProperty function sets a Plug and Play device property for a device.
-func (deviceInfoSet DevInfo) SetDeviceRegistryProperty(deviceInfoData *DevInfoData, property SPDRP, propertyBuffers []byte) error {
- return SetupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, propertyBuffers)
-}
-
-// SetDeviceRegistryPropertyString method sets a Plug and Play device property string for a device.
-func (deviceInfoSet DevInfo) SetDeviceRegistryPropertyString(deviceInfoData *DevInfoData, property SPDRP, str string) error {
- str16, err := windows.UTF16FromString(str)
- if err != nil {
- return err
- }
- err = SetupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, utf16ToBuf(append(str16, 0)))
- runtime.KeepAlive(str16)
- return err
-}
-
-//sys setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) = setupapi.SetupDiGetDeviceInstallParamsW
-
-// SetupDiGetDeviceInstallParams function retrieves device installation parameters for a device information set or a particular device information element.
-func SetupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (*DevInstallParams, error) {
- params := &DevInstallParams{}
- params.size = uint32(unsafe.Sizeof(*params))
-
- return params, setupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData, params)
-}
-
-// DeviceInstallParams method retrieves device installation parameters for a device information set or a particular device information element.
-func (deviceInfoSet DevInfo) DeviceInstallParams(deviceInfoData *DevInfoData) (*DevInstallParams, error) {
- return SetupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData)
-}
-
-//sys setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceInstanceIdW
-
-// SetupDiGetDeviceInstanceId function retrieves the instance ID of the device.
-func SetupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (string, error) {
- reqSize := uint32(1024)
- for {
- buf := make([]uint16, reqSize)
- err := setupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData, &buf[0], uint32(len(buf)), &reqSize)
- if err == windows.ERROR_INSUFFICIENT_BUFFER {
- continue
- }
- if err != nil {
- return "", err
- }
- return windows.UTF16ToString(buf), nil
- }
-}
-
-// DeviceInstanceID method retrieves the instance ID of the device.
-func (deviceInfoSet DevInfo) DeviceInstanceID(deviceInfoData *DevInfoData) (string, error) {
- return SetupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData)
-}
-
-// SetupDiGetClassInstallParams function retrieves class installation parameters for a device information set or a particular device information element.
-//sys SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetClassInstallParamsW
-
-// ClassInstallParams method retrieves class installation parameters for a device information set or a particular device information element.
-func (deviceInfoSet DevInfo) ClassInstallParams(deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) error {
- return SetupDiGetClassInstallParams(deviceInfoSet, deviceInfoData, classInstallParams, classInstallParamsSize, requiredSize)
-}
-
-//sys SetupDiSetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) = setupapi.SetupDiSetDeviceInstallParamsW
-
-// SetDeviceInstallParams member sets device installation parameters for a device information set or a particular device information element.
-func (deviceInfoSet DevInfo) SetDeviceInstallParams(deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) error {
- return SetupDiSetDeviceInstallParams(deviceInfoSet, deviceInfoData, deviceInstallParams)
-}
-
-// SetupDiSetClassInstallParams function sets or clears class install parameters for a device information set or a particular device information element.
-//sys SetupDiSetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) (err error) = setupapi.SetupDiSetClassInstallParamsW
-
-// SetClassInstallParams method sets or clears class install parameters for a device information set or a particular device information element.
-func (deviceInfoSet DevInfo) SetClassInstallParams(deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) error {
- return SetupDiSetClassInstallParams(deviceInfoSet, deviceInfoData, classInstallParams, classInstallParamsSize)
-}
-
-//sys setupDiClassNameFromGuidEx(classGUID *windows.GUID, className *uint16, classNameSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) = setupapi.SetupDiClassNameFromGuidExW
-
-// SetupDiClassNameFromGuidEx function retrieves the class name associated with a class GUID. The class can be installed on a local or remote computer.
-func SetupDiClassNameFromGuidEx(classGUID *windows.GUID, machineName string) (className string, err error) {
- var classNameUTF16 [MAX_CLASS_NAME_LEN]uint16
-
- var machineNameUTF16 *uint16
- if machineName != "" {
- machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
- if err != nil {
- return
- }
- }
-
- err = setupDiClassNameFromGuidEx(classGUID, &classNameUTF16[0], MAX_CLASS_NAME_LEN, nil, machineNameUTF16, 0)
- if err != nil {
- return
- }
-
- className = windows.UTF16ToString(classNameUTF16[:])
- return
-}
-
-//sys setupDiClassGuidsFromNameEx(className *uint16, classGuidList *windows.GUID, classGuidListSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) = setupapi.SetupDiClassGuidsFromNameExW
-
-// SetupDiClassGuidsFromNameEx function retrieves the GUIDs associated with the specified class name. This resulting list contains the classes currently installed on a local or remote computer.
-func SetupDiClassGuidsFromNameEx(className string, machineName string) ([]windows.GUID, error) {
- classNameUTF16, err := windows.UTF16PtrFromString(className)
- if err != nil {
- return nil, err
- }
-
- var machineNameUTF16 *uint16
- if machineName != "" {
- machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
- if err != nil {
- return nil, err
- }
- }
-
- reqSize := uint32(4)
- for {
- buf := make([]windows.GUID, reqSize)
- err = setupDiClassGuidsFromNameEx(classNameUTF16, &buf[0], uint32(len(buf)), &reqSize, machineNameUTF16, 0)
- if err == windows.ERROR_INSUFFICIENT_BUFFER {
- continue
- }
- if err != nil {
- return nil, err
- }
- return buf[:reqSize], nil
- }
-}
-
-//sys setupDiGetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiGetSelectedDevice
-
-// SetupDiGetSelectedDevice function retrieves the selected device information element in a device information set.
-func SetupDiGetSelectedDevice(deviceInfoSet DevInfo) (*DevInfoData, error) {
- data := &DevInfoData{}
- data.size = uint32(unsafe.Sizeof(*data))
-
- return data, setupDiGetSelectedDevice(deviceInfoSet, data)
-}
-
-// SelectedDevice method retrieves the selected device information element in a device information set.
-func (deviceInfoSet DevInfo) SelectedDevice() (*DevInfoData, error) {
- return SetupDiGetSelectedDevice(deviceInfoSet)
-}
-
-// SetupDiSetSelectedDevice function sets a device information element as the selected member of a device information set. This function is typically used by an installation wizard.
-//sys SetupDiSetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiSetSelectedDevice
-
-// SetSelectedDevice method sets a device information element as the selected member of a device information set. This function is typically used by an installation wizard.
-func (deviceInfoSet DevInfo) SetSelectedDevice(deviceInfoData *DevInfoData) error {
- return SetupDiSetSelectedDevice(deviceInfoSet, deviceInfoData)
-}
-
-//sys cm_Get_Device_Interface_List_Size(len *uint32, interfaceClass *windows.GUID, deviceID *uint16, flags uint32) (ret uint32) = CfgMgr32.CM_Get_Device_Interface_List_SizeW
-//sys cm_Get_Device_Interface_List(interfaceClass *windows.GUID, deviceID *uint16, buffer *uint16, bufferLen uint32, flags uint32) (ret uint32) = CfgMgr32.CM_Get_Device_Interface_ListW
-
-func CM_Get_Device_Interface_List(deviceID string, interfaceClass *windows.GUID, flags uint32) ([]string, error) {
- deviceID16, err := windows.UTF16PtrFromString(deviceID)
- if err != nil {
- return nil, err
- }
- var buf []uint16
- var buflen uint32
- for {
- if ret := cm_Get_Device_Interface_List_Size(&buflen, interfaceClass, deviceID16, flags); ret != CR_SUCCESS {
- return nil, fmt.Errorf("CfgMgr error: 0x%x", ret)
- }
- buf = make([]uint16, buflen)
- if ret := cm_Get_Device_Interface_List(interfaceClass, deviceID16, &buf[0], buflen, flags); ret == CR_SUCCESS {
- break
- } else if ret != CR_BUFFER_SMALL {
- return nil, fmt.Errorf("CfgMgr error: 0x%x", ret)
- }
- }
- var interfaces []string
- for i := 0; i < len(buf); {
- j := i + wcslen(buf[i:])
- if i < j {
- interfaces = append(interfaces, windows.UTF16ToString(buf[i:j]))
- }
- i = j + 1
- }
- if interfaces == nil {
- return nil, fmt.Errorf("no interfaces found")
- }
- return interfaces, nil
-}
diff --git a/tun/wintun/setupapi/setupapi_windows_test.go b/tun/wintun/setupapi/setupapi_windows_test.go
deleted file mode 100644
index b0afbc7..0000000
--- a/tun/wintun/setupapi/setupapi_windows_test.go
+++ /dev/null
@@ -1,488 +0,0 @@
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-import (
- "runtime"
- "strings"
- "testing"
-
- "golang.org/x/sys/windows"
-)
-
-var deviceClassNetGUID = windows.GUID{Data1: 0x4d36e972, Data2: 0xe325, Data3: 0x11ce, Data4: [8]byte{0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}
-var computerName string
-
-func init() {
- computerName, _ = windows.ComputerName()
-}
-
-func TestSetupDiCreateDeviceInfoListEx(t *testing.T) {
- devInfoList, err := SetupDiCreateDeviceInfoListEx(&deviceClassNetGUID, 0, "")
- if err != nil {
- t.Errorf("Error calling SetupDiCreateDeviceInfoListEx: %s", err.Error())
- } else {
- devInfoList.Close()
- }
-
- devInfoList, err = SetupDiCreateDeviceInfoListEx(&deviceClassNetGUID, 0, computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiCreateDeviceInfoListEx: %s", err.Error())
- } else {
- devInfoList.Close()
- }
-
- devInfoList, err = SetupDiCreateDeviceInfoListEx(nil, 0, "")
- if err != nil {
- t.Errorf("Error calling SetupDiCreateDeviceInfoListEx(nil): %s", err.Error())
- } else {
- devInfoList.Close()
- }
-}
-
-func TestSetupDiGetDeviceInfoListDetail(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- data, err := devInfoList.DeviceInfoListDetail()
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceInfoListDetail: %s", err.Error())
- } else {
- if data.ClassGUID != deviceClassNetGUID {
- t.Error("SetupDiGetDeviceInfoListDetail returned different class GUID")
- }
-
- if data.RemoteMachineHandle != windows.Handle(0) {
- t.Error("SetupDiGetDeviceInfoListDetail returned non-NULL remote machine handle")
- }
-
- if data.RemoteMachineName() != "" {
- t.Error("SetupDiGetDeviceInfoListDetail returned non-NULL remote machine name")
- }
- }
-
- devInfoList, err = SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- data, err = devInfoList.DeviceInfoListDetail()
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceInfoListDetail: %s", err.Error())
- } else {
- if data.ClassGUID != deviceClassNetGUID {
- t.Error("SetupDiGetDeviceInfoListDetail returned different class GUID")
- }
-
- if data.RemoteMachineHandle == windows.Handle(0) {
- t.Error("SetupDiGetDeviceInfoListDetail returned NULL remote machine handle")
- }
-
- if data.RemoteMachineName() != computerName {
- t.Error("SetupDiGetDeviceInfoListDetail returned different remote machine name")
- }
- }
-
- data = &DevInfoListDetailData{}
- data.SetRemoteMachineName("foobar")
- if data.RemoteMachineName() != "foobar" {
- t.Error("DevInfoListDetailData.(Get|Set)RemoteMachineName() differ")
- }
-}
-
-func TestSetupDiCreateDeviceInfo(t *testing.T) {
- devInfoList, err := SetupDiCreateDeviceInfoListEx(&deviceClassNetGUID, 0, computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiCreateDeviceInfoListEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- deviceClassNetName, err := SetupDiClassNameFromGuidEx(&deviceClassNetGUID, computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiClassNameFromGuidEx: %s", err.Error())
- }
-
- devInfoData, err := devInfoList.CreateDeviceInfo(deviceClassNetName, &deviceClassNetGUID, "This is a test device", 0, DICD_GENERATE_ID)
- if err != nil {
- // Access denied is expected, as the SetupDiCreateDeviceInfo() require elevation to succeed.
- if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_ACCESS_DENIED {
- t.Errorf("Error calling SetupDiCreateDeviceInfo: %s", err.Error())
- }
- } else if devInfoData.ClassGUID != deviceClassNetGUID {
- t.Error("SetupDiCreateDeviceInfo returned different class GUID")
- }
-}
-
-func TestSetupDiEnumDeviceInfo(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- for i := 0; true; i++ {
- data, err := devInfoList.EnumDeviceInfo(i)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- if data.ClassGUID != deviceClassNetGUID {
- t.Error("SetupDiEnumDeviceInfo returned different class GUID")
- }
-
- _, err = devInfoList.DeviceInstanceID(data)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceInstanceId: %s", err.Error())
- }
- }
-}
-
-func TestDevInfo_BuildDriverInfoList(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- for i := 0; true; i++ {
- deviceData, err := devInfoList.EnumDeviceInfo(i)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- const driverType SPDIT = SPDIT_COMPATDRIVER
- err = devInfoList.BuildDriverInfoList(deviceData, driverType)
- if err != nil {
- t.Errorf("Error calling SetupDiBuildDriverInfoList: %s", err.Error())
- }
- defer devInfoList.DestroyDriverInfoList(deviceData, driverType)
-
- var selectedDriverData *DrvInfoData
- for j := 0; true; j++ {
- driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, j)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- if driverData.DriverType == 0 {
- continue
- }
-
- if !driverData.IsNewer(windows.Filetime{}, 0) {
- t.Error("Driver should have non-zero date and version")
- }
- if !driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime}, 0) {
- t.Error("Driver should have non-zero date and version")
- }
- if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime + 1}, 0) {
- t.Error("Driver should report newer version on high-date-time")
- }
- if !driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime}, 0) {
- t.Error("Driver should have non-zero version")
- }
- if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime + 1}, 0) {
- t.Error("Driver should report newer version on low-date-time")
- }
- if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime}, driverData.DriverVersion) {
- t.Error("Driver should not be newer than itself")
- }
- if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime}, driverData.DriverVersion+1) {
- t.Error("Driver should report newer version on version")
- }
-
- err = devInfoList.SetSelectedDriver(deviceData, driverData)
- if err != nil {
- t.Errorf("Error calling SetupDiSetSelectedDriver: %s", err.Error())
- } else {
- selectedDriverData = driverData
- }
-
- driverDetailData, err := devInfoList.DriverInfoDetail(deviceData, driverData)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDriverInfoDetail: %s", err.Error())
- }
-
- if driverDetailData.IsCompatible("foobar-aab6e3a4-144e-4786-88d3-6cec361e1edd") {
- t.Error("Invalid HWID compatibitlity reported")
- }
- if !driverDetailData.IsCompatible(strings.ToUpper(driverDetailData.HardwareID())) {
- t.Error("HWID compatibitlity missed")
- }
- a := driverDetailData.CompatIDs()
- for k := range a {
- if !driverDetailData.IsCompatible(strings.ToUpper(a[k])) {
- t.Error("HWID compatibitlity missed")
- }
- }
- }
-
- selectedDriverData2, err := devInfoList.SelectedDriver(deviceData)
- if err != nil {
- t.Errorf("Error calling SetupDiGetSelectedDriver: %s", err.Error())
- } else if *selectedDriverData != *selectedDriverData2 {
- t.Error("SetupDiGetSelectedDriver should return driver selected with SetupDiSetSelectedDriver")
- }
- }
-
- data := &DrvInfoData{}
- data.SetDescription("foobar")
- if data.Description() != "foobar" {
- t.Error("DrvInfoData.(Get|Set)Description() differ")
- }
- data.SetMfgName("foobar")
- if data.MfgName() != "foobar" {
- t.Error("DrvInfoData.(Get|Set)MfgName() differ")
- }
- data.SetProviderName("foobar")
- if data.ProviderName() != "foobar" {
- t.Error("DrvInfoData.(Get|Set)ProviderName() differ")
- }
-}
-
-func TestSetupDiGetClassDevsEx(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "PCI", 0, DIGCF_PRESENT, DevInfo(0), computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- } else {
- devInfoList.Close()
- }
-
- devInfoList, err = SetupDiGetClassDevsEx(nil, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_PARAMETER {
- t.Errorf("SetupDiGetClassDevsEx(nil, ...) should fail with ERROR_INVALID_PARAMETER")
- }
- } else {
- devInfoList.Close()
- t.Errorf("SetupDiGetClassDevsEx(nil, ...) should fail")
- }
-}
-
-func TestSetupDiOpenDevRegKey(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- for i := 0; true; i++ {
- data, err := devInfoList.EnumDeviceInfo(i)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- key, err := devInfoList.OpenDevRegKey(data, DICS_FLAG_GLOBAL, 0, DIREG_DRV, windows.KEY_READ)
- if err != nil {
- t.Errorf("Error calling SetupDiOpenDevRegKey: %s", err.Error())
- }
- defer key.Close()
- }
-}
-
-func TestSetupDiGetDeviceRegistryProperty(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- for i := 0; true; i++ {
- data, err := devInfoList.EnumDeviceInfo(i)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- val, err := devInfoList.DeviceRegistryProperty(data, SPDRP_CLASS)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_CLASS): %s", err.Error())
- } else if class, ok := val.(string); !ok || strings.ToLower(class) != "net" {
- t.Errorf("SetupDiGetDeviceRegistryProperty(SPDRP_CLASS) should return \"Net\"")
- }
-
- val, err = devInfoList.DeviceRegistryProperty(data, SPDRP_CLASSGUID)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_CLASSGUID): %s", err.Error())
- } else if valStr, ok := val.(string); !ok {
- t.Errorf("SetupDiGetDeviceRegistryProperty(SPDRP_CLASSGUID) should return string")
- } else {
- classGUID, err := windows.GUIDFromString(valStr)
- if err != nil {
- t.Errorf("Error parsing GUID returned by SetupDiGetDeviceRegistryProperty(SPDRP_CLASSGUID): %s", err.Error())
- } else if classGUID != deviceClassNetGUID {
- t.Errorf("SetupDiGetDeviceRegistryProperty(SPDRP_CLASSGUID) should return %x", deviceClassNetGUID)
- }
- }
-
- val, err = devInfoList.DeviceRegistryProperty(data, SPDRP_COMPATIBLEIDS)
- if err != nil {
- // Some devices have no SPDRP_COMPATIBLEIDS.
- if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_DATA {
- t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_COMPATIBLEIDS): %s", err.Error())
- }
- }
-
- val, err = devInfoList.DeviceRegistryProperty(data, SPDRP_CONFIGFLAGS)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_CONFIGFLAGS): %s", err.Error())
- }
-
- val, err = devInfoList.DeviceRegistryProperty(data, SPDRP_DEVICE_POWER_DATA)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_DEVICE_POWER_DATA): %s", err.Error())
- }
- }
-}
-
-func TestSetupDiGetDeviceInstallParams(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- for i := 0; true; i++ {
- data, err := devInfoList.EnumDeviceInfo(i)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- _, err = devInfoList.DeviceInstallParams(data)
- if err != nil {
- t.Errorf("Error calling SetupDiGetDeviceInstallParams: %s", err.Error())
- }
- }
-
- params := &DevInstallParams{}
- params.SetDriverPath("foobar")
- if params.DriverPath() != "foobar" {
- t.Error("DevInstallParams.(Get|Set)DriverPath() differ")
- }
-}
-
-func TestSetupDiClassNameFromGuidEx(t *testing.T) {
- deviceClassNetName, err := SetupDiClassNameFromGuidEx(&deviceClassNetGUID, "")
- if err != nil {
- t.Errorf("Error calling SetupDiClassNameFromGuidEx: %s", err.Error())
- } else if strings.ToLower(deviceClassNetName) != "net" {
- t.Errorf("SetupDiClassNameFromGuidEx(%x) should return \"Net\"", deviceClassNetGUID)
- }
-
- deviceClassNetName, err = SetupDiClassNameFromGuidEx(&deviceClassNetGUID, computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiClassNameFromGuidEx: %s", err.Error())
- } else if strings.ToLower(deviceClassNetName) != "net" {
- t.Errorf("SetupDiClassNameFromGuidEx(%x) should return \"Net\"", deviceClassNetGUID)
- }
-
- _, err = SetupDiClassNameFromGuidEx(nil, "")
- if err != nil {
- if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_USER_BUFFER {
- t.Errorf("SetupDiClassNameFromGuidEx(nil) should fail with ERROR_INVALID_USER_BUFFER")
- }
- } else {
- t.Errorf("SetupDiClassNameFromGuidEx(nil) should fail")
- }
-}
-
-func TestSetupDiClassGuidsFromNameEx(t *testing.T) {
- ClassGUIDs, err := SetupDiClassGuidsFromNameEx("Net", "")
- if err != nil {
- t.Errorf("Error calling SetupDiClassGuidsFromNameEx: %s", err.Error())
- } else {
- found := false
- for i := range ClassGUIDs {
- if ClassGUIDs[i] == deviceClassNetGUID {
- found = true
- break
- }
- }
- if !found {
- t.Errorf("SetupDiClassGuidsFromNameEx(\"Net\") should return %x", deviceClassNetGUID)
- }
- }
-
- ClassGUIDs, err = SetupDiClassGuidsFromNameEx("foobar-34274a51-a6e6-45f0-80d6-c62be96dd5fe", computerName)
- if err != nil {
- t.Errorf("Error calling SetupDiClassGuidsFromNameEx: %s", err.Error())
- } else if len(ClassGUIDs) != 0 {
- t.Errorf("SetupDiClassGuidsFromNameEx(\"foobar-34274a51-a6e6-45f0-80d6-c62be96dd5fe\") should return an empty GUID set")
- }
-}
-
-func TestSetupDiGetSelectedDevice(t *testing.T) {
- devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
- if err != nil {
- t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
- }
- defer devInfoList.Close()
-
- for i := 0; true; i++ {
- data, err := devInfoList.EnumDeviceInfo(i)
- if err != nil {
- if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
- break
- }
- continue
- }
-
- err = devInfoList.SetSelectedDevice(data)
- if err != nil {
- t.Errorf("Error calling SetupDiSetSelectedDevice: %s", err.Error())
- }
-
- data2, err := devInfoList.SelectedDevice()
- if err != nil {
- t.Errorf("Error calling SetupDiGetSelectedDevice: %s", err.Error())
- } else if *data != *data2 {
- t.Error("SetupDiGetSelectedDevice returned different data than was set by SetupDiSetSelectedDevice")
- }
- }
-
- err = devInfoList.SetSelectedDevice(nil)
- if err != nil {
- if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_PARAMETER {
- t.Errorf("SetupDiSetSelectedDevice(nil) should fail with ERROR_INVALID_USER_BUFFER")
- }
- } else {
- t.Errorf("SetupDiSetSelectedDevice(nil) should fail")
- }
-}
-
-func TestUTF16ToBuf(t *testing.T) {
- buf := []uint16{0x0123, 0x4567, 0x89ab, 0xcdef}
- buf2 := utf16ToBuf(buf)
- if len(buf)*2 != len(buf2) ||
- cap(buf)*2 != cap(buf2) ||
- buf2[0] != 0x23 || buf2[1] != 0x01 ||
- buf2[2] != 0x67 || buf2[3] != 0x45 ||
- buf2[4] != 0xab || buf2[5] != 0x89 ||
- buf2[6] != 0xef || buf2[7] != 0xcd {
- t.Errorf("SetupDiSetSelectedDevice(nil) should fail with ERROR_INVALID_USER_BUFFER")
- }
- runtime.KeepAlive(buf)
-}
diff --git a/tun/wintun/setupapi/types32_windows.go b/tun/wintun/setupapi/types32_windows.go
deleted file mode 100644
index 0eaead6..0000000
--- a/tun/wintun/setupapi/types32_windows.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build 386 arm
-
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-const (
- sizeofDevInfoListDetailData uint32 = 550
- sizeofDrvInfoDetailData uint32 = 1570
-)
diff --git a/tun/wintun/setupapi/types64_windows.go b/tun/wintun/setupapi/types64_windows.go
deleted file mode 100644
index c815b8f..0000000
--- a/tun/wintun/setupapi/types64_windows.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build amd64 arm64
-
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-const (
- sizeofDevInfoListDetailData uint32 = 560
- sizeofDrvInfoDetailData uint32 = 1584
-)
diff --git a/tun/wintun/setupapi/types_windows.go b/tun/wintun/setupapi/types_windows.go
deleted file mode 100644
index 43e3f39..0000000
--- a/tun/wintun/setupapi/types_windows.go
+++ /dev/null
@@ -1,568 +0,0 @@
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-import (
- "strings"
- "unsafe"
-
- "golang.org/x/sys/windows"
-)
-
-const (
- MAX_DEVICE_ID_LEN = 200
- MAX_DEVNODE_ID_LEN = MAX_DEVICE_ID_LEN
- MAX_GUID_STRING_LEN = 39 // 38 chars + terminator null
- MAX_CLASS_NAME_LEN = 32
- MAX_PROFILE_LEN = 80
- MAX_CONFIG_VALUE = 9999
- MAX_INSTANCE_VALUE = 9999
- CONFIGMG_VERSION = 0x0400
-)
-
-//
-// Define maximum string length constants
-//
-const (
- ANYSIZE_ARRAY = 1
- LINE_LEN = 256 // Windows 9x-compatible maximum for displayable strings coming from a device INF.
- MAX_INF_STRING_LENGTH = 4096 // Actual maximum size of an INF string (including string substitutions).
- MAX_INF_SECTION_NAME_LENGTH = 255 // For Windows 9x compatibility, INF section names should be constrained to 32 characters.
- MAX_TITLE_LEN = 60
- MAX_INSTRUCTION_LEN = 256
- MAX_LABEL_LEN = 30
- MAX_SERVICE_NAME_LEN = 256
- MAX_SUBTITLE_LEN = 256
-)
-
-const (
- // SP_MAX_MACHINENAME_LENGTH defines maximum length of a machine name in the format expected by ConfigMgr32 CM_Connect_Machine (i.e., "\\\\MachineName\0").
- SP_MAX_MACHINENAME_LENGTH = windows.MAX_PATH + 3
-)
-
-// HSPFILEQ is type for setup file queue
-type HSPFILEQ uintptr
-
-// DevInfo holds reference to device information set
-type DevInfo windows.Handle
-
-// DevInfoData is a device information structure (references a device instance that is a member of a device information set)
-type DevInfoData struct {
- size uint32
- ClassGUID windows.GUID
- DevInst uint32 // DEVINST handle
- _ uintptr
-}
-
-// DevInfoListDetailData is a structure for detailed information on a device information set (used for SetupDiGetDeviceInfoListDetail which supersedes the functionality of SetupDiGetDeviceInfoListClass).
-type DevInfoListDetailData struct {
- size uint32 // Warning: unsafe.Sizeof(DevInfoListDetailData) > sizeof(SP_DEVINFO_LIST_DETAIL_DATA) when GOARCH == 386 => use sizeofDevInfoListDetailData const.
- ClassGUID windows.GUID
- RemoteMachineHandle windows.Handle
- remoteMachineName [SP_MAX_MACHINENAME_LENGTH]uint16
-}
-
-func (data *DevInfoListDetailData) RemoteMachineName() string {
- return windows.UTF16ToString(data.remoteMachineName[:])
-}
-
-func (data *DevInfoListDetailData) SetRemoteMachineName(remoteMachineName string) error {
- str, err := windows.UTF16FromString(remoteMachineName)
- if err != nil {
- return err
- }
- copy(data.remoteMachineName[:], str)
- return nil
-}
-
-// DI_FUNCTION is function type for device installer
-type DI_FUNCTION uint32
-
-const (
- DIF_SELECTDEVICE DI_FUNCTION = 0x00000001
- DIF_INSTALLDEVICE DI_FUNCTION = 0x00000002
- DIF_ASSIGNRESOURCES DI_FUNCTION = 0x00000003
- DIF_PROPERTIES DI_FUNCTION = 0x00000004
- DIF_REMOVE DI_FUNCTION = 0x00000005
- DIF_FIRSTTIMESETUP DI_FUNCTION = 0x00000006
- DIF_FOUNDDEVICE DI_FUNCTION = 0x00000007
- DIF_SELECTCLASSDRIVERS DI_FUNCTION = 0x00000008
- DIF_VALIDATECLASSDRIVERS DI_FUNCTION = 0x00000009
- DIF_INSTALLCLASSDRIVERS DI_FUNCTION = 0x0000000A
- DIF_CALCDISKSPACE DI_FUNCTION = 0x0000000B
- DIF_DESTROYPRIVATEDATA DI_FUNCTION = 0x0000000C
- DIF_VALIDATEDRIVER DI_FUNCTION = 0x0000000D
- DIF_DETECT DI_FUNCTION = 0x0000000F
- DIF_INSTALLWIZARD DI_FUNCTION = 0x00000010
- DIF_DESTROYWIZARDDATA DI_FUNCTION = 0x00000011
- DIF_PROPERTYCHANGE DI_FUNCTION = 0x00000012
- DIF_ENABLECLASS DI_FUNCTION = 0x00000013
- DIF_DETECTVERIFY DI_FUNCTION = 0x00000014
- DIF_INSTALLDEVICEFILES DI_FUNCTION = 0x00000015
- DIF_UNREMOVE DI_FUNCTION = 0x00000016
- DIF_SELECTBESTCOMPATDRV DI_FUNCTION = 0x00000017
- DIF_ALLOW_INSTALL DI_FUNCTION = 0x00000018
- DIF_REGISTERDEVICE DI_FUNCTION = 0x00000019
- DIF_NEWDEVICEWIZARD_PRESELECT DI_FUNCTION = 0x0000001A
- DIF_NEWDEVICEWIZARD_SELECT DI_FUNCTION = 0x0000001B
- DIF_NEWDEVICEWIZARD_PREANALYZE DI_FUNCTION = 0x0000001C
- DIF_NEWDEVICEWIZARD_POSTANALYZE DI_FUNCTION = 0x0000001D
- DIF_NEWDEVICEWIZARD_FINISHINSTALL DI_FUNCTION = 0x0000001E
- DIF_INSTALLINTERFACES DI_FUNCTION = 0x00000020
- DIF_DETECTCANCEL DI_FUNCTION = 0x00000021
- DIF_REGISTER_COINSTALLERS DI_FUNCTION = 0x00000022
- DIF_ADDPROPERTYPAGE_ADVANCED DI_FUNCTION = 0x00000023
- DIF_ADDPROPERTYPAGE_BASIC DI_FUNCTION = 0x00000024
- DIF_TROUBLESHOOTER DI_FUNCTION = 0x00000026
- DIF_POWERMESSAGEWAKE DI_FUNCTION = 0x00000027
- DIF_ADDREMOTEPROPERTYPAGE_ADVANCED DI_FUNCTION = 0x00000028
- DIF_UPDATEDRIVER_UI DI_FUNCTION = 0x00000029
- DIF_FINISHINSTALL_ACTION DI_FUNCTION = 0x0000002A
-)
-
-// DevInstallParams is device installation parameters structure (associated with a particular device information element, or globally with a device information set)
-type DevInstallParams struct {
- size uint32
- Flags DI_FLAGS
- FlagsEx DI_FLAGSEX
- hwndParent uintptr
- InstallMsgHandler uintptr
- InstallMsgHandlerContext uintptr
- FileQueue HSPFILEQ
- _ uintptr
- _ uint32
- driverPath [windows.MAX_PATH]uint16
-}
-
-func (params *DevInstallParams) DriverPath() string {
- return windows.UTF16ToString(params.driverPath[:])
-}
-
-func (params *DevInstallParams) SetDriverPath(driverPath string) error {
- str, err := windows.UTF16FromString(driverPath)
- if err != nil {
- return err
- }
- copy(params.driverPath[:], str)
- return nil
-}
-
-// DI_FLAGS is SP_DEVINSTALL_PARAMS.Flags values
-type DI_FLAGS uint32
-
-const (
- // Flags for choosing a device
- DI_SHOWOEM DI_FLAGS = 0x00000001 // support Other... button
- DI_SHOWCOMPAT DI_FLAGS = 0x00000002 // show compatibility list
- DI_SHOWCLASS DI_FLAGS = 0x00000004 // show class list
- DI_SHOWALL DI_FLAGS = 0x00000007 // both class & compat list shown
- DI_NOVCP DI_FLAGS = 0x00000008 // don't create a new copy queue--use caller-supplied FileQueue
- DI_DIDCOMPAT DI_FLAGS = 0x00000010 // Searched for compatible devices
- DI_DIDCLASS DI_FLAGS = 0x00000020 // Searched for class devices
- DI_AUTOASSIGNRES DI_FLAGS = 0x00000040 // No UI for resources if possible
-
- // Flags returned by DiInstallDevice to indicate need to reboot/restart
- DI_NEEDRESTART DI_FLAGS = 0x00000080 // Reboot required to take effect
- DI_NEEDREBOOT DI_FLAGS = 0x00000100 // ""
-
- // Flags for device installation
- DI_NOBROWSE DI_FLAGS = 0x00000200 // no Browse... in InsertDisk
-
- // Flags set by DiBuildDriverInfoList
- DI_MULTMFGS DI_FLAGS = 0x00000400 // Set if multiple manufacturers in class driver list
-
- // Flag indicates that device is disabled
- DI_DISABLED DI_FLAGS = 0x00000800 // Set if device disabled
-
- // Flags for Device/Class Properties
- DI_GENERALPAGE_ADDED DI_FLAGS = 0x00001000
- DI_RESOURCEPAGE_ADDED DI_FLAGS = 0x00002000
-
- // Flag to indicate the setting properties for this Device (or class) caused a change so the Dev Mgr UI probably needs to be updated.
- DI_PROPERTIES_CHANGE DI_FLAGS = 0x00004000
-
- // Flag to indicate that the sorting from the INF file should be used.
- DI_INF_IS_SORTED DI_FLAGS = 0x00008000
-
- // Flag to indicate that only the the INF specified by SP_DEVINSTALL_PARAMS.DriverPath should be searched.
- DI_ENUMSINGLEINF DI_FLAGS = 0x00010000
-
- // Flag that prevents ConfigMgr from removing/re-enumerating devices during device
- // registration, installation, and deletion.
- DI_DONOTCALLCONFIGMG DI_FLAGS = 0x00020000
-
- // The following flag can be used to install a device disabled
- DI_INSTALLDISABLED DI_FLAGS = 0x00040000
-
- // Flag that causes SetupDiBuildDriverInfoList to build a device's compatible driver
- // list from its existing class driver list, instead of the normal INF search.
- DI_COMPAT_FROM_CLASS DI_FLAGS = 0x00080000
-
- // This flag is set if the Class Install params should be used.
- DI_CLASSINSTALLPARAMS DI_FLAGS = 0x00100000
-
- // This flag is set if the caller of DiCallClassInstaller does NOT want the internal default action performed if the Class installer returns ERROR_DI_DO_DEFAULT.
- DI_NODI_DEFAULTACTION DI_FLAGS = 0x00200000
-
- // Flags for device installation
- DI_QUIETINSTALL DI_FLAGS = 0x00800000 // don't confuse the user with questions or excess info
- DI_NOFILECOPY DI_FLAGS = 0x01000000 // No file Copy necessary
- DI_FORCECOPY DI_FLAGS = 0x02000000 // Force files to be copied from install path
- DI_DRIVERPAGE_ADDED DI_FLAGS = 0x04000000 // Prop provider added Driver page.
- DI_USECI_SELECTSTRINGS DI_FLAGS = 0x08000000 // Use Class Installer Provided strings in the Select Device Dlg
- DI_OVERRIDE_INFFLAGS DI_FLAGS = 0x10000000 // Override INF flags
- DI_PROPS_NOCHANGEUSAGE DI_FLAGS = 0x20000000 // No Enable/Disable in General Props
-
- DI_NOSELECTICONS DI_FLAGS = 0x40000000 // No small icons in select device dialogs
-
- DI_NOWRITE_IDS DI_FLAGS = 0x80000000 // Don't write HW & Compat IDs on install
-)
-
-// DI_FLAGSEX is SP_DEVINSTALL_PARAMS.FlagsEx values
-type DI_FLAGSEX uint32
-
-const (
- DI_FLAGSEX_CI_FAILED DI_FLAGSEX = 0x00000004 // Failed to Load/Call class installer
- DI_FLAGSEX_FINISHINSTALL_ACTION DI_FLAGSEX = 0x00000008 // Class/co-installer wants to get a DIF_FINISH_INSTALL action in client context.
- DI_FLAGSEX_DIDINFOLIST DI_FLAGSEX = 0x00000010 // Did the Class Info List
- DI_FLAGSEX_DIDCOMPATINFO DI_FLAGSEX = 0x00000020 // Did the Compat Info List
- DI_FLAGSEX_FILTERCLASSES DI_FLAGSEX = 0x00000040
- DI_FLAGSEX_SETFAILEDINSTALL DI_FLAGSEX = 0x00000080
- DI_FLAGSEX_DEVICECHANGE DI_FLAGSEX = 0x00000100
- DI_FLAGSEX_ALWAYSWRITEIDS DI_FLAGSEX = 0x00000200
- DI_FLAGSEX_PROPCHANGE_PENDING DI_FLAGSEX = 0x00000400 // One or more device property sheets have had changes made to them, and need to have a DIF_PROPERTYCHANGE occur.
- DI_FLAGSEX_ALLOWEXCLUDEDDRVS DI_FLAGSEX = 0x00000800
- DI_FLAGSEX_NOUIONQUERYREMOVE DI_FLAGSEX = 0x00001000
- DI_FLAGSEX_USECLASSFORCOMPAT DI_FLAGSEX = 0x00002000 // Use the device's class when building compat drv list. (Ignored if DI_COMPAT_FROM_CLASS flag is specified.)
- DI_FLAGSEX_NO_DRVREG_MODIFY DI_FLAGSEX = 0x00008000 // Don't run AddReg and DelReg for device's software (driver) key.
- DI_FLAGSEX_IN_SYSTEM_SETUP DI_FLAGSEX = 0x00010000 // Installation is occurring during initial system setup.
- DI_FLAGSEX_INET_DRIVER DI_FLAGSEX = 0x00020000 // Driver came from Windows Update
- DI_FLAGSEX_APPENDDRIVERLIST DI_FLAGSEX = 0x00040000 // Cause SetupDiBuildDriverInfoList to append a new driver list to an existing list.
- DI_FLAGSEX_PREINSTALLBACKUP DI_FLAGSEX = 0x00080000 // not used
- DI_FLAGSEX_BACKUPONREPLACE DI_FLAGSEX = 0x00100000 // not used
- DI_FLAGSEX_DRIVERLIST_FROM_URL DI_FLAGSEX = 0x00200000 // build driver list from INF(s) retrieved from URL specified in SP_DEVINSTALL_PARAMS.DriverPath (empty string means Windows Update website)
- DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS DI_FLAGSEX = 0x00800000 // Don't include old Internet drivers when building a driver list. Ignored on Windows Vista and later.
- DI_FLAGSEX_POWERPAGE_ADDED DI_FLAGSEX = 0x01000000 // class installer added their own power page
- DI_FLAGSEX_FILTERSIMILARDRIVERS DI_FLAGSEX = 0x02000000 // only include similar drivers in class list
- DI_FLAGSEX_INSTALLEDDRIVER DI_FLAGSEX = 0x04000000 // only add the installed driver to the class or compat driver list. Used in calls to SetupDiBuildDriverInfoList
- DI_FLAGSEX_NO_CLASSLIST_NODE_MERGE DI_FLAGSEX = 0x08000000 // Don't remove identical driver nodes from the class list
- DI_FLAGSEX_ALTPLATFORM_DRVSEARCH DI_FLAGSEX = 0x10000000 // Build driver list based on alternate platform information specified in associated file queue
- DI_FLAGSEX_RESTART_DEVICE_ONLY DI_FLAGSEX = 0x20000000 // only restart the device drivers are being installed on as opposed to restarting all devices using those drivers.
- DI_FLAGSEX_RECURSIVESEARCH DI_FLAGSEX = 0x40000000 // Tell SetupDiBuildDriverInfoList to do a recursive search
- DI_FLAGSEX_SEARCH_PUBLISHED_INFS DI_FLAGSEX = 0x80000000 // Tell SetupDiBuildDriverInfoList to do a "published INF" search
-)
-
-// ClassInstallHeader is the first member of any class install parameters structure. It contains the device installation request code that defines the format of the rest of the install parameters structure.
-type ClassInstallHeader struct {
- size uint32
- InstallFunction DI_FUNCTION
-}
-
-func MakeClassInstallHeader(installFunction DI_FUNCTION) *ClassInstallHeader {
- hdr := &ClassInstallHeader{InstallFunction: installFunction}
- hdr.size = uint32(unsafe.Sizeof(*hdr))
- return hdr
-}
-
-// DICS_STATE specifies values indicating a change in a device's state
-type DICS_STATE uint32
-
-const (
- DICS_ENABLE DICS_STATE = 0x00000001 // The device is being enabled.
- DICS_DISABLE DICS_STATE = 0x00000002 // The device is being disabled.
- DICS_PROPCHANGE DICS_STATE = 0x00000003 // The properties of the device have changed.
- DICS_START DICS_STATE = 0x00000004 // The device is being started (if the request is for the currently active hardware profile).
- DICS_STOP DICS_STATE = 0x00000005 // The device is being stopped. The driver stack will be unloaded and the CSCONFIGFLAG_DO_NOT_START flag will be set for the device.
-)
-
-// DICS_FLAG specifies the scope of a device property change
-type DICS_FLAG uint32
-
-const (
- DICS_FLAG_GLOBAL DICS_FLAG = 0x00000001 // make change in all hardware profiles
- DICS_FLAG_CONFIGSPECIFIC DICS_FLAG = 0x00000002 // make change in specified profile only
- DICS_FLAG_CONFIGGENERAL DICS_FLAG = 0x00000004 // 1 or more hardware profile-specific changes to follow (obsolete)
-)
-
-// PropChangeParams is a structure corresponding to a DIF_PROPERTYCHANGE install function.
-type PropChangeParams struct {
- ClassInstallHeader ClassInstallHeader
- StateChange DICS_STATE
- Scope DICS_FLAG
- HwProfile uint32
-}
-
-// DI_REMOVEDEVICE specifies the scope of the device removal
-type DI_REMOVEDEVICE uint32
-
-const (
- DI_REMOVEDEVICE_GLOBAL DI_REMOVEDEVICE = 0x00000001 // Make this change in all hardware profiles. Remove information about the device from the registry.
- DI_REMOVEDEVICE_CONFIGSPECIFIC DI_REMOVEDEVICE = 0x00000002 // Make this change to only the hardware profile specified by HwProfile. this flag only applies to root-enumerated devices. When Windows removes the device from the last hardware profile in which it was configured, Windows performs a global removal.
-)
-
-// RemoveDeviceParams is a structure corresponding to a DIF_REMOVE install function.
-type RemoveDeviceParams struct {
- ClassInstallHeader ClassInstallHeader
- Scope DI_REMOVEDEVICE
- HwProfile uint32
-}
-
-// DrvInfoData is driver information structure (member of a driver info list that may be associated with a particular device instance, or (globally) with a device information set)
-type DrvInfoData struct {
- size uint32
- DriverType uint32
- _ uintptr
- description [LINE_LEN]uint16
- mfgName [LINE_LEN]uint16
- providerName [LINE_LEN]uint16
- DriverDate windows.Filetime
- DriverVersion uint64
-}
-
-func (data *DrvInfoData) Description() string {
- return windows.UTF16ToString(data.description[:])
-}
-
-func (data *DrvInfoData) SetDescription(description string) error {
- str, err := windows.UTF16FromString(description)
- if err != nil {
- return err
- }
- copy(data.description[:], str)
- return nil
-}
-
-func (data *DrvInfoData) MfgName() string {
- return windows.UTF16ToString(data.mfgName[:])
-}
-
-func (data *DrvInfoData) SetMfgName(mfgName string) error {
- str, err := windows.UTF16FromString(mfgName)
- if err != nil {
- return err
- }
- copy(data.mfgName[:], str)
- return nil
-}
-
-func (data *DrvInfoData) ProviderName() string {
- return windows.UTF16ToString(data.providerName[:])
-}
-
-func (data *DrvInfoData) SetProviderName(providerName string) error {
- str, err := windows.UTF16FromString(providerName)
- if err != nil {
- return err
- }
- copy(data.providerName[:], str)
- return nil
-}
-
-// IsNewer method returns true if DrvInfoData date and version is newer than supplied parameters.
-func (data *DrvInfoData) IsNewer(driverDate windows.Filetime, driverVersion uint64) bool {
- if data.DriverDate.HighDateTime > driverDate.HighDateTime {
- return true
- }
- if data.DriverDate.HighDateTime < driverDate.HighDateTime {
- return false
- }
-
- if data.DriverDate.LowDateTime > driverDate.LowDateTime {
- return true
- }
- if data.DriverDate.LowDateTime < driverDate.LowDateTime {
- return false
- }
-
- if data.DriverVersion > driverVersion {
- return true
- }
- if data.DriverVersion < driverVersion {
- return false
- }
-
- return false
-}
-
-// DrvInfoDetailData is driver information details structure (provides detailed information about a particular driver information structure)
-type DrvInfoDetailData struct {
- size uint32 // Warning: unsafe.Sizeof(DrvInfoDetailData) > sizeof(SP_DRVINFO_DETAIL_DATA) when GOARCH == 386 => use sizeofDrvInfoDetailData const.
- InfDate windows.Filetime
- compatIDsOffset uint32
- compatIDsLength uint32
- _ uintptr
- sectionName [LINE_LEN]uint16
- infFileName [windows.MAX_PATH]uint16
- drvDescription [LINE_LEN]uint16
- hardwareID [ANYSIZE_ARRAY]uint16
-}
-
-func (data *DrvInfoDetailData) SectionName() string {
- return windows.UTF16ToString(data.sectionName[:])
-}
-
-func (data *DrvInfoDetailData) InfFileName() string {
- return windows.UTF16ToString(data.infFileName[:])
-}
-
-func (data *DrvInfoDetailData) DrvDescription() string {
- return windows.UTF16ToString(data.drvDescription[:])
-}
-
-func (data *DrvInfoDetailData) HardwareID() string {
- if data.compatIDsOffset > 1 {
- bufW := data.getBuf()
- return windows.UTF16ToString(bufW[:wcslen(bufW)])
- }
-
- return ""
-}
-
-func (data *DrvInfoDetailData) CompatIDs() []string {
- a := make([]string, 0)
-
- if data.compatIDsLength > 0 {
- bufW := data.getBuf()
- bufW = bufW[data.compatIDsOffset : data.compatIDsOffset+data.compatIDsLength]
- for i := 0; i < len(bufW); {
- j := i + wcslen(bufW[i:])
- if i < j {
- a = append(a, windows.UTF16ToString(bufW[i:j]))
- }
- i = j + 1
- }
- }
-
- return a
-}
-
-func (data *DrvInfoDetailData) getBuf() []uint16 {
- len := (data.size - uint32(unsafe.Offsetof(data.hardwareID))) / 2
- sl := struct {
- addr *uint16
- len int
- cap int
- }{&data.hardwareID[0], int(len), int(len)}
- return *(*[]uint16)(unsafe.Pointer(&sl))
-}
-
-// IsCompatible method tests if given hardware ID matches the driver or is listed on the compatible ID list.
-func (data *DrvInfoDetailData) IsCompatible(hwid string) bool {
- hwidLC := strings.ToLower(hwid)
- if strings.ToLower(data.HardwareID()) == hwidLC {
- return true
- }
- a := data.CompatIDs()
- for i := range a {
- if strings.ToLower(a[i]) == hwidLC {
- return true
- }
- }
-
- return false
-}
-
-// DICD flags control SetupDiCreateDeviceInfo
-type DICD uint32
-
-const (
- DICD_GENERATE_ID DICD = 0x00000001
- DICD_INHERIT_CLASSDRVS DICD = 0x00000002
-)
-
-//
-// SPDIT flags to distinguish between class drivers and
-// device drivers.
-// (Passed in 'DriverType' parameter of driver information list APIs)
-//
-type SPDIT uint32
-
-const (
- SPDIT_NODRIVER SPDIT = 0x00000000
- SPDIT_CLASSDRIVER SPDIT = 0x00000001
- SPDIT_COMPATDRIVER SPDIT = 0x00000002
-)
-
-// DIGCF flags control what is included in the device information set built by SetupDiGetClassDevs
-type DIGCF uint32
-
-const (
- DIGCF_DEFAULT DIGCF = 0x00000001 // only valid with DIGCF_DEVICEINTERFACE
- DIGCF_PRESENT DIGCF = 0x00000002
- DIGCF_ALLCLASSES DIGCF = 0x00000004
- DIGCF_PROFILE DIGCF = 0x00000008
- DIGCF_DEVICEINTERFACE DIGCF = 0x00000010
-)
-
-// DIREG specifies values for SetupDiCreateDevRegKey, SetupDiOpenDevRegKey, and SetupDiDeleteDevRegKey.
-type DIREG uint32
-
-const (
- DIREG_DEV DIREG = 0x00000001 // Open/Create/Delete device key
- DIREG_DRV DIREG = 0x00000002 // Open/Create/Delete driver key
- DIREG_BOTH DIREG = 0x00000004 // Delete both driver and Device key
-)
-
-//
-// SPDRP specifies device registry property codes
-// (Codes marked as read-only (R) may only be used for
-// SetupDiGetDeviceRegistryProperty)
-//
-// These values should cover the same set of registry properties
-// as defined by the CM_DRP codes in cfgmgr32.h.
-//
-// Note that SPDRP codes are zero based while CM_DRP codes are one based!
-//
-type SPDRP uint32
-
-const (
- SPDRP_DEVICEDESC SPDRP = 0x00000000 // DeviceDesc (R/W)
- SPDRP_HARDWAREID SPDRP = 0x00000001 // HardwareID (R/W)
- SPDRP_COMPATIBLEIDS SPDRP = 0x00000002 // CompatibleIDs (R/W)
- SPDRP_SERVICE SPDRP = 0x00000004 // Service (R/W)
- SPDRP_CLASS SPDRP = 0x00000007 // Class (R--tied to ClassGUID)
- SPDRP_CLASSGUID SPDRP = 0x00000008 // ClassGUID (R/W)
- SPDRP_DRIVER SPDRP = 0x00000009 // Driver (R/W)
- SPDRP_CONFIGFLAGS SPDRP = 0x0000000A // ConfigFlags (R/W)
- SPDRP_MFG SPDRP = 0x0000000B // Mfg (R/W)
- SPDRP_FRIENDLYNAME SPDRP = 0x0000000C // FriendlyName (R/W)
- SPDRP_LOCATION_INFORMATION SPDRP = 0x0000000D // LocationInformation (R/W)
- SPDRP_PHYSICAL_DEVICE_OBJECT_NAME SPDRP = 0x0000000E // PhysicalDeviceObjectName (R)
- SPDRP_CAPABILITIES SPDRP = 0x0000000F // Capabilities (R)
- SPDRP_UI_NUMBER SPDRP = 0x00000010 // UiNumber (R)
- SPDRP_UPPERFILTERS SPDRP = 0x00000011 // UpperFilters (R/W)
- SPDRP_LOWERFILTERS SPDRP = 0x00000012 // LowerFilters (R/W)
- SPDRP_BUSTYPEGUID SPDRP = 0x00000013 // BusTypeGUID (R)
- SPDRP_LEGACYBUSTYPE SPDRP = 0x00000014 // LegacyBusType (R)
- SPDRP_BUSNUMBER SPDRP = 0x00000015 // BusNumber (R)
- SPDRP_ENUMERATOR_NAME SPDRP = 0x00000016 // Enumerator Name (R)
- SPDRP_SECURITY SPDRP = 0x00000017 // Security (R/W, binary form)
- SPDRP_SECURITY_SDS SPDRP = 0x00000018 // Security (W, SDS form)
- SPDRP_DEVTYPE SPDRP = 0x00000019 // Device Type (R/W)
- SPDRP_EXCLUSIVE SPDRP = 0x0000001A // Device is exclusive-access (R/W)
- SPDRP_CHARACTERISTICS SPDRP = 0x0000001B // Device Characteristics (R/W)
- SPDRP_ADDRESS SPDRP = 0x0000001C // Device Address (R)
- SPDRP_UI_NUMBER_DESC_FORMAT SPDRP = 0x0000001D // UiNumberDescFormat (R/W)
- SPDRP_DEVICE_POWER_DATA SPDRP = 0x0000001E // Device Power Data (R)
- SPDRP_REMOVAL_POLICY SPDRP = 0x0000001F // Removal Policy (R)
- SPDRP_REMOVAL_POLICY_HW_DEFAULT SPDRP = 0x00000020 // Hardware Removal Policy (R)
- SPDRP_REMOVAL_POLICY_OVERRIDE SPDRP = 0x00000021 // Removal Policy Override (RW)
- SPDRP_INSTALL_STATE SPDRP = 0x00000022 // Device Install State (R)
- SPDRP_LOCATION_PATHS SPDRP = 0x00000023 // Device Location Paths (R)
- SPDRP_BASE_CONTAINERID SPDRP = 0x00000024 // Base ContainerID (R)
-
- SPDRP_MAXIMUM_PROPERTY SPDRP = 0x00000025 // Upper bound on ordinals
-)
-
-const (
- CR_SUCCESS = 0x0
- CR_BUFFER_SMALL = 0x1a
-)
-
-const (
- CM_GET_DEVICE_INTERFACE_LIST_PRESENT = 0 // only currently 'live' device interfaces
- CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES = 1 // all registered device interfaces, live or not
-)
diff --git a/tun/wintun/setupapi/zsetupapi_windows.go b/tun/wintun/setupapi/zsetupapi_windows.go
deleted file mode 100644
index 375862d..0000000
--- a/tun/wintun/setupapi/zsetupapi_windows.go
+++ /dev/null
@@ -1,398 +0,0 @@
-// Code generated by 'go generate'; DO NOT EDIT.
-
-package setupapi
-
-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)
-)
-
-// errnoErr returns common boxed Errno values, to prevent
-// allocations at runtime.
-func errnoErr(e syscall.Errno) error {
- switch e {
- case 0:
- return nil
- 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
-}
-
-var (
- modsetupapi = windows.NewLazySystemDLL("setupapi.dll")
- modCfgMgr32 = windows.NewLazySystemDLL("CfgMgr32.dll")
-
- procSetupDiCreateDeviceInfoListExW = modsetupapi.NewProc("SetupDiCreateDeviceInfoListExW")
- procSetupDiGetDeviceInfoListDetailW = modsetupapi.NewProc("SetupDiGetDeviceInfoListDetailW")
- procSetupDiCreateDeviceInfoW = modsetupapi.NewProc("SetupDiCreateDeviceInfoW")
- procSetupDiEnumDeviceInfo = modsetupapi.NewProc("SetupDiEnumDeviceInfo")
- procSetupDiDestroyDeviceInfoList = modsetupapi.NewProc("SetupDiDestroyDeviceInfoList")
- procSetupDiBuildDriverInfoList = modsetupapi.NewProc("SetupDiBuildDriverInfoList")
- procSetupDiCancelDriverInfoSearch = modsetupapi.NewProc("SetupDiCancelDriverInfoSearch")
- procSetupDiEnumDriverInfoW = modsetupapi.NewProc("SetupDiEnumDriverInfoW")
- procSetupDiGetSelectedDriverW = modsetupapi.NewProc("SetupDiGetSelectedDriverW")
- procSetupDiSetSelectedDriverW = modsetupapi.NewProc("SetupDiSetSelectedDriverW")
- procSetupDiGetDriverInfoDetailW = modsetupapi.NewProc("SetupDiGetDriverInfoDetailW")
- procSetupDiDestroyDriverInfoList = modsetupapi.NewProc("SetupDiDestroyDriverInfoList")
- procSetupDiGetClassDevsExW = modsetupapi.NewProc("SetupDiGetClassDevsExW")
- procSetupDiCallClassInstaller = modsetupapi.NewProc("SetupDiCallClassInstaller")
- procSetupDiOpenDevRegKey = modsetupapi.NewProc("SetupDiOpenDevRegKey")
- procSetupDiGetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiGetDeviceRegistryPropertyW")
- procSetupDiSetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiSetDeviceRegistryPropertyW")
- procSetupDiGetDeviceInstallParamsW = modsetupapi.NewProc("SetupDiGetDeviceInstallParamsW")
- procSetupDiGetDeviceInstanceIdW = modsetupapi.NewProc("SetupDiGetDeviceInstanceIdW")
- procSetupDiGetClassInstallParamsW = modsetupapi.NewProc("SetupDiGetClassInstallParamsW")
- procSetupDiSetDeviceInstallParamsW = modsetupapi.NewProc("SetupDiSetDeviceInstallParamsW")
- procSetupDiSetClassInstallParamsW = modsetupapi.NewProc("SetupDiSetClassInstallParamsW")
- procSetupDiClassNameFromGuidExW = modsetupapi.NewProc("SetupDiClassNameFromGuidExW")
- procSetupDiClassGuidsFromNameExW = modsetupapi.NewProc("SetupDiClassGuidsFromNameExW")
- procSetupDiGetSelectedDevice = modsetupapi.NewProc("SetupDiGetSelectedDevice")
- procSetupDiSetSelectedDevice = modsetupapi.NewProc("SetupDiSetSelectedDevice")
- procCM_Get_Device_Interface_List_SizeW = modCfgMgr32.NewProc("CM_Get_Device_Interface_List_SizeW")
- procCM_Get_Device_Interface_ListW = modCfgMgr32.NewProc("CM_Get_Device_Interface_ListW")
-)
-
-func setupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr, machineName *uint16, reserved uintptr) (handle DevInfo, err error) {
- r0, _, e1 := syscall.Syscall6(procSetupDiCreateDeviceInfoListExW.Addr(), 4, uintptr(unsafe.Pointer(classGUID)), uintptr(hwndParent), uintptr(unsafe.Pointer(machineName)), uintptr(reserved), 0, 0)
- handle = DevInfo(r0)
- if handle == DevInfo(windows.InvalidHandle) {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo, deviceInfoSetDetailData *DevInfoListDetailData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiGetDeviceInfoListDetailW.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoSetDetailData)), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiCreateDeviceInfo(deviceInfoSet DevInfo, DeviceName *uint16, classGUID *windows.GUID, DeviceDescription *uint16, hwndParent uintptr, CreationFlags DICD, deviceInfoData *DevInfoData) (err error) {
- r1, _, e1 := syscall.Syscall9(procSetupDiCreateDeviceInfoW.Addr(), 7, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(DeviceName)), uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(DeviceDescription)), uintptr(hwndParent), uintptr(CreationFlags), uintptr(unsafe.Pointer(deviceInfoData)), 0, 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex uint32, deviceInfoData *DevInfoData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiEnumDeviceInfo.Addr(), 3, uintptr(deviceInfoSet), uintptr(memberIndex), uintptr(unsafe.Pointer(deviceInfoData)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiDestroyDeviceInfoList(deviceInfoSet DevInfo) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiDestroyDeviceInfoList.Addr(), 1, uintptr(deviceInfoSet), 0, 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiBuildDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiBuildDriverInfoList.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiCancelDriverInfoSearch(deviceInfoSet DevInfo) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiCancelDriverInfoSearch.Addr(), 1, uintptr(deviceInfoSet), 0, 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex uint32, driverInfoData *DrvInfoData) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiEnumDriverInfoW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType), uintptr(memberIndex), uintptr(unsafe.Pointer(driverInfoData)), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiGetSelectedDriverW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiSetSelectedDriverW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *DrvInfoDetailData, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiGetDriverInfoDetailW.Addr(), 6, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)), uintptr(unsafe.Pointer(driverInfoDetailData)), uintptr(driverInfoDetailDataSize), uintptr(unsafe.Pointer(requiredSize)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiDestroyDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiDestroyDriverInfoList.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetClassDevsEx(classGUID *windows.GUID, Enumerator *uint16, hwndParent uintptr, Flags DIGCF, deviceInfoSet DevInfo, machineName *uint16, reserved uintptr) (handle DevInfo, err error) {
- r0, _, e1 := syscall.Syscall9(procSetupDiGetClassDevsExW.Addr(), 7, uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(Enumerator)), uintptr(hwndParent), uintptr(Flags), uintptr(deviceInfoSet), uintptr(unsafe.Pointer(machineName)), uintptr(reserved), 0, 0)
- handle = DevInfo(r0)
- if handle == DevInfo(windows.InvalidHandle) {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiCallClassInstaller(installFunction DI_FUNCTION, deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiCallClassInstaller.Addr(), 3, uintptr(installFunction), uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (key windows.Handle, err error) {
- r0, _, e1 := syscall.Syscall6(procSetupDiOpenDevRegKey.Addr(), 6, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(Scope), uintptr(HwProfile), uintptr(KeyType), uintptr(samDesired))
- key = windows.Handle(r0)
- if key == windows.InvalidHandle {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyRegDataType *uint32, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32) (err error) {
- r1, _, e1 := syscall.Syscall9(procSetupDiGetDeviceRegistryPropertyW.Addr(), 7, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(property), uintptr(unsafe.Pointer(propertyRegDataType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), uintptr(unsafe.Pointer(requiredSize)), 0, 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffer *byte, propertyBufferSize uint32) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiSetDeviceRegistryPropertyW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(property), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiGetDeviceInstallParamsW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(deviceInstallParams)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiGetDeviceInstanceIdW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(instanceId)), uintptr(instanceIdSize), uintptr(unsafe.Pointer(instanceIdRequiredSize)), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiGetClassInstallParamsW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), uintptr(unsafe.Pointer(requiredSize)), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiSetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiSetDeviceInstallParamsW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(deviceInstallParams)))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiSetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiSetClassInstallParamsW.Addr(), 4, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), 0, 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiClassNameFromGuidEx(classGUID *windows.GUID, className *uint16, classNameSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiClassNameFromGuidExW.Addr(), 6, uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(className)), uintptr(classNameSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(unsafe.Pointer(machineName)), uintptr(reserved))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiClassGuidsFromNameEx(className *uint16, classGuidList *windows.GUID, classGuidListSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) {
- r1, _, e1 := syscall.Syscall6(procSetupDiClassGuidsFromNameExW.Addr(), 6, uintptr(unsafe.Pointer(className)), uintptr(unsafe.Pointer(classGuidList)), uintptr(classGuidListSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(unsafe.Pointer(machineName)), uintptr(reserved))
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func setupDiGetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiGetSelectedDevice.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func SetupDiSetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) {
- r1, _, e1 := syscall.Syscall(procSetupDiSetSelectedDevice.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func cm_Get_Device_Interface_List_Size(len *uint32, interfaceClass *windows.GUID, deviceID *uint16, flags uint32) (ret uint32) {
- r0, _, _ := syscall.Syscall6(procCM_Get_Device_Interface_List_SizeW.Addr(), 4, uintptr(unsafe.Pointer(len)), uintptr(unsafe.Pointer(interfaceClass)), uintptr(unsafe.Pointer(deviceID)), uintptr(flags), 0, 0)
- ret = uint32(r0)
- return
-}
-
-func cm_Get_Device_Interface_List(interfaceClass *windows.GUID, deviceID *uint16, buffer *uint16, bufferLen uint32, flags uint32) (ret uint32) {
- r0, _, _ := syscall.Syscall6(procCM_Get_Device_Interface_ListW.Addr(), 5, uintptr(unsafe.Pointer(interfaceClass)), uintptr(unsafe.Pointer(deviceID)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(flags), 0)
- ret = uint32(r0)
- return
-}
diff --git a/tun/wintun/setupapi/zsetupapi_windows_test.go b/tun/wintun/setupapi/zsetupapi_windows_test.go
deleted file mode 100644
index 5b5f369..0000000
--- a/tun/wintun/setupapi/zsetupapi_windows_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2020 WireGuard LLC. All Rights Reserved.
- */
-
-package setupapi
-
-import (
- "syscall"
- "testing"
-
- "golang.org/x/sys/windows"
-)
-
-func TestSetupDiDestroyDeviceInfoList(t *testing.T) {
- err := SetupDiDestroyDeviceInfoList(DevInfo(windows.InvalidHandle))
- if errWin, ok := err.(syscall.Errno); !ok || errWin != windows.ERROR_INVALID_HANDLE {
- t.Errorf("SetupDiDestroyDeviceInfoList(nil, ...) should fail with ERROR_INVALID_HANDLE")
- }
-}