@@ -33,6 +33,8 @@ public partial class DSEForm : Form
3333 private Color savedBackColor ;
3434 private Color savedForeColor ;
3535
36+ private HashSet < DriverStoreEntry > driversWithNewerDate = new HashSet < DriverStoreEntry > ( ) ;
37+
3638 private static readonly IUpdateManager UpdateManager = new UpdateManager ( ) ;
3739
3840 private static readonly ICollection < CultureInfo > SupportedLanguage = DSEFormHelper . GetSupportedLanguage ( ) ;
@@ -336,6 +338,7 @@ private async Task PopulateUIWithDriverStoreEntries()
336338 this . ShowStatus ( Status . Normal , Language . Message_Scanning_Driver_Store ) ;
337339 this . lstDriverStoreEntries . EmptyListMsg = Language . Message_Scanning_Driver_Store ;
338340 this . lstDriverStoreEntries . ClearObjects ( ) ;
341+ this . driversWithNewerDate . Clear ( ) ;
339342
340343 var driverStoreEntries = await Task . Run ( ( ) => this . driverStore . EnumeratePackages ( ) ) . ConfigureAwait ( true ) ;
341344 this . lstDriverStoreEntries . SetObjects ( driverStoreEntries ) ;
@@ -804,18 +807,39 @@ private void CtxMenuSelectOldDrivers_Click(object sender, EventArgs e)
804807 queryEntries = queryEntries . Where ( entry => entry . BootCritical != true ) ;
805808 }
806809
807- var oldDriversToSelect = queryEntries
810+ var driverGroups = queryEntries
808811 . Where ( entry => entry . DriverInfName != "ntprint.inf" )
809812 . GroupBy ( entry => new { entry . DriverClass , entry . DriverExtensionId , entry . DriverPkgProvider , entry . DriverInfName } )
810- . SelectMany ( drivers => drivers
813+ . Select ( drivers => drivers
811814 . GroupBy ( entry => new { entry . DriverVersion , entry . DriverDate } )
812815 . OrderByDescending ( g => g . Key . DriverVersion )
813816 . ThenByDescending ( g => g . Key . DriverDate )
817+ . ToList ( ) )
818+ . Where ( groups => groups . Count > 1 )
819+ . ToList ( ) ;
820+
821+ var oldDriversToSelect = driverGroups
822+ . SelectMany ( groups => groups
814823 . Skip ( 1 )
815824 . Where ( g => g . All ( entry => string . IsNullOrEmpty ( entry . DeviceName ) ) )
816825 . SelectMany ( g => g ) )
817826 . ToArray ( ) ;
818827
828+ // Find old drivers whose date is newer than the newest version's date.
829+ this . driversWithNewerDate . Clear ( ) ;
830+
831+ foreach ( var groups in driverGroups )
832+ {
833+ var newestDate = groups [ 0 ] . Key . DriverDate ;
834+
835+ foreach ( var entry in groups . Skip ( 1 )
836+ . Where ( g => g . Key . DriverDate > newestDate && g . All ( e => string . IsNullOrEmpty ( e . DeviceName ) ) )
837+ . SelectMany ( g => g ) )
838+ {
839+ this . driversWithNewerDate . Add ( entry ) ;
840+ }
841+ }
842+
819843 if ( oldDriversToSelect . Length == 0 )
820844 {
821845 this . ShowStatus ( Status . Warning , Language . Message_No_Old_Drivers_Found ) ;
@@ -1093,14 +1117,22 @@ private async void ChooseDriverStoreToolStripMenuItem_Click(object sender, Event
10931117
10941118 private void LstDriverStoreEntries_FormatCell ( object sender , BrightIdeasSoftware . FormatCellEventArgs e )
10951119 {
1120+ DriverStoreEntry entry = ( DriverStoreEntry ) e . Model ;
1121+
10961122 if ( e . ColumnIndex == this . deviceNameColumn . Index )
10971123 {
1098- DriverStoreEntry entry = ( DriverStoreEntry ) e . Model ;
10991124 if ( entry . DevicePresent == false )
11001125 {
11011126 e . SubItem . ForeColor = Color . Gray ;
11021127 }
11031128 }
1129+ else if ( e . ColumnIndex == this . driverDateColumn . Index )
1130+ {
1131+ if ( this . driversWithNewerDate . Contains ( entry ) )
1132+ {
1133+ e . SubItem . ForeColor = Color . OrangeRed ;
1134+ }
1135+ }
11041136 }
11051137
11061138 private void LstDriverStoreEntries_FormatRow ( object sender , BrightIdeasSoftware . FormatRowEventArgs e )
0 commit comments