mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 08:13:00 +00:00
Implement most of SetupDiGetClassDevPropertySheetsW
svn path=/trunk/; revision=19695
This commit is contained in:
parent
c06fa82588
commit
2a40c47f4e
2 changed files with 152 additions and 39 deletions
|
@ -72,6 +72,11 @@ typedef DWORD
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
IN OUT PCOINSTALLER_CONTEXT_DATA Context);
|
IN OUT PCOINSTALLER_CONTEXT_DATA Context);
|
||||||
|
typedef BOOL
|
||||||
|
(WINAPI* PROPERTY_PAGE_PROVIDER) (
|
||||||
|
IN PSP_PROPSHEETPAGE_REQUEST PropPageRequest,
|
||||||
|
IN LPFNADDPROPSHEETPAGE fAddFunc,
|
||||||
|
IN LPARAM lParam);
|
||||||
|
|
||||||
struct CoInstallerElement
|
struct CoInstallerElement
|
||||||
{
|
{
|
||||||
|
@ -3468,9 +3473,9 @@ BOOL WINAPI SetupDiSetDeviceInstallParamsW(
|
||||||
BOOL WINAPI SetupDiGetDeviceInstanceIdA(
|
BOOL WINAPI SetupDiGetDeviceInstanceIdA(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData,
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
||||||
OUT PSTR DeviceInstanceId,
|
OUT PSTR DeviceInstanceId OPTIONAL,
|
||||||
IN DWORD DeviceInstanceIdSize,
|
IN DWORD DeviceInstanceIdSize,
|
||||||
OUT PDWORD RequiredSize)
|
OUT PDWORD RequiredSize OPTIONAL)
|
||||||
{
|
{
|
||||||
PWSTR DeviceInstanceIdW = NULL;
|
PWSTR DeviceInstanceIdW = NULL;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
@ -3504,7 +3509,7 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdA(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Returning 0x%p\n", ret);
|
TRACE("Returning %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3514,9 +3519,9 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdA(
|
||||||
BOOL WINAPI SetupDiGetDeviceInstanceIdW(
|
BOOL WINAPI SetupDiGetDeviceInstanceIdW(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData,
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
||||||
OUT PWSTR DeviceInstanceId,
|
OUT PWSTR DeviceInstanceId OPTIONAL,
|
||||||
IN DWORD DeviceInstanceIdSize,
|
IN DWORD DeviceInstanceIdSize,
|
||||||
OUT PDWORD RequiredSize)
|
OUT PDWORD RequiredSize OPTIONAL)
|
||||||
{
|
{
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
@ -3553,7 +3558,146 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdW(
|
||||||
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Returning 0x%p\n", ret);
|
TRACE("Returning %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiGetClassDevPropertySheetsA(SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI SetupDiGetClassDevPropertySheetsA(
|
||||||
|
IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
|
IN LPPROPSHEETHEADERA PropertySheetHeader,
|
||||||
|
IN DWORD PropertySheetHeaderPageListSize,
|
||||||
|
OUT PDWORD RequiredSize OPTIONAL,
|
||||||
|
IN DWORD PropertySheetType)
|
||||||
|
{
|
||||||
|
FIXME ("Stub %p %p %p %d %p %d\n",
|
||||||
|
DeviceInfoSet, DeviceInfoData, PropertySheetHeader, PropertySheetHeaderPageListSize,
|
||||||
|
RequiredSize, PropertySheetType);
|
||||||
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL WINAPI GetClassDevPropertySheetsCallback(
|
||||||
|
IN HPROPSHEETPAGE hPropSheetPage,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
FIXME("Need to add a property page!\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiGetClassDevPropertySheetsW(SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI SetupDiGetClassDevPropertySheetsW(
|
||||||
|
IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
|
IN LPPROPSHEETHEADERW PropertySheetHeader,
|
||||||
|
IN DWORD PropertySheetHeaderPageListSize,
|
||||||
|
OUT PDWORD RequiredSize OPTIONAL,
|
||||||
|
IN DWORD PropertySheetType)
|
||||||
|
{
|
||||||
|
struct DeviceInfoSet *list;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
TRACE("%p %p %p 0%lx %p 0x%lx\n", DeviceInfoSet, DeviceInfoData,
|
||||||
|
PropertySheetHeader, PropertySheetHeaderPageListSize,
|
||||||
|
RequiredSize, PropertySheetType);
|
||||||
|
|
||||||
|
if (!DeviceInfoSet)
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
else if (((struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC)
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC)
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
else if (!PropertySheetHeader)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (DeviceInfoData && DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
|
||||||
|
SetLastError(ERROR_INVALID_USER_BUFFER);
|
||||||
|
else if (!DeviceInfoData && IsEqualIID(&list->ClassGuid, &GUID_NULL))
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (!PropertySheetHeader)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (PropertySheetType != DIGCDP_FLAG_ADVANCED
|
||||||
|
&& PropertySheetType != DIGCDP_FLAG_BASIC
|
||||||
|
/* FIXME: && PropertySheetType != DIGCDP_FLAG_REMOTE_ADVANCED
|
||||||
|
&& PropertySheetType != DIGCDP_FLAG_REMOTE_BASIC*/)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HKEY hKey = INVALID_HANDLE_VALUE;
|
||||||
|
SP_PROPSHEETPAGE_REQUEST Request;
|
||||||
|
LPWSTR PropPageProvider = NULL;
|
||||||
|
HMODULE hModule = NULL;
|
||||||
|
PROPERTY_PAGE_PROVIDER pPropPageProvider = NULL;
|
||||||
|
DWORD dwLength, dwRegType;
|
||||||
|
DWORD rc;
|
||||||
|
|
||||||
|
if (DeviceInfoData)
|
||||||
|
hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_QUERY_VALUE);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* FIXME: what if DeviceInfoSet is a remote device info set? */
|
||||||
|
hKey = SetupDiOpenClassRegKey(&list->ClassGuid, KEY_QUERY_VALUE);
|
||||||
|
}
|
||||||
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rc = RegQueryValueExW(hKey, L"EnumPropPages32", NULL, &dwRegType, NULL, &dwLength);
|
||||||
|
if (rc == ERROR_FILE_NOT_FOUND)
|
||||||
|
{
|
||||||
|
/* No registry key. As it is optional, don't say it's a bad error */
|
||||||
|
if (RequiredSize)
|
||||||
|
*RequiredSize = 0;
|
||||||
|
ret = TRUE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
else if (rc != ERROR_SUCCESS && dwRegType != REG_SZ)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
PropPageProvider = HeapAlloc(GetProcessHeap(), 0, dwLength + sizeof(WCHAR));
|
||||||
|
if (!PropPageProvider)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
rc = RegQueryValueExW(hKey, L"EnumPropPages32", NULL, NULL, (LPBYTE)PropPageProvider, &dwLength);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
PropPageProvider[dwLength / sizeof(WCHAR)] = 0;
|
||||||
|
|
||||||
|
rc = GetFunctionPointer(PropPageProvider, &hModule, (PVOID*)&pPropPageProvider);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
Request.cbSize = sizeof(SP_PROPSHEETPAGE_REQUEST);
|
||||||
|
Request.PageRequested = SPPSR_ENUM_ADV_DEVICE_PROPERTIES;
|
||||||
|
Request.DeviceInfoSet = DeviceInfoSet;
|
||||||
|
Request.DeviceInfoData = DeviceInfoData;
|
||||||
|
if (RequiredSize)
|
||||||
|
*RequiredSize = 0; /* FIXME */
|
||||||
|
pPropPageProvider(&Request, GetClassDevPropertySheetsCallback, (LPARAM)0);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (hKey != INVALID_HANDLE_VALUE)
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
HeapFree(GetProcessHeap(), 0, PropPageProvider);
|
||||||
|
FreeFunctionPointer(hModule, pPropPageProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Returning %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4289,7 +4433,6 @@ cleanup:
|
||||||
HeapFree(GetProcessHeap(), 0, ProviderName);
|
HeapFree(GetProcessHeap(), 0, ProviderName);
|
||||||
HeapFree(GetProcessHeap(), 0, DriverVer);
|
HeapFree(GetProcessHeap(), 0, DriverVer);
|
||||||
|
|
||||||
TRACE("Returning %d\n", ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5719,7 +5862,7 @@ SetupDiRegisterCoDeviceInstallers(
|
||||||
DWORD DoAction;
|
DWORD DoAction;
|
||||||
WCHAR SectionName[MAX_PATH];
|
WCHAR SectionName[MAX_PATH];
|
||||||
DWORD SectionNameLength = 0;
|
DWORD SectionNameLength = 0;
|
||||||
HKEY hKey = INVALID_HANDLE_VALUE;;
|
HKEY hKey = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
|
InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
|
||||||
Result = SetupDiGetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams);
|
Result = SetupDiGetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams);
|
||||||
|
|
|
@ -226,36 +226,6 @@ BOOL WINAPI SetupDiDestroyClassImageList(PSP_CLASSIMAGELIST_DATA ClassImageListD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* SetupDiGetClassDevPropertySheetsA(SETUPAPI.@)
|
|
||||||
*/
|
|
||||||
BOOL WINAPI SetupDiGetClassDevPropertySheetsA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,
|
|
||||||
LPPROPSHEETHEADERA PropertySheetHeader,
|
|
||||||
DWORD PropertySheetHeaderPageListSize, PDWORD RequiredSize,
|
|
||||||
DWORD PropertySheetType)
|
|
||||||
{
|
|
||||||
FIXME ("Stub %p %p %p %d %p %d\n",
|
|
||||||
DeviceInfoSet, DeviceInfoData, PropertySheetHeader, PropertySheetHeaderPageListSize,
|
|
||||||
RequiredSize, PropertySheetType);
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* SetupDiGetClassDevPropertySheetsW(SETUPAPI.@)
|
|
||||||
*/
|
|
||||||
BOOL WINAPI SetupDiGetClassDevPropertySheetsW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,
|
|
||||||
LPPROPSHEETHEADERW PropertySheetHeader,
|
|
||||||
DWORD PropertySheetHeaderPageListSize, PDWORD RequiredSize,
|
|
||||||
DWORD PropertySheetType)
|
|
||||||
{
|
|
||||||
FIXME ("Stub %p %p %p %d %p %d\n",
|
|
||||||
DeviceInfoSet, DeviceInfoData, PropertySheetHeader, PropertySheetHeaderPageListSize,
|
|
||||||
RequiredSize, PropertySheetType);
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiLoadClassIcon(SETUPAPI.@)
|
* SetupDiLoadClassIcon(SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue