From f1dc167901aeba499cbed20e7134009702026020 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Fri, 19 Apr 2019 10:05:04 +0200 Subject: [PATCH] setupapi: Fix struct size mismatches Signed-off-by: Simon Rozman --- tun/wintun/setupapi/setupapi_windows.go | 9 +++------ tun/wintun/setupapi/types_windows.go | 4 ++-- tun/wintun/setupapi/types_windows_386.go | 11 +++++++++++ tun/wintun/setupapi/types_windows_amd64.go | 11 +++++++++++ 4 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 tun/wintun/setupapi/types_windows_386.go create mode 100644 tun/wintun/setupapi/types_windows_amd64.go diff --git a/tun/wintun/setupapi/setupapi_windows.go b/tun/wintun/setupapi/setupapi_windows.go index 8524558..dec9da2 100644 --- a/tun/wintun/setupapi/setupapi_windows.go +++ b/tun/wintun/setupapi/setupapi_windows.go @@ -34,7 +34,7 @@ func SetupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr, // 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 = uint32(unsafe.Sizeof(*data)) + data.size = sizeofDevInfoListDetailData return data, setupDiGetDeviceInfoListDetail(deviceInfoSet, data) } @@ -155,10 +155,7 @@ func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoDa var bufLen uint32 data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0])) - - // unsafe.Sizeof(data) >= sizeof(SP_DRVINFO_DETAIL_DATA) due to Go trailing padding. SetupAPI expects exactly sizeof(SP_DRVINFO_DETAIL_DATA). - sizeAPI := ((unsafe.Sizeof(uintptr(0)) - 1) | (unsafe.Offsetof(data.hardwareID) + unsafe.Sizeof(data.hardwareID) - 1) + 1) - data.size = uint32(sizeAPI) + data.size = sizeofDrvInfoDetailData err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufCapacity, &bufLen) if err == nil { @@ -171,7 +168,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(sizeAPI) + data.size = sizeofDrvInfoDetailData err = setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufLen, &bufLen) if err == nil { diff --git a/tun/wintun/setupapi/types_windows.go b/tun/wintun/setupapi/types_windows.go index a04237d..863bd7b 100644 --- a/tun/wintun/setupapi/types_windows.go +++ b/tun/wintun/setupapi/types_windows.go @@ -60,7 +60,7 @@ type DevInfoData struct { // DevInfoListDetailData is a structure for detailed information on a device information set (used for SetupDiGetDeviceInfoListDetail which supercedes the functionality of SetupDiGetDeviceInfoListClass). type DevInfoListDetailData struct { - size uint32 + 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 @@ -371,7 +371,7 @@ func (data *DrvInfoData) IsNewer(driverDate windows.Filetime, driverVersion uint // 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. + size uint32 // Warning: unsafe.Sizeof(DrvInfoDetailData) > sizeof(SP_DRVINFO_DETAIL_DATA) when GOARCH == 386 => use sizeofDrvInfoDetailData const. InfDate windows.Filetime compatIDsOffset uint32 compatIDsLength uint32 diff --git a/tun/wintun/setupapi/types_windows_386.go b/tun/wintun/setupapi/types_windows_386.go new file mode 100644 index 0000000..132f921 --- /dev/null +++ b/tun/wintun/setupapi/types_windows_386.go @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package setupapi + +const ( + sizeofDevInfoListDetailData uint32 = 550 + sizeofDrvInfoDetailData uint32 = 1570 +) diff --git a/tun/wintun/setupapi/types_windows_amd64.go b/tun/wintun/setupapi/types_windows_amd64.go new file mode 100644 index 0000000..d4dd65c --- /dev/null +++ b/tun/wintun/setupapi/types_windows_amd64.go @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package setupapi + +const ( + sizeofDevInfoListDetailData uint32 = 560 + sizeofDrvInfoDetailData uint32 = 1584 +)