Implement SetupDiSelectBestCompatDrv, by sorting drivers by rank in
drivers list
Modified: trunk/reactos/lib/setupapi/devinst.c
_____
Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c 2005-08-27 14:56:17 UTC
(rev 17568)
+++ trunk/reactos/lib/setupapi/devinst.c 2005-08-27 14:59:22 UTC
(rev 17569)
@@ -127,6 +127,7 @@
{
LIST_ENTRY ListEntry;
+ DWORD DriverRank;
SP_DRVINFO_DATA_V2_W Info;
};
@@ -3258,6 +3259,7 @@
struct DriverInfoElement *driverInfo;
DWORD RequiredSize = 128; /* Initial buffer size */
BOOL Result = FALSE;
+ PLIST_ENTRY PreviousEntry;
LPWSTR DeviceDescription = NULL;
LPWSTR InfInstallSection = NULL;
@@ -3318,6 +3320,7 @@
TRACE("Adding driver '%S' [%S/%S] (Rank 0x%lx)\n",
DeviceDescription, InfFile, InfInstallSection, Rank);
+ driverInfo->DriverRank = Rank;
driverInfo->Info.DriverType = DriverType;
driverInfo->Info.Reserved = (ULONG_PTR)driverInfo;
wcsncpy(driverInfo->Info.Description, DeviceDescription, LINE_LEN -
1);
@@ -3333,8 +3336,24 @@
driverInfo->Info.ProviderName[0] = '\0';
driverInfo->Info.DriverDate = DriverDate;
driverInfo->Info.DriverVersion = DriverVersion;
- InsertTailList(DriverListHead, &driverInfo->ListEntry);
+ /* Insert current driver in driver list, according to its rank */
+ PreviousEntry = DriverListHead->Flink;
+ while (PreviousEntry != DriverListHead)
+ {
+ if (((struct DriverInfoElement *)PreviousEntry)->DriverRank >=
Rank)
+ {
+ /* Insert before the current item */
+ InsertHeadList(PreviousEntry, &driverInfo->ListEntry);
+ break;
+ }
+ }
+ if (PreviousEntry == DriverListHead)
+ {
+ /* Insert at the end of the list */
+ InsertTailList(DriverListHead, &driverInfo->ListEntry);
+ }
+
HeapFree(GetProcessHeap(), 0, DeviceDescription);
HeapFree(GetProcessHeap(), 0, InfInstallSection);
return TRUE;
@@ -4165,6 +4184,8 @@
*pDriverInfo = (struct DriverInfoElement *)ItemList;
DriverInfoData->Reserved = (ULONG_PTR)ItemList;
ret = TRUE;
+ TRACE("Choosing driver whose rank is 0x%lx\n",
+ ((struct DriverInfoElement
*)ItemList)->DriverRank);
}
}
}
@@ -4186,8 +4207,9 @@
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
- FIXME("SetupDiSelectBestCompatDrv() is selecting the 1st
driver...\n");
-
+ /* Drivers are sorted by rank in the driver list, so
+ * the first driver in the list is the best one.
+ */
drvInfoData.cbSize = sizeof(SP_DRVINFO_DATA_W);
ret = SetupDiEnumDriverInfoW(
DeviceInfoSet,