- Set SPINT_DEFAULT, SPINT_REMOVED and SPINT_ACTIVE in interface flags
when needed
- Precise some SP_DEVINSTALL_PARAMS, by replacing them by
SP_DEVINSTALL_PARAMS_W
- Don't hardcode some constants
Modified: trunk/reactos/lib/setupapi/devinst.c
_____
Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c 2005-12-26 20:48:46 UTC
(rev 20341)
+++ trunk/reactos/lib/setupapi/devinst.c 2005-12-26 21:41:02 UTC
(rev 20342)
@@ -28,10 +28,12 @@
static const WCHAR ClassGUID[] =
{'C','l','a','s','s','G','U','I','D',0};
static const WCHAR Class[] =
{'C','l','a','s','s',0};
static const WCHAR ClassInstall32[] =
{'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0};
+static const WCHAR Control[] =
{'C','o','n','t','r','o','l',0};
static const WCHAR DeviceInstance[] =
{'D','e','v','i','c','e','I','n','s','t','a','n','c','e',0};
static const WCHAR DotCoInstallers[] =
{'.','C','o','I','n','s','t','a','l','l','e','r','s',0};
static const WCHAR DotServices[] =
{'.','S','e','r','v','i','c','e','s',0};
static const WCHAR InterfaceInstall32[] =
{'I','n','t','e','r','f','a','c','e','I','n','s','t','a','l','l','3','2'
,0};
+static const WCHAR Linked[] =
{'L','i','n','k','e','d',0};
static const WCHAR SymbolicLink[] =
{'S','y','m','b','o','l','i','c','L','i','n','k',0};
static const WCHAR Version[] =
{'V','e','r','s','i','o','n',0};
@@ -1652,6 +1654,7 @@
HeapFree(GetProcessHeap(), 0, devices);
return GetLastError();
}
+ interfaceInfo->Flags |= SPINT_ACTIVE | SPINT_DEFAULT;
InsertTailList(&deviceInfo->InterfaceListHead,
&interfaceInfo->ListEntry);
}
}
@@ -1671,6 +1674,7 @@
HKEY hInterfaceKey; /*
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID} */
HKEY hDeviceInstanceKey; /*
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{Instance
Path} */
HKEY hReferenceKey; /*
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{Instance
Path}\#{ReferenceString} */
+ HKEY hControlKey; /*
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{Instance
Path}\#{ReferenceString}\Control */
HKEY hEnumKey; /* HKLM\SYSTEM\CurrentControlSet\Enum */
HKEY hKey; /*
HKLM\SYSTEM\CurrentControlSet\Enum\{Instance\Path} */
LONG rc;
@@ -1679,6 +1683,7 @@
DWORD i, j;
DWORD dwLength, dwInstancePathLength;
DWORD dwRegType;
+ DWORD LinkedValue;
GUID ClassGuid;
struct DeviceInfoElement *deviceInfo;
@@ -1897,6 +1902,22 @@
RegCloseKey(hInterfaceKey);
return GetLastError();
}
+
+ /* Step 3. Update flags */
+ if (KeyBuffer[1] == '\0')
+ interfaceInfo->Flags |= SPINT_DEFAULT;
+ rc = RegOpenKeyExW(hReferenceKey, Control, 0,
KEY_QUERY_VALUE, &hControlKey);
+ if (!rc)
+ interfaceInfo->Flags |= SPINT_REMOVED;
+ else
+ {
+ dwLength = sizeof(DWORD);
+ if (RegQueryValueExW(hControlKey, Linked, NULL,
&dwRegType, (LPBYTE)&LinkedValue, &dwLength)
+ && dwRegType == REG_DWORD && LinkedValue)
+ interfaceInfo->Flags |= SPINT_ACTIVE;
+ RegCloseKey(hControlKey);
+ }
+
TRACE("Adding interface %s to list\n",
debugstr_w(pSymbolicLink));
HeapFree(GetProcessHeap(), 0, pSymbolicLink);
InsertTailList(&deviceInfo->InterfaceListHead,
&interfaceInfo->ListEntry);
@@ -2373,7 +2394,7 @@
memcpy(&DeviceInterfaceData->InterfaceClassGuid,
&DevItf->InterfaceClassGuid,
sizeof(GUID));
- DeviceInterfaceData->Flags = 0; /* FIXME */
+ DeviceInterfaceData->Flags = DevItf->Flags;
DeviceInterfaceData->Reserved =
(ULONG_PTR)DevItf;
Found = TRUE;
}
@@ -3532,7 +3553,7 @@
SP_DEVINSTALL_PARAMS_W InstallParams;
BOOL Result;
- InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+ InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
Result = SetupDiGetDeviceInstallParamsW(DeviceInfoSet,
DeviceInfoData, &InstallParams);
if (!Result)
goto done;
@@ -5418,7 +5439,7 @@
{
BOOL Result;
- InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+ InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
Result = SetupDiGetDeviceInstallParamsW(DeviceInfoSet,
DeviceInfoData, &InstallParams);
if (!Result)
goto done;
@@ -6302,7 +6323,7 @@
{
SP_DEVINSTALL_PARAMS InstallParams;
- InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+ InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
if (SetupDiGetDeviceInstallParamsW(DeviceInfoSet,
DeviceInfoData, &InstallParams))
{
struct DriverInfoElement *driverInfo;
@@ -6943,8 +6964,8 @@
}
default:
{
- FIXME("Unknown StateChange 0x%lx\n",
PropChange->StateChange);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ ERR("Unknown StateChange 0x%lx\n",
PropChange->StateChange);
+ SetLastError(ERROR_NOT_SUPPORTED);
}
}
@@ -7514,22 +7535,22 @@
if (rc == ERROR_SUCCESS)
rc = RegSetValueEx(hKey, L"DriverDateData", 0, REG_BINARY,
(const BYTE *)&SelectedDriver->Info.DriverDate, sizeof(FILETIME));
if (rc == ERROR_SUCCESS)
- rc = RegSetValueEx(hKey, L"DriverDesc", 0, REG_SZ, (const BYTE
*)SelectedDriver->Info.Description,
(wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR));
+ rc = RegSetValueEx(hKey, REGSTR_VAL_DRVDESC, 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", 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)
- rc = RegSetValueEx(hKey, L"InfPath", 0, REG_SZ, (const BYTE
*)SelectedDriver->Details.InfFileName,
(wcslen(SelectedDriver->Details.InfFileName) + 1) * sizeof(WCHAR));
+ rc = RegSetValueEx(hKey, REGSTR_VAL_INFPATH, 0, REG_SZ, (const
BYTE *)SelectedDriver->Details.InfFileName,
(wcslen(SelectedDriver->Details.InfFileName) + 1) * sizeof(WCHAR));
if (rc == ERROR_SUCCESS)
- rc = RegSetValueEx(hKey, L"InfSection", 0, REG_SZ, (const BYTE
*)SelectedDriver->Details.SectionName,
(wcslen(SelectedDriver->Details.SectionName) + 1) * sizeof(WCHAR));
+ rc = RegSetValueEx(hKey, REGSTR_VAL_INFSECTION, 0, REG_SZ,
(const BYTE *)SelectedDriver->Details.SectionName,
(wcslen(SelectedDriver->Details.SectionName) + 1) * sizeof(WCHAR));
if (rc == ERROR_SUCCESS)
- rc = RegSetValueEx(hKey, L"InfSectionExt", 0, REG_SZ, (const
BYTE *)&SectionName[wcslen(SelectedDriver->Details.SectionName)],
(wcslen(SectionName) - wcslen(SelectedDriver->Details.SectionName) + 1)
* sizeof(WCHAR));
+ rc = RegSetValueEx(hKey, REGSTR_VAL_INFSECTIONEXT, 0, REG_SZ,
(const BYTE *)&SectionName[wcslen(SelectedDriver->Details.SectionName)],
(wcslen(SectionName) - wcslen(SelectedDriver->Details.SectionName) + 1)
* sizeof(WCHAR));
if (rc == ERROR_SUCCESS)
- rc = RegSetValueEx(hKey, L"MatchingDeviceId", 0, REG_SZ, (const
BYTE *)SelectedDriver->MatchingId, (wcslen(SelectedDriver->MatchingId) +
1) * sizeof(WCHAR));
+ rc = RegSetValueEx(hKey, REGSTR_VAL_MATCHINGDEVID, 0, REG_SZ,
(const BYTE *)SelectedDriver->MatchingId,
(wcslen(SelectedDriver->MatchingId) + 1) * sizeof(WCHAR));
if (rc == ERROR_SUCCESS)
- rc = RegSetValueEx(hKey, L"ProviderName", 0, REG_SZ, (const
BYTE *)SelectedDriver->Info.ProviderName,
(wcslen(SelectedDriver->Info.ProviderName) + 1) * sizeof(WCHAR));
+ rc = RegSetValueEx(hKey, REGSTR_VAL_PROVIDER_NAME, 0, REG_SZ,
(const BYTE *)SelectedDriver->Info.ProviderName,
(wcslen(SelectedDriver->Info.ProviderName) + 1) * sizeof(WCHAR));
if (rc != ERROR_SUCCESS)
{
SetLastError(rc);