]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
setupapi: Revise DrvInfoDetailData struct size calculation
authorSimon Rozman <simon@rozman.si>
Thu, 18 Apr 2019 08:37:04 +0000 (10:37 +0200)
committerSimon Rozman <simon@rozman.si>
Thu, 18 Apr 2019 08:39:22 +0000 (10:39 +0200)
Go adds trailing padding to DrvInfoDetailData struct in GOARCH=386 which
confuses SetupAPI expecting exactly sizeof(SP_DRVINFO_DETAIL_DATA).

Signed-off-by: Simon Rozman <simon@rozman.si>
tun/wintun/setupapi/setupapi_windows.go
tun/wintun/setupapi/types_windows.go

index 71732a40e2ac88f5563e7c544c7f1bf523c2fcab..1731f4b83b630d73adf7794aabec91aa07f82ad7 100644 (file)
@@ -155,7 +155,10 @@ func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoDa
        var bufLen uint32
 
        data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
-       data.size = uint32(unsafe.Sizeof(*data))
+
+       // unsafe.Sizeof(data) >= sizeof(SP_DRVINFO_DETAIL_DATA) due to Go trailing padding. SetupAPI expects exactly sizeof(SP_DRVINFO_DETAIL_DATA).
+       sizeAPI := unsafe.Offsetof(data.hardwareID) + unsafe.Sizeof(data.hardwareID)
+       data.size = uint32(sizeAPI)
 
        err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufCapacity, &bufLen)
        if err == nil {
@@ -168,7 +171,7 @@ func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoDa
                // The buffer was too small. Now that we got the required size, create another one big enough and retry.
                buf := make([]byte, bufLen)
                data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
-               data.size = uint32(unsafe.Sizeof(*data))
+               data.size = uint32(sizeAPI)
 
                err = setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufLen, &bufLen)
                if err == nil {
index 8acb31b077fe8f4a7861a2e2882f429a1480d749..a04237d4978f2d3d9c94c0a475fc5c11f7add81b 100644 (file)
@@ -28,6 +28,7 @@ const (
 // 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.
@@ -378,7 +379,7 @@ type DrvInfoDetailData struct {
        sectionName     [LINE_LEN]uint16
        infFileName     [windows.MAX_PATH]uint16
        drvDescription  [LINE_LEN]uint16
-       hardwareID      [1]uint16
+       hardwareID      [ANYSIZE_ARRAY]uint16
 }
 
 func (data *DrvInfoDetailData) GetSectionName() string {