mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
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:
parent
86d5edc3cf
commit
9c9cb57a39
2 changed files with 56 additions and 19 deletions
|
@ -633,7 +633,7 @@ GetErrorCodeFromCrCode(const IN CONFIGRET cr)
|
|||
/* FIXME */
|
||||
return ERROR_GEN_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
/* Does not happen */
|
||||
}
|
||||
|
||||
|
@ -689,7 +689,7 @@ SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid,
|
|||
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 @@ BOOL WINAPI SetupDiEnumDeviceInfo(
|
|||
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 @@ CreateDeviceInterface(
|
|||
|
||||
*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 @@ static LONG SETUP_CreateDevListFromEnumerator(
|
|||
DWORD i = 0, j;
|
||||
DWORD dwLength, dwRegType;
|
||||
DWORD rc;
|
||||
|
||||
|
||||
/* Enumerate device IDs (subkeys of hEnumeratorKey) */
|
||||
while (TRUE)
|
||||
{
|
||||
|
@ -1632,7 +1633,7 @@ static LONG SETUP_CreateInterfaceList(
|
|||
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 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(
|
|||
{
|
||||
LPCWSTR RegistryPropertyName;
|
||||
DWORD BufferSize;
|
||||
|
||||
|
||||
switch (Property)
|
||||
{
|
||||
case SPDRP_CAPABILITIES:
|
||||
|
@ -4657,6 +4658,7 @@ AddDriverToList(
|
|||
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 @@ AddDriverToList(
|
|||
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,7 +4821,36 @@ GetVersionInformationFromInfFile(
|
|||
}
|
||||
/* 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;
|
||||
|
||||
|
@ -5881,7 +5915,7 @@ SetupDiGetDriverInfoDetailA(
|
|||
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 @@ SetupDiGetDriverInfoDetailA(
|
|||
}
|
||||
DriverInfoDataW.DriverType = DriverInfoData->DriverType;
|
||||
DriverInfoDataW.Reserved = DriverInfoData->Reserved;
|
||||
|
||||
|
||||
/* convert the strings to unicode */
|
||||
if (MultiByteToWideChar(CP_ACP,
|
||||
0,
|
||||
|
@ -6055,7 +6089,7 @@ SetupDiGetDriverInfoDetailA(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Cleanup:
|
||||
if (DriverInfoDetailDataW != NULL)
|
||||
{
|
||||
|
@ -6403,6 +6437,7 @@ SetupDiInstallDevice(
|
|||
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 @@ SetupDiInstallDevice(
|
|||
|
||||
/* 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 @@ SetupDiInstallDevice(
|
|||
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)
|
||||
|
|
|
@ -57,7 +57,7 @@ struct DeviceInterface /* Element of DeviceInfoElement.InterfaceListHead */
|
|||
*/
|
||||
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 @@ struct InfFileDetails
|
|||
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 @@ struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceIn
|
|||
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 @@ struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
|
|||
/* 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 @@ struct DeviceInfoSet /* HDEVINFO */
|
|||
* 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 @@ struct ClassImageList
|
|||
* 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;
|
||||
|
|
Loading…
Reference in a new issue