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

svn path=/trunk/; revision=20063
This commit is contained in:
Hervé Poussineau 2005-12-11 11:27:08 +00:00
parent 86d5edc3cf
commit 9c9cb57a39
2 changed files with 56 additions and 19 deletions

View file

@ -633,7 +633,7 @@ GetErrorCodeFromCrCode(const IN CONFIGRET cr)
/* FIXME */ /* FIXME */
return ERROR_GEN_FAILURE; return ERROR_GEN_FAILURE;
} }
/* Does not happen */ /* Does not happen */
} }
@ -689,7 +689,7 @@ SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid,
SetLastError(ERROR_NOT_ENOUGH_MEMORY); SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto cleanup; goto cleanup;
} }
strcpyW(UNCServerName + 2, MachineName); strcpyW(UNCServerName + 2, MachineName);
list->szData[0] = list->szData[1] = '\\'; list->szData[0] = list->szData[1] = '\\';
strcpyW(list->szData + 2, MachineName); strcpyW(list->szData + 2, MachineName);
@ -750,7 +750,7 @@ BOOL WINAPI SetupDiEnumDeviceInfo(
else if (DeviceInfoSet && DeviceInfoSet != (HDEVINFO)INVALID_HANDLE_VALUE) else if (DeviceInfoSet && DeviceInfoSet != (HDEVINFO)INVALID_HANDLE_VALUE)
{ {
struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet; struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
if (list->magic != SETUP_DEV_INFO_SET_MAGIC) if (list->magic != SETUP_DEV_INFO_SET_MAGIC)
SetLastError(ERROR_INVALID_HANDLE); SetLastError(ERROR_INVALID_HANDLE);
else if (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)) else if (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
@ -1186,7 +1186,8 @@ CreateDeviceInterface(
*pDeviceInterface = NULL; *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) if (!deviceInterface)
{ {
SetLastError(ERROR_NOT_ENOUGH_MEMORY); SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@ -1215,7 +1216,7 @@ static LONG SETUP_CreateDevListFromEnumerator(
DWORD i = 0, j; DWORD i = 0, j;
DWORD dwLength, dwRegType; DWORD dwLength, dwRegType;
DWORD rc; DWORD rc;
/* Enumerate device IDs (subkeys of hEnumeratorKey) */ /* Enumerate device IDs (subkeys of hEnumeratorKey) */
while (TRUE) while (TRUE)
{ {
@ -1632,7 +1633,7 @@ static LONG SETUP_CreateInterfaceList(
RegCloseKey(hDeviceInstanceKey); RegCloseKey(hDeviceInstanceKey);
continue; continue;
} }
/* Enumerate subkeys of hDeviceInstanceKey (ie "#ReferenceString" in IoRegisterDeviceInterface). Skip entries that don't start with '#' */ /* Enumerate subkeys of hDeviceInstanceKey (ie "#ReferenceString" in IoRegisterDeviceInterface). Skip entries that don't start with '#' */
j = 0; j = 0;
while (TRUE) while (TRUE)
@ -2568,7 +2569,7 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(
{ {
LPCWSTR RegistryPropertyName; LPCWSTR RegistryPropertyName;
DWORD BufferSize; DWORD BufferSize;
switch (Property) switch (Property)
{ {
case SPDRP_CAPABILITIES: case SPDRP_CAPABILITIES:
@ -4657,6 +4658,7 @@ AddDriverToList(
driverInfo->Details.DrvDescription, InfFile, InfInstallSection, Rank); driverInfo->Details.DrvDescription, InfFile, InfInstallSection, Rank);
driverInfo->DriverRank = Rank; driverInfo->DriverRank = Rank;
memcpy(&driverInfo->DriverDate, &DriverDate, sizeof(FILETIME));
memcpy(&driverInfo->ClassGuid, ClassGuid, sizeof(GUID)); memcpy(&driverInfo->ClassGuid, ClassGuid, sizeof(GUID));
driverInfo->Info.DriverType = DriverType; driverInfo->Info.DriverType = DriverType;
driverInfo->Info.Reserved = (ULONG_PTR)driverInfo; driverInfo->Info.Reserved = (ULONG_PTR)driverInfo;
@ -4680,7 +4682,10 @@ AddDriverToList(
PreviousEntry = DriverListHead->Flink; PreviousEntry = DriverListHead->Flink;
while (PreviousEntry != DriverListHead) 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 */ /* Insert before the current item */
InsertHeadList(PreviousEntry, &driverInfo->ListEntry); InsertHeadList(PreviousEntry, &driverInfo->ListEntry);
@ -4816,7 +4821,36 @@ GetVersionInformationFromInfFile(
} }
/* Get driver version. Invalid version = 0.0.0.0 */ /* Get driver version. Invalid version = 0.0.0.0 */
*DriverVersion = 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; ret = TRUE;
@ -5881,7 +5915,7 @@ SetupDiGetDriverInfoDetailA(
DWORD BufSize = 0; DWORD BufSize = 0;
DWORD HardwareIDLen = 0; DWORD HardwareIDLen = 0;
BOOL ret = FALSE; BOOL ret = FALSE;
/* do some sanity checks, the unicode version might do more thorough checks */ /* do some sanity checks, the unicode version might do more thorough checks */
if (DriverInfoData == NULL || if (DriverInfoData == NULL ||
(DriverInfoDetailData == NULL && DriverInfoDetailDataSize != 0) || (DriverInfoDetailData == NULL && DriverInfoDetailDataSize != 0) ||
@ -5909,7 +5943,7 @@ SetupDiGetDriverInfoDetailA(
} }
DriverInfoDataW.DriverType = DriverInfoData->DriverType; DriverInfoDataW.DriverType = DriverInfoData->DriverType;
DriverInfoDataW.Reserved = DriverInfoData->Reserved; DriverInfoDataW.Reserved = DriverInfoData->Reserved;
/* convert the strings to unicode */ /* convert the strings to unicode */
if (MultiByteToWideChar(CP_ACP, if (MultiByteToWideChar(CP_ACP,
0, 0,
@ -6055,7 +6089,7 @@ SetupDiGetDriverInfoDetailA(
} }
} }
} }
Cleanup: Cleanup:
if (DriverInfoDetailDataW != NULL) if (DriverInfoDetailDataW != NULL)
{ {
@ -6403,6 +6437,7 @@ SetupDiInstallDevice(
HKEY hKey = INVALID_HANDLE_VALUE; HKEY hKey = INVALID_HANDLE_VALUE;
HKEY hClassKey = INVALID_HANDLE_VALUE; HKEY hClassKey = INVALID_HANDLE_VALUE;
BOOL NeedtoCopyFile; BOOL NeedtoCopyFile;
LARGE_INTEGER fullVersion;
LONG rc; LONG rc;
BOOL ret = FALSE; /* Return value */ BOOL ret = FALSE; /* Return value */
@ -6515,10 +6550,11 @@ SetupDiInstallDevice(
/* Write information to driver key */ /* Write information to driver key */
*pSectionName = UNICODE_NULL; *pSectionName = UNICODE_NULL;
memcpy(&fullVersion, &SelectedDriver->Info.DriverVersion, sizeof(LARGE_INTEGER));
TRACE("Write information to driver key\n"); TRACE("Write information to driver key\n");
TRACE("DriverDate : '%u-%u-%u'\n", DriverDate.wMonth, DriverDate.wDay, DriverDate.wYear); TRACE("DriverDate : '%u-%u-%u'\n", DriverDate.wMonth, DriverDate.wDay, DriverDate.wYear);
TRACE("DriverDesc : '%S'\n", SelectedDriver->Info.Description); 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("InfPath : '%S'\n", SelectedDriver->Details.InfFileName);
TRACE("InfSection : '%S'\n", SelectedDriver->Details.SectionName); TRACE("InfSection : '%S'\n", SelectedDriver->Details.SectionName);
TRACE("InfSectionExt : '%S'\n", &SectionName[wcslen(SelectedDriver->Details.SectionName)]); TRACE("InfSectionExt : '%S'\n", &SectionName[wcslen(SelectedDriver->Details.SectionName)]);
@ -6532,7 +6568,7 @@ SetupDiInstallDevice(
rc = RegSetValueEx(hKey, L"DriverDesc", 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR)); rc = RegSetValueEx(hKey, L"DriverDesc", 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR));
if (rc == ERROR_SUCCESS) 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)); rc = RegSetValueEx(hKey, L"DriverVersion", 0, REG_SZ, (const BYTE *)Buffer, (wcslen(Buffer) + 1) * sizeof(WCHAR));
} }
if (rc == ERROR_SUCCESS) if (rc == ERROR_SUCCESS)

View file

@ -57,7 +57,7 @@ struct DeviceInterface /* Element of DeviceInfoElement.InterfaceListHead */
*/ */
DWORD Flags; 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 /* 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 @@ struct InfFileDetails
LONG References; LONG References;
/* May contain no directory if the file is already in %SYSTEMROOT%\Inf */ /* 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 */ struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceInfoElement.DriverListHead */
@ -76,6 +76,7 @@ struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceIn
LIST_ENTRY ListEntry; LIST_ENTRY ListEntry;
DWORD DriverRank; DWORD DriverRank;
ULARGE_INTEGER DriverDate;
SP_DRVINFO_DATA_V2_W Info; SP_DRVINFO_DATA_V2_W Info;
SP_DRVINFO_DETAIL_DATA_W Details; SP_DRVINFO_DETAIL_DATA_W Details;
GUID ClassGuid; GUID ClassGuid;
@ -129,7 +130,7 @@ struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
/* List of interfaces implemented by this device */ /* List of interfaces implemented by this device */
LIST_ENTRY InterfaceListHead; /* List of struct DeviceInterface */ LIST_ENTRY InterfaceListHead; /* List of struct DeviceInterface */
WCHAR Data[0]; WCHAR Data[ANYSIZE_ARRAY];
}; };
struct DeviceInfoSet /* HDEVINFO */ struct DeviceInfoSet /* HDEVINFO */
@ -151,7 +152,7 @@ struct DeviceInfoSet /* HDEVINFO */
* or NULL if related to local machine. Points into szData field at the * or NULL if related to local machine. Points into szData field at the
* end of the structure */ * end of the structure */
PCWSTR MachineName; PCWSTR MachineName;
WCHAR szData[0]; WCHAR szData[ANYSIZE_ARRAY];
}; };
struct ClassImageList struct ClassImageList
@ -162,7 +163,7 @@ struct ClassImageList
* or NULL if related to local machine. Points into szData field at the * or NULL if related to local machine. Points into szData field at the
* end of the structure */ * end of the structure */
PCWSTR MachineName; PCWSTR MachineName;
WCHAR szData[0]; WCHAR szData[ANYSIZE_ARRAY];
}; };
extern HINSTANCE hInstance; extern HINSTANCE hInstance;