]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Add support for setupapi.SetupDiClassNameFromGuid()
authorSimon Rozman <simon@rozman.si>
Mon, 4 Feb 2019 07:23:55 +0000 (08:23 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 5 Feb 2019 11:59:42 +0000 (12:59 +0100)
Signed-off-by: Simon Rozman <simon@rozman.si>
setupapi/setupapi_windows.go
setupapi/setupapi_windows_test.go
setupapi/types_windows.go
setupapi/zsetupapi_windows.go

index c7a42c1645898c52adf16ba6b210736237445ced..df00aad3488e753cbeaf9e24c6120a2b6002c9d0 100644 (file)
@@ -13,6 +13,7 @@ import (
        "golang.org/x/sys/windows/registry"
 )
 
+//sys  setupDiClassNameFromGuid(ClassGUID *windows.GUID, ClassName *uint16, ClassNameSize uint32, RequiredSize *uint32) (err error) = setupapi.SetupDiClassNameFromGuidW
 //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
 //sys  SetupDiDestroyDeviceInfoList(DeviceInfoSet DevInfo) (err error) = setupapi.SetupDiDestroyDeviceInfoList
 //sys  setupDiGetDeviceInfoListDetail(DeviceInfoSet DevInfo, DeviceInfoSetDetailData *_SP_DEVINFO_LIST_DETAIL_DATA) (err error) = setupapi.SetupDiGetDeviceInfoListDetailW
@@ -24,6 +25,19 @@ import (
 //sys  SetupDiSetClassInstallParams(DeviceInfoSet DevInfo, DeviceInfoData *SP_DEVINFO_DATA, ClassInstallParams *SP_CLASSINSTALL_HEADER, ClassInstallParamsSize uint32) (err error) = setupapi.SetupDiSetClassInstallParamsW
 //sys  SetupDiCallClassInstaller(InstallFunction DI_FUNCTION, DeviceInfoSet DevInfo, DeviceInfoData *SP_DEVINFO_DATA) (err error) = setupapi.SetupDiCallClassInstaller
 
+// SetupDiClassNameFromGuid function retrieves the class name associated with a class GUID.
+func SetupDiClassNameFromGuid(ClassGUID *windows.GUID) (ClassName string, err error) {
+       var _p0 [MAX_CLASS_NAME_LEN]uint16
+
+       err = setupDiClassNameFromGuid(ClassGUID, &_p0[0], MAX_CLASS_NAME_LEN, nil)
+       if err != nil {
+               return
+       }
+
+       ClassName = windows.UTF16ToString(_p0[:])
+       return
+}
+
 // 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 _p0 *uint16
index 1d3c33d5257488440d6a630e17addf7710e4657e..e26032d7b3d765bfd4ca64dfd4577f615751c0b5 100644 (file)
@@ -6,6 +6,7 @@
 package setupapi
 
 import (
+       "strings"
        "syscall"
        "testing"
 
@@ -19,6 +20,24 @@ func init() {
        computerName, _ = windows.ComputerName()
 }
 
+func TestSetupDiClassNameFromGuid(t *testing.T) {
+       className, err := SetupDiClassNameFromGuid(&deviceClassNetGUID)
+       if err != nil {
+               t.Errorf("Error calling SetupDiClassNameFromGuid: %s", err.Error())
+       } else if strings.ToLower(className) != "net" {
+               t.Errorf("SetupDiClassNameFromGuid(%x) should return \"Net\"", deviceClassNetGUID)
+       }
+
+       _, err = SetupDiClassNameFromGuid(nil)
+       if err == nil {
+               t.Errorf("SetupDiClassNameFromGuid(nil) should fail")
+       } else {
+               if errWin, ok := err.(syscall.Errno); !ok || errWin != 1784 /*ERROR_INVALID_USER_BUFFER*/ {
+                       t.Errorf("SetupDiClassNameFromGuid(nil) should fail with ERROR_INVALID_USER_BUFFER")
+               }
+       }
+}
+
 func TestSetupDiGetClassDevsEx(t *testing.T) {
        devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "PCI", 0, DIGCF_PRESENT, DevInfo(0), computerName)
        if err == nil {
index bc6f66b28617941c4ca7710780f29c19ceaaa3c2..fa47a5a4c971422fbfcd7ccbfbf475cd4db12a2b 100644 (file)
@@ -9,6 +9,17 @@ import (
        "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
+)
+
 // DIGCF flags controll what is included in the device information set built by SetupDiGetClassDevs
 type DIGCF uint32
 
index a8c61ada58ccc850d374d311a2d6c2bf83adbe81..082bde42ed3a8c590331e19cd28bc3a020bbbbcb 100644 (file)
@@ -39,6 +39,7 @@ func errnoErr(e syscall.Errno) error {
 var (
        modsetupapi = windows.NewLazySystemDLL("setupapi.dll")
 
+       procSetupDiClassNameFromGuidW       = modsetupapi.NewProc("SetupDiClassNameFromGuidW")
        procSetupDiGetClassDevsExW          = modsetupapi.NewProc("SetupDiGetClassDevsExW")
        procSetupDiDestroyDeviceInfoList    = modsetupapi.NewProc("SetupDiDestroyDeviceInfoList")
        procSetupDiGetDeviceInfoListDetailW = modsetupapi.NewProc("SetupDiGetDeviceInfoListDetailW")
@@ -51,6 +52,18 @@ var (
        procSetupDiCallClassInstaller       = modsetupapi.NewProc("SetupDiCallClassInstaller")
 )
 
+func setupDiClassNameFromGuid(ClassGUID *windows.GUID, ClassName *uint16, ClassNameSize uint32, RequiredSize *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procSetupDiClassNameFromGuidW.Addr(), 4, uintptr(unsafe.Pointer(ClassGUID)), uintptr(unsafe.Pointer(ClassName)), uintptr(ClassNameSize), uintptr(unsafe.Pointer(RequiredSize)), 0, 0)
+       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)