mirror of
https://github.com/reactos/reactos.git
synced 2025-06-12 01:28:30 +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 */
|
/* 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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue