Sort drivers by rank + date, so best driver would be the most recent for the best rank Parse version field in .inf files Replace [0] in structures definition by [ANYSIZE_ARRAY], and use FIELD_OFFSET macro Remove some useless spaces Modified: trunk/reactos/lib/setupapi/devinst.c Modified: trunk/reactos/lib/setupapi/setupapi_private.h _____
Modified: trunk/reactos/lib/setupapi/devinst.c --- trunk/reactos/lib/setupapi/devinst.c 2005-12-11 11:27:05 UTC (rev 20062) +++ trunk/reactos/lib/setupapi/devinst.c 2005-12-11 11:27:08 UTC (rev 20063) @@ -633,7 +633,7 @@
/* FIXME */ return ERROR_GEN_FAILURE; } - + /* Does not happen */ }
@@ -689,7 +689,7 @@ SetLastError(ERROR_NOT_ENOUGH_MEMORY); goto cleanup; } - + strcpyW(UNCServerName + 2, MachineName); list->szData[0] = list->szData[1] = '\'; strcpyW(list->szData + 2, MachineName); @@ -750,7 +750,7 @@ else if (DeviceInfoSet && DeviceInfoSet != (HDEVINFO)INVALID_HANDLE_VALUE) { struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet; - + if (list->magic != SETUP_DEV_INFO_SET_MAGIC) SetLastError(ERROR_INVALID_HANDLE); else if (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)) @@ -1186,7 +1186,8 @@
*pDeviceInterface = NULL;
- deviceInterface = HeapAlloc(GetProcessHeap(), 0, sizeof(struct DeviceInterface) + (wcslen(SymbolicLink) + 1) * sizeof(WCHAR)); + deviceInterface = HeapAlloc(GetProcessHeap(), 0, + FIELD_OFFSET(struct DeviceInterface, SymbolicLink) + (wcslen(SymbolicLink) + 1) * sizeof(WCHAR)); if (!deviceInterface) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -1215,7 +1216,7 @@ DWORD i = 0, j; DWORD dwLength, dwRegType; DWORD rc; - + /* Enumerate device IDs (subkeys of hEnumeratorKey) */ while (TRUE) { @@ -1632,7 +1633,7 @@ RegCloseKey(hDeviceInstanceKey); continue; } - + /* Enumerate subkeys of hDeviceInstanceKey (ie "#ReferenceString" in IoRegisterDeviceInterface). Skip entries that don't start with '#' */ j = 0; while (TRUE) @@ -2568,7 +2569,7 @@ { LPCWSTR RegistryPropertyName; DWORD BufferSize; - + switch (Property) { case SPDRP_CAPABILITIES: @@ -4657,6 +4658,7 @@ driverInfo->Details.DrvDescription, InfFile, InfInstallSection, Rank);
driverInfo->DriverRank = Rank; + memcpy(&driverInfo->DriverDate, &DriverDate, sizeof(FILETIME)); memcpy(&driverInfo->ClassGuid, ClassGuid, sizeof(GUID)); driverInfo->Info.DriverType = DriverType; driverInfo->Info.Reserved = (ULONG_PTR)driverInfo; @@ -4680,7 +4682,10 @@ PreviousEntry = DriverListHead->Flink; while (PreviousEntry != DriverListHead) { - if (((struct DriverInfoElement *)PreviousEntry)->DriverRank >= Rank) + struct DriverInfoElement *CurrentDriver; + CurrentDriver = CONTAINING_RECORD(PreviousEntry, struct DriverInfoElement, ListEntry); + if (CurrentDriver->DriverRank > Rank || + (CurrentDriver->DriverRank == Rank && CurrentDriver->DriverDate.QuadPart > driverInfo->DriverDate.QuadPart)) { /* Insert before the current item */ InsertHeadList(PreviousEntry, &driverInfo->ListEntry); @@ -4816,8 +4821,37 @@ } /* Get driver version. Invalid version = 0.0.0.0 */ *DriverVersion = 0; - /* FIXME: use pVersion to fill DriverVersion variable */ + if (pVersion) + { + WORD Major, Minor = 0, Revision = 0, Build = 0; + LPWSTR pMinor = NULL, pRevision = NULL, pBuild = NULL; + LARGE_INTEGER fullVersion;
+ pMinor = strchrW(pVersion, '.'); + if (pMinor) + { + *pMinor = 0; + pRevision = strchrW(++pMinor, '.'); + Minor = atoiW(pMinor); + } + if (pRevision) + { + *pRevision = 0; + pBuild = strchrW(++pRevision, '.'); + Revision = atoiW(pRevision); + } + if (pBuild) + { + *pBuild = 0; + pBuild++; + Build = atoiW(pBuild); + } + Major = atoiW(pVersion); + fullVersion.u.HighPart = Major << 16 | Minor; + fullVersion.u.LowPart = Revision << 16 | Build; + memcpy(DriverVersion, &fullVersion, sizeof(LARGE_INTEGER)); + } + ret = TRUE;
cleanup: @@ -5881,7 +5915,7 @@ DWORD BufSize = 0; DWORD HardwareIDLen = 0; BOOL ret = FALSE; - + /* do some sanity checks, the unicode version might do more thorough checks */ if (DriverInfoData == NULL || (DriverInfoDetailData == NULL && DriverInfoDetailDataSize != 0) || @@ -5909,7 +5943,7 @@ } DriverInfoDataW.DriverType = DriverInfoData->DriverType; DriverInfoDataW.Reserved = DriverInfoData->Reserved; - + /* convert the strings to unicode */ if (MultiByteToWideChar(CP_ACP, 0, @@ -6055,7 +6089,7 @@ } } } - + Cleanup: if (DriverInfoDetailDataW != NULL) { @@ -6403,6 +6437,7 @@ HKEY hKey = INVALID_HANDLE_VALUE; HKEY hClassKey = INVALID_HANDLE_VALUE; BOOL NeedtoCopyFile; + LARGE_INTEGER fullVersion; LONG rc; BOOL ret = FALSE; /* Return value */
@@ -6515,10 +6550,11 @@
/* Write information to driver key */ *pSectionName = UNICODE_NULL; + memcpy(&fullVersion, &SelectedDriver->Info.DriverVersion, sizeof(LARGE_INTEGER)); TRACE("Write information to driver key\n"); TRACE("DriverDate : '%u-%u-%u'\n", DriverDate.wMonth, DriverDate.wDay, DriverDate.wYear); TRACE("DriverDesc : '%S'\n", SelectedDriver->Info.Description); - TRACE("DriverVersion : '%u.%u.%u.%u'\n", SelectedDriver->Info.DriverVersion & 0xff, (SelectedDriver->Info.DriverVersion >> 8) & 0xff, (SelectedDriver->Info.DriverVersion >> 16) & 0xff, (SelectedDriver->Info.DriverVersion >> 24) & 0xff); + TRACE("DriverVersion : '%u.%u.%u.%u'\n", fullVersion.HighPart >> 16, fullVersion.HighPart & 0xffff, fullVersion.LowPart >> 16, fullVersion.LowPart & 0xffff); TRACE("InfPath : '%S'\n", SelectedDriver->Details.InfFileName); TRACE("InfSection : '%S'\n", SelectedDriver->Details.SectionName); TRACE("InfSectionExt : '%S'\n", &SectionName[wcslen(SelectedDriver->Details.SectionName)]); @@ -6532,7 +6568,7 @@ rc = RegSetValueEx(hKey, L"DriverDesc", 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR)); if (rc == ERROR_SUCCESS) { - swprintf(Buffer, L"%u.%u.%u.%u", SelectedDriver->Info.DriverVersion & 0xff, (SelectedDriver->Info.DriverVersion >> 8) & 0xff, (SelectedDriver->Info.DriverVersion >> 16) & 0xff, (SelectedDriver->Info.DriverVersion >> 24) & 0xff); + swprintf(Buffer, L"%u.%u.%u.%u", fullVersion.HighPart >> 16, fullVersion.HighPart & 0xffff, fullVersion.LowPart >> 16, fullVersion.LowPart & 0xffff); rc = RegSetValueEx(hKey, L"DriverVersion", 0, REG_SZ, (const BYTE *)Buffer, (wcslen(Buffer) + 1) * sizeof(WCHAR)); } if (rc == ERROR_SUCCESS) _____
Modified: trunk/reactos/lib/setupapi/setupapi_private.h --- trunk/reactos/lib/setupapi/setupapi_private.h 2005-12-11 11:27:05 UTC (rev 20062) +++ trunk/reactos/lib/setupapi/setupapi_private.h 2005-12-11 11:27:08 UTC (rev 20063) @@ -57,7 +57,7 @@
*/ DWORD Flags;
- WCHAR SymbolicLink[0]; /* \?\ACPI#PNP0501#4&2658d0a0&0#{GUID} */ + WCHAR SymbolicLink[ANYSIZE_ARRAY]; /* \?\ACPI#PNP0501#4&2658d0a0&0#{GUID} */ };
/* We don't want to open the .inf file to read only one information in it, so keep a handle to it once it @@ -68,7 +68,7 @@ LONG References;
/* May contain no directory if the file is already in %SYSTEMROOT%\Inf */ - WCHAR FullInfFileName[0]; + WCHAR FullInfFileName[ANYSIZE_ARRAY]; };
struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceInfoElement.DriverListHead */ @@ -76,6 +76,7 @@ LIST_ENTRY ListEntry;
DWORD DriverRank; + ULARGE_INTEGER DriverDate; SP_DRVINFO_DATA_V2_W Info; SP_DRVINFO_DETAIL_DATA_W Details; GUID ClassGuid; @@ -129,7 +130,7 @@ /* List of interfaces implemented by this device */ LIST_ENTRY InterfaceListHead; /* List of struct DeviceInterface */
- WCHAR Data[0]; + WCHAR Data[ANYSIZE_ARRAY]; };
struct DeviceInfoSet /* HDEVINFO */ @@ -151,7 +152,7 @@ * or NULL if related to local machine. Points into szData field at the * end of the structure */ PCWSTR MachineName; - WCHAR szData[0]; + WCHAR szData[ANYSIZE_ARRAY]; };
struct ClassImageList @@ -162,7 +163,7 @@ * or NULL if related to local machine. Points into szData field at the * end of the structure */ PCWSTR MachineName; - WCHAR szData[0]; + WCHAR szData[ANYSIZE_ARRAY]; };
extern HINSTANCE hInstance;