summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tun/wintun/setupapi/setupapi_windows.go24
-rw-r--r--tun/wintun/setupapi/setupapi_windows_test.go7
-rw-r--r--tun/wintun/setupapi/types_windows.go82
-rw-r--r--tun/wintun/setupapi/zsetupapi_windows.go2
4 files changed, 60 insertions, 55 deletions
diff --git a/tun/wintun/setupapi/setupapi_windows.go b/tun/wintun/setupapi/setupapi_windows.go
index cc89354..f736af5 100644
--- a/tun/wintun/setupapi/setupapi_windows.go
+++ b/tun/wintun/setupapi/setupapi_windows.go
@@ -146,36 +146,38 @@ func (deviceInfoSet DevInfo) SetSelectedDriver(deviceInfoData *DevInfoData, driv
return SetupDiSetSelectedDriver(deviceInfoSet, deviceInfoData, driverInfoData)
}
-//sys setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *_SP_DRVINFO_DETAIL_DATA, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDriverInfoDetailW
+//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) (driverInfoDetailData *DrvInfoDetailData, err error) {
+func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) {
const bufCapacity = 0x800
buf := [bufCapacity]byte{}
var bufLen uint32
- _data := (*_SP_DRVINFO_DETAIL_DATA)(unsafe.Pointer(&buf[0]))
- _data.Size = uint32(unsafe.Sizeof(*_data))
+ data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
+ data.size = uint32(unsafe.Sizeof(*data))
- err = setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, _data, bufCapacity, &bufLen)
+ err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufCapacity, &bufLen)
if err == nil {
// The buffer was was sufficiently big.
- return _data.toGo(bufLen), nil
+ data.size = bufLen
+ return data, nil
}
if errWin, ok := err.(syscall.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.
buf := make([]byte, bufLen)
- _data := (*_SP_DRVINFO_DETAIL_DATA)(unsafe.Pointer(&buf[0]))
- _data.Size = uint32(unsafe.Sizeof(*_data))
+ data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
+ data.size = uint32(unsafe.Sizeof(*data))
- err = setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, _data, bufLen, &bufLen)
+ err = setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufLen, &bufLen)
if err == nil {
- return _data.toGo(bufLen), nil
+ data.size = bufLen
+ return data, nil
}
}
- return
+ return nil, err
}
// GetDriverInfoDetail method retrieves driver information detail for a device information set or a particular device information element in the device information set.
diff --git a/tun/wintun/setupapi/setupapi_windows_test.go b/tun/wintun/setupapi/setupapi_windows_test.go
index a6dedbe..3fcf2bb 100644
--- a/tun/wintun/setupapi/setupapi_windows_test.go
+++ b/tun/wintun/setupapi/setupapi_windows_test.go
@@ -217,11 +217,12 @@ func TestDevInfo_BuildDriverInfoList(t *testing.T) {
if driverDetailData.IsCompatible("foobar-aab6e3a4-144e-4786-88d3-6cec361e1edd") {
t.Error("Invalid HWID compatibitlity reported")
}
- if !driverDetailData.IsCompatible(strings.ToUpper(driverDetailData.HardwareID)) {
+ if !driverDetailData.IsCompatible(strings.ToUpper(driverDetailData.GetHardwareID())) {
t.Error("HWID compatibitlity missed")
}
- for k := range driverDetailData.CompatIDs {
- if !driverDetailData.IsCompatible(strings.ToUpper(driverDetailData.CompatIDs[k])) {
+ a := driverDetailData.GetCompatIDs()
+ for k := range a {
+ if !driverDetailData.IsCompatible(strings.ToUpper(a[k])) {
t.Error("HWID compatibitlity missed")
}
}
diff --git a/tun/wintun/setupapi/types_windows.go b/tun/wintun/setupapi/types_windows.go
index ab5c9bb..8acb31b 100644
--- a/tun/wintun/setupapi/types_windows.go
+++ b/tun/wintun/setupapi/types_windows.go
@@ -368,75 +368,77 @@ func (data *DrvInfoData) IsNewer(driverDate windows.Filetime, driverVersion uint
return false
}
-type _SP_DRVINFO_DETAIL_DATA struct {
- Size uint32
+// DrvInfoDetailData is driver information details structure (provides detailed information about a particular driver information structure)
+type DrvInfoDetailData struct {
+ size uint32 // On input, this must be exactly the sizeof(DrvInfoDetailData). On output, we set this member to the actual size of structure data.
InfDate windows.Filetime
- CompatIDsOffset uint32
- CompatIDsLength uint32
+ compatIDsOffset uint32
+ compatIDsLength uint32
_ uintptr
- SectionName [LINE_LEN]uint16
- InfFileName [windows.MAX_PATH]uint16
- DrvDescription [LINE_LEN]uint16
- HardwareID [1]uint16
+ sectionName [LINE_LEN]uint16
+ infFileName [windows.MAX_PATH]uint16
+ drvDescription [LINE_LEN]uint16
+ hardwareID [1]uint16
}
-func (_data *_SP_DRVINFO_DETAIL_DATA) toGo(bufLen uint32) (DriverInfoDetailData *DrvInfoDetailData) {
- DriverInfoDetailData = &DrvInfoDetailData{
- InfDate: _data.InfDate,
- SectionName: windows.UTF16ToString(_data.SectionName[:]),
- InfFileName: windows.UTF16ToString(_data.InfFileName[:]),
- DrvDescription: windows.UTF16ToString(_data.DrvDescription[:]),
- CompatIDs: []string{},
- }
+func (data *DrvInfoDetailData) GetSectionName() string {
+ return windows.UTF16ToString(data.sectionName[:])
+}
- bufW := _data.getBuf(bufLen)
+func (data *DrvInfoDetailData) GetInfFileName() string {
+ return windows.UTF16ToString(data.infFileName[:])
+}
+
+func (data *DrvInfoDetailData) GetDrvDescription() string {
+ return windows.UTF16ToString(data.drvDescription[:])
+}
- if _data.CompatIDsOffset > 1 {
- DriverInfoDetailData.HardwareID = windows.UTF16ToString(bufW[:wcslen(bufW)])
+func (data *DrvInfoDetailData) GetHardwareID() string {
+ if data.compatIDsOffset > 1 {
+ bufW := data.getBuf()
+ return windows.UTF16ToString(bufW[:wcslen(bufW)])
}
- if _data.CompatIDsLength > 0 {
- bufW = bufW[_data.CompatIDsOffset : _data.CompatIDsOffset+_data.CompatIDsLength]
+ return ""
+}
+
+func (data *DrvInfoDetailData) GetCompatIDs() []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 {
- DriverInfoDetailData.CompatIDs = append(DriverInfoDetailData.CompatIDs, windows.UTF16ToString(bufW[i:j]))
+ a = append(a, windows.UTF16ToString(bufW[i:j]))
}
i = j + 1
}
}
- return
+ return a
}
-func (_data *_SP_DRVINFO_DETAIL_DATA) getBuf(bufLen uint32) []uint16 {
- len := (bufLen - uint32(unsafe.Offsetof(_data.HardwareID))) / 2
+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)}
+ }{&data.hardwareID[0], int(len), int(len)}
return *(*[]uint16)(unsafe.Pointer(&sl))
}
-// DrvInfoDetailData is driver information details structure (provides detailed information about a particular driver information structure)
-type DrvInfoDetailData struct {
- InfDate windows.Filetime
- SectionName string
- InfFileName string
- DrvDescription string
- HardwareID string
- CompatIDs []string
-}
-
// IsCompatible method tests if given hardware ID matches the driver or is listed on the compatible ID list.
-func (driverInfoDetailData *DrvInfoDetailData) IsCompatible(hwid string) bool {
+func (data *DrvInfoDetailData) IsCompatible(hwid string) bool {
hwidLC := strings.ToLower(hwid)
- if strings.ToLower(driverInfoDetailData.HardwareID) == hwidLC {
+ if strings.ToLower(data.GetHardwareID()) == hwidLC {
return true
}
- for i := range driverInfoDetailData.CompatIDs {
- if strings.ToLower(driverInfoDetailData.CompatIDs[i]) == hwidLC {
+ a := data.GetCompatIDs()
+ for i := range a {
+ if strings.ToLower(a[i]) == hwidLC {
return true
}
}
diff --git a/tun/wintun/setupapi/zsetupapi_windows.go b/tun/wintun/setupapi/zsetupapi_windows.go
index 01bf377..248672e 100644
--- a/tun/wintun/setupapi/zsetupapi_windows.go
+++ b/tun/wintun/setupapi/zsetupapi_windows.go
@@ -187,7 +187,7 @@ func SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData
return
}
-func setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *_SP_DRVINFO_DETAIL_DATA, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) {
+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 {