diff --git a/setupapi/setupapi_windows_test.go b/setupapi/setupapi_windows_test.go index 3d9abd6..9f45a6f 100644 --- a/setupapi/setupapi_windows_test.go +++ b/setupapi/setupapi_windows_test.go @@ -177,6 +177,28 @@ func TestDevInfo_BuildDriverInfoList(t *testing.T) { continue } + if !driverData.IsNewer(windows.Filetime{}, 0) { + t.Error("Driver should have non-zero date and version") + } + if !driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime}, 0) { + t.Error("Driver should have non-zero date and version") + } + if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime + 1}, 0) { + t.Error("Driver should report newer version on high-date-time") + } + if !driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime}, 0) { + t.Error("Driver should have non-zero version") + } + if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime + 1}, 0) { + t.Error("Driver should report newer version on low-date-time") + } + if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime}, driverData.DriverVersion) { + t.Error("Driver should not be newer than itself") + } + if driverData.IsNewer(windows.Filetime{HighDateTime: driverData.DriverDate.HighDateTime, LowDateTime: driverData.DriverDate.LowDateTime}, driverData.DriverVersion+1) { + t.Error("Driver should report newer version on version") + } + err = devInfoList.SetSelectedDriver(deviceData, driverData) if err != nil { t.Errorf("Error calling SetupDiSetSelectedDriver: %s", err.Error()) diff --git a/setupapi/types_windows.go b/setupapi/types_windows.go index 0eb640c..2dfcb70 100644 --- a/setupapi/types_windows.go +++ b/setupapi/types_windows.go @@ -321,6 +321,32 @@ func (data SP_DRVINFO_DATA) ToGo() *DrvInfoData { } } +// IsNewer method returns true if SP_DRVINFO_DATA date and version is newer than supplied parameters. +func (data SP_DRVINFO_DATA) IsNewer(DriverDate windows.Filetime, DriverVersion uint64) bool { + if data.DriverDate.HighDateTime > DriverDate.HighDateTime { + return true + } + if data.DriverDate.HighDateTime < DriverDate.HighDateTime { + return false + } + + if data.DriverDate.LowDateTime > DriverDate.LowDateTime { + return true + } + if data.DriverDate.LowDateTime < DriverDate.LowDateTime { + return false + } + + if data.DriverVersion > DriverVersion { + return true + } + if data.DriverVersion < DriverVersion { + return false + } + + return false +} + // DrvInfoData is driver information structure (member of a driver info list that may be associated with a particular device instance, or (globally) with a device information set) type DrvInfoData struct { DriverType uint32