setupapi, wintun: replace syscall with golang.org/x/sys/windows

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2019-06-04 14:54:56 +02:00
parent 85b85e62e5
commit 625e445b22
4 changed files with 32 additions and 36 deletions

View File

@ -9,7 +9,6 @@ import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"runtime" "runtime"
"syscall"
"unsafe" "unsafe"
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
@ -22,7 +21,7 @@ import (
func SetupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr, machineName string) (deviceInfoSet DevInfo, err error) { func SetupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr, machineName string) (deviceInfoSet DevInfo, err error) {
var machineNameUTF16 *uint16 var machineNameUTF16 *uint16
if machineName != "" { if machineName != "" {
machineNameUTF16, err = syscall.UTF16PtrFromString(machineName) machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
if err != nil { if err != nil {
return return
} }
@ -49,14 +48,14 @@ func (deviceInfoSet DevInfo) DeviceInfoListDetail() (*DevInfoListDetailData, err
// SetupDiCreateDeviceInfo function creates a new device information element and adds it as a new member to the specified device information set. // 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) { func SetupDiCreateDeviceInfo(deviceInfoSet DevInfo, deviceName string, classGUID *windows.GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (deviceInfoData *DevInfoData, err error) {
deviceNameUTF16, err := syscall.UTF16PtrFromString(deviceName) deviceNameUTF16, err := windows.UTF16PtrFromString(deviceName)
if err != nil { if err != nil {
return return
} }
var deviceDescriptionUTF16 *uint16 var deviceDescriptionUTF16 *uint16
if deviceDescription != "" { if deviceDescription != "" {
deviceDescriptionUTF16, err = syscall.UTF16PtrFromString(deviceDescription) deviceDescriptionUTF16, err = windows.UTF16PtrFromString(deviceDescription)
if err != nil { if err != nil {
return return
} }
@ -165,7 +164,7 @@ func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoDa
return data, nil return data, nil
} }
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_INSUFFICIENT_BUFFER { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_INSUFFICIENT_BUFFER {
// The buffer was too small. Now that we got the required size, create another one big enough and retry. // The buffer was too small. Now that we got the required size, create another one big enough and retry.
buf := make([]byte, bufLen) buf := make([]byte, bufLen)
data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0])) data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
@ -199,14 +198,14 @@ func (deviceInfoSet DevInfo) DestroyDriverInfoList(deviceInfoData *DevInfoData,
func SetupDiGetClassDevsEx(classGUID *windows.GUID, enumerator string, hwndParent uintptr, flags DIGCF, deviceInfoSet DevInfo, machineName string) (handle DevInfo, err error) { func SetupDiGetClassDevsEx(classGUID *windows.GUID, enumerator string, hwndParent uintptr, flags DIGCF, deviceInfoSet DevInfo, machineName string) (handle DevInfo, err error) {
var enumeratorUTF16 *uint16 var enumeratorUTF16 *uint16
if enumerator != "" { if enumerator != "" {
enumeratorUTF16, err = syscall.UTF16PtrFromString(enumerator) enumeratorUTF16, err = windows.UTF16PtrFromString(enumerator)
if err != nil { if err != nil {
return return
} }
} }
var machineNameUTF16 *uint16 var machineNameUTF16 *uint16
if machineName != "" { if machineName != "" {
machineNameUTF16, err = syscall.UTF16PtrFromString(machineName) machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
if err != nil { if err != nil {
return return
} }
@ -247,7 +246,7 @@ func SetupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *Dev
return getRegistryValue(buf[:bufLen], dataType) return getRegistryValue(buf[:bufLen], dataType)
} }
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_INSUFFICIENT_BUFFER { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_INSUFFICIENT_BUFFER {
// The buffer was too small. Now that we got the required size, create another one big enough and retry. // The buffer was too small. Now that we got the required size, create another one big enough and retry.
buf = make([]byte, bufLen) buf = make([]byte, bufLen)
err = setupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &dataType, &buf[0], uint32(cap(buf)), &bufLen) err = setupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &dataType, &buf[0], uint32(cap(buf)), &bufLen)
@ -396,7 +395,7 @@ func SetupDiClassNameFromGuidEx(classGUID *windows.GUID, machineName string) (cl
var machineNameUTF16 *uint16 var machineNameUTF16 *uint16
if machineName != "" { if machineName != "" {
machineNameUTF16, err = syscall.UTF16PtrFromString(machineName) machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
if err != nil { if err != nil {
return return
} }
@ -415,7 +414,7 @@ func SetupDiClassNameFromGuidEx(classGUID *windows.GUID, machineName string) (cl
// 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. // 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) { func SetupDiClassGuidsFromNameEx(className string, machineName string) ([]windows.GUID, error) {
classNameUTF16, err := syscall.UTF16PtrFromString(className) classNameUTF16, err := windows.UTF16PtrFromString(className)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -426,7 +425,7 @@ func SetupDiClassGuidsFromNameEx(className string, machineName string) ([]window
var machineNameUTF16 *uint16 var machineNameUTF16 *uint16
if machineName != "" { if machineName != "" {
machineNameUTF16, err = syscall.UTF16PtrFromString(machineName) machineNameUTF16, err = windows.UTF16PtrFromString(machineName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -438,7 +437,7 @@ func SetupDiClassGuidsFromNameEx(className string, machineName string) ([]window
return buf[:bufLen], nil return buf[:bufLen], nil
} }
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_INSUFFICIENT_BUFFER { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_INSUFFICIENT_BUFFER {
// The GUID array was too small. Now that we got the required size, create another one big enough and retry. // The GUID array was too small. Now that we got the required size, create another one big enough and retry.
buf := make([]windows.GUID, bufLen) buf := make([]windows.GUID, bufLen)
err = setupDiClassGuidsFromNameEx(classNameUTF16, &buf[0], bufLen, &bufLen, machineNameUTF16, 0) err = setupDiClassGuidsFromNameEx(classNameUTF16, &buf[0], bufLen, &bufLen, machineNameUTF16, 0)

View File

@ -8,7 +8,6 @@ package setupapi
import ( import (
"runtime" "runtime"
"strings" "strings"
"syscall"
"testing" "testing"
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
@ -114,7 +113,7 @@ func TestSetupDiCreateDeviceInfo(t *testing.T) {
devInfoData, err := devInfoList.CreateDeviceInfo(deviceClassNetName, &deviceClassNetGUID, "This is a test device", 0, DICD_GENERATE_ID) devInfoData, err := devInfoList.CreateDeviceInfo(deviceClassNetName, &deviceClassNetGUID, "This is a test device", 0, DICD_GENERATE_ID)
if err != nil { if err != nil {
// Access denied is expected, as the SetupDiCreateDeviceInfo() require elevation to succeed. // Access denied is expected, as the SetupDiCreateDeviceInfo() require elevation to succeed.
if errWin, ok := err.(syscall.Errno); !ok || errWin != windows.ERROR_ACCESS_DENIED { if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_ACCESS_DENIED {
t.Errorf("Error calling SetupDiCreateDeviceInfo: %s", err.Error()) t.Errorf("Error calling SetupDiCreateDeviceInfo: %s", err.Error())
} }
} else if devInfoData.ClassGUID != deviceClassNetGUID { } else if devInfoData.ClassGUID != deviceClassNetGUID {
@ -132,7 +131,7 @@ func TestSetupDiEnumDeviceInfo(t *testing.T) {
for i := 0; true; i++ { for i := 0; true; i++ {
data, err := devInfoList.EnumDeviceInfo(i) data, err := devInfoList.EnumDeviceInfo(i)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -154,7 +153,7 @@ func TestDevInfo_BuildDriverInfoList(t *testing.T) {
for i := 0; true; i++ { for i := 0; true; i++ {
deviceData, err := devInfoList.EnumDeviceInfo(i) deviceData, err := devInfoList.EnumDeviceInfo(i)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -171,7 +170,7 @@ func TestDevInfo_BuildDriverInfoList(t *testing.T) {
for j := 0; true; j++ { for j := 0; true; j++ {
driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, j) driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, j)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -265,7 +264,7 @@ func TestSetupDiGetClassDevsEx(t *testing.T) {
devInfoList.Close() devInfoList.Close()
t.Errorf("SetupDiGetClassDevsEx(nil, ...) should fail") t.Errorf("SetupDiGetClassDevsEx(nil, ...) should fail")
} else { } else {
if errWin, ok := err.(syscall.Errno); !ok || errWin != windows.ERROR_INVALID_PARAMETER { if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_PARAMETER {
t.Errorf("SetupDiGetClassDevsEx(nil, ...) should fail with ERROR_INVALID_PARAMETER") t.Errorf("SetupDiGetClassDevsEx(nil, ...) should fail with ERROR_INVALID_PARAMETER")
} }
} }
@ -281,7 +280,7 @@ func TestSetupDiOpenDevRegKey(t *testing.T) {
for i := 0; true; i++ { for i := 0; true; i++ {
data, err := devInfoList.EnumDeviceInfo(i) data, err := devInfoList.EnumDeviceInfo(i)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -305,7 +304,7 @@ func TestSetupDiGetDeviceRegistryProperty(t *testing.T) {
for i := 0; true; i++ { for i := 0; true; i++ {
data, err := devInfoList.EnumDeviceInfo(i) data, err := devInfoList.EnumDeviceInfo(i)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -335,7 +334,7 @@ func TestSetupDiGetDeviceRegistryProperty(t *testing.T) {
val, err = devInfoList.DeviceRegistryProperty(data, SPDRP_COMPATIBLEIDS) val, err = devInfoList.DeviceRegistryProperty(data, SPDRP_COMPATIBLEIDS)
if err != nil { if err != nil {
// Some devices have no SPDRP_COMPATIBLEIDS. // Some devices have no SPDRP_COMPATIBLEIDS.
if errWin, ok := err.(syscall.Errno); !ok || errWin != windows.ERROR_INVALID_DATA { if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_DATA {
t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_COMPATIBLEIDS): %s", err.Error()) t.Errorf("Error calling SetupDiGetDeviceRegistryProperty(SPDRP_COMPATIBLEIDS): %s", err.Error())
} }
} }
@ -362,7 +361,7 @@ func TestSetupDiGetDeviceInstallParams(t *testing.T) {
for i := 0; true; i++ { for i := 0; true; i++ {
data, err := devInfoList.EnumDeviceInfo(i) data, err := devInfoList.EnumDeviceInfo(i)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -400,7 +399,7 @@ func TestSetupDiClassNameFromGuidEx(t *testing.T) {
if err == nil { if err == nil {
t.Errorf("SetupDiClassNameFromGuidEx(nil) should fail") t.Errorf("SetupDiClassNameFromGuidEx(nil) should fail")
} else { } else {
if errWin, ok := err.(syscall.Errno); !ok || errWin != windows.ERROR_INVALID_USER_BUFFER { if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_USER_BUFFER {
t.Errorf("SetupDiClassNameFromGuidEx(nil) should fail with ERROR_INVALID_USER_BUFFER") t.Errorf("SetupDiClassNameFromGuidEx(nil) should fail with ERROR_INVALID_USER_BUFFER")
} }
} }
@ -441,7 +440,7 @@ func TestSetupDiGetSelectedDevice(t *testing.T) {
for i := 0; true; i++ { for i := 0; true; i++ {
data, err := devInfoList.EnumDeviceInfo(i) data, err := devInfoList.EnumDeviceInfo(i)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -464,7 +463,7 @@ func TestSetupDiGetSelectedDevice(t *testing.T) {
if err == nil { if err == nil {
t.Errorf("SetupDiSetSelectedDevice(nil) should fail") t.Errorf("SetupDiSetSelectedDevice(nil) should fail")
} else { } else {
if errWin, ok := err.(syscall.Errno); !ok || errWin != windows.ERROR_INVALID_PARAMETER { if errWin, ok := err.(windows.Errno); !ok || errWin != windows.ERROR_INVALID_PARAMETER {
t.Errorf("SetupDiSetSelectedDevice(nil) should fail with ERROR_INVALID_USER_BUFFER") t.Errorf("SetupDiSetSelectedDevice(nil) should fail with ERROR_INVALID_USER_BUFFER")
} }
} }

View File

@ -7,7 +7,6 @@ package setupapi
import ( import (
"strings" "strings"
"syscall"
"unsafe" "unsafe"
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
@ -71,7 +70,7 @@ func (data *DevInfoListDetailData) RemoteMachineName() string {
} }
func (data *DevInfoListDetailData) SetRemoteMachineName(remoteMachineName string) error { func (data *DevInfoListDetailData) SetRemoteMachineName(remoteMachineName string) error {
str, err := syscall.UTF16FromString(remoteMachineName) str, err := windows.UTF16FromString(remoteMachineName)
if err != nil { if err != nil {
return err return err
} }
@ -143,7 +142,7 @@ func (params *DevInstallParams) DriverPath() string {
} }
func (params *DevInstallParams) SetDriverPath(driverPath string) error { func (params *DevInstallParams) SetDriverPath(driverPath string) error {
str, err := syscall.UTF16FromString(driverPath) str, err := windows.UTF16FromString(driverPath)
if err != nil { if err != nil {
return err return err
} }
@ -328,7 +327,7 @@ func (data *DrvInfoData) Description() string {
} }
func (data *DrvInfoData) SetDescription(description string) error { func (data *DrvInfoData) SetDescription(description string) error {
str, err := syscall.UTF16FromString(description) str, err := windows.UTF16FromString(description)
if err != nil { if err != nil {
return err return err
} }
@ -341,7 +340,7 @@ func (data *DrvInfoData) MfgName() string {
} }
func (data *DrvInfoData) SetMfgName(mfgName string) error { func (data *DrvInfoData) SetMfgName(mfgName string) error {
str, err := syscall.UTF16FromString(mfgName) str, err := windows.UTF16FromString(mfgName)
if err != nil { if err != nil {
return err return err
} }
@ -354,7 +353,7 @@ func (data *DrvInfoData) ProviderName() string {
} }
func (data *DrvInfoData) SetProviderName(providerName string) error { func (data *DrvInfoData) SetProviderName(providerName string) error {
str, err := syscall.UTF16FromString(providerName) str, err := windows.UTF16FromString(providerName)
if err != nil { if err != nil {
return err return err
} }

View File

@ -9,7 +9,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"strings" "strings"
"syscall"
"time" "time"
"unsafe" "unsafe"
@ -112,7 +111,7 @@ func GetInterface(ifname string, hwndParent uintptr) (*Wintun, error) {
// Get the device from the list. Should anything be wrong with this device, continue with next. // Get the device from the list. Should anything be wrong with this device, continue with next.
deviceData, err := devInfoList.EnumDeviceInfo(index) deviceData, err := devInfoList.EnumDeviceInfo(index)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue
@ -144,7 +143,7 @@ func GetInterface(ifname string, hwndParent uintptr) (*Wintun, error) {
// Get a driver from the list. // Get a driver from the list.
driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, index) driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, index)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
// Something is wrong with this driver. Skip it. // Something is wrong with this driver. Skip it.
@ -239,7 +238,7 @@ func CreateInterface(description string, hwndParent uintptr) (*Wintun, bool, err
// Get a driver from the list. // Get a driver from the list.
driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, index) driverData, err := devInfoList.EnumDriverInfo(deviceData, driverType, index)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
// Something is wrong with this driver. Skip it. // Something is wrong with this driver. Skip it.
@ -434,7 +433,7 @@ func (wintun *Wintun) DeleteInterface(hwndParent uintptr) (bool, bool, error) {
// Get the device from the list. Should anything be wrong with this device, continue with next. // Get the device from the list. Should anything be wrong with this device, continue with next.
deviceData, err := devInfoList.EnumDeviceInfo(index) deviceData, err := devInfoList.EnumDeviceInfo(index)
if err != nil { if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS { if errWin, ok := err.(windows.Errno); ok && errWin == windows.ERROR_NO_MORE_ITEMS {
break break
} }
continue continue