[SETUPAPI][PSDK] Implement SetupDiGetCustomDevicePropertyW

This commit is contained in:
Eric Kohl 2024-12-18 23:18:36 +01:00
parent 1e06829961
commit d44ed03b6c
3 changed files with 82 additions and 1 deletions

View file

@ -6150,3 +6150,83 @@ SetupDiRestartDevices(
return TRUE; return TRUE;
} }
/***********************************************************************
* SetupDiGetCustomDevicePropertyW (SETUPAPI.@)
*/
BOOL
WINAPI
SetupDiGetCustomDevicePropertyW(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN PCWSTR CustomPropertyName,
IN DWORD Flags,
OUT PDWORD PropertyRegDataType OPTIONAL,
OUT PBYTE PropertyBuffer,
IN DWORD PropertyBufferSize,
OUT PDWORD RequiredSize OPTIONAL)
{
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
struct DeviceInfo *deviceInfo;
DWORD ConfigFlags = 0, PropertySize;
CONFIGRET cr;
TRACE("%s(%p %p %s 0x%lx %p %p %lu %p)\n", __FUNCTION__, DeviceInfoSet, DeviceInfoData,
debugstr_w(CustomPropertyName), Flags, PropertyRegDataType, PropertyBuffer, PropertyBufferSize, RequiredSize);
if (!DeviceInfoSet || DeviceInfoSet == INVALID_HANDLE_VALUE)
{
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (set->magic != SETUP_DEVICE_INFO_SET_MAGIC)
{
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!DeviceInfoData || DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)
|| !DeviceInfoData->Reserved)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (Flags & ~DICUSTOMDEVPROP_MERGE_MULTISZ)
{
SetLastError(ERROR_INVALID_FLAGS);
return FALSE;
}
deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
if (deviceInfo->set != set)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (Flags & DICUSTOMDEVPROP_MERGE_MULTISZ)
{
ConfigFlags |= CM_CUSTOMDEVPROP_MERGE_MULTISZ;
}
PropertySize = PropertyBufferSize;
cr = CM_Get_DevInst_Custom_Property_ExW(deviceInfo->dnDevInst,
CustomPropertyName,
PropertyRegDataType,
PropertyBuffer,
&PropertySize,
ConfigFlags,
set->hMachine);
if ((cr == CR_SUCCESS) || (cr == CR_BUFFER_SMALL))
{
if (RequiredSize)
*RequiredSize = PropertySize;
}
if (cr != CR_SUCCESS)
{
SetLastError(GetErrorCodeFromCrCode(cr));
return FALSE;
}
return TRUE;
}

View file

@ -316,7 +316,7 @@
@ stdcall SetupDiGetClassRegistryPropertyA(ptr long ptr ptr long ptr str ptr) @ stdcall SetupDiGetClassRegistryPropertyA(ptr long ptr ptr long ptr str ptr)
@ stdcall SetupDiGetClassRegistryPropertyW(ptr long ptr ptr long ptr wstr ptr) @ stdcall SetupDiGetClassRegistryPropertyW(ptr long ptr ptr long ptr wstr ptr)
@ stub SetupDiGetCustomDevicePropertyA @ stub SetupDiGetCustomDevicePropertyA
@ stub SetupDiGetCustomDevicePropertyW @ stdcall SetupDiGetCustomDevicePropertyW(ptr ptr wstr long ptr ptr long ptr)
@ stdcall SetupDiGetDeviceInfoListClass(ptr ptr) @ stdcall SetupDiGetDeviceInfoListClass(ptr ptr)
@ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr) @ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr)
@ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr) @ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr)

View file

@ -117,6 +117,7 @@ extern "C" {
#define DICS_START 4 #define DICS_START 4
#define DICS_FLAG_CONFIGGENERAL 4 #define DICS_FLAG_CONFIGGENERAL 4
#define DICS_STOP 5 #define DICS_STOP 5
#define DICUSTOMDEVPROP_MERGE_MULTISZ 0x00000001
#define DIF_SELECTDEVICE 1 #define DIF_SELECTDEVICE 1
#define DIF_INSTALLDEVICE 2 #define DIF_INSTALLDEVICE 2
#define DIF_ASSIGNRESOURCES 3 #define DIF_ASSIGNRESOURCES 3