From d44ed03b6c3783369b0f25cd368f598757705165 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 18 Dec 2024 23:18:36 +0100 Subject: [PATCH] [SETUPAPI][PSDK] Implement SetupDiGetCustomDevicePropertyW --- dll/win32/setupapi/devinst.c | 80 ++++++++++++++++++++++++++++++++ dll/win32/setupapi/setupapi.spec | 2 +- sdk/include/psdk/setupapi.h | 1 + 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/dll/win32/setupapi/devinst.c b/dll/win32/setupapi/devinst.c index 47e2bf8beaa..53e99ba5d29 100644 --- a/dll/win32/setupapi/devinst.c +++ b/dll/win32/setupapi/devinst.c @@ -6150,3 +6150,83 @@ SetupDiRestartDevices( 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; +} diff --git a/dll/win32/setupapi/setupapi.spec b/dll/win32/setupapi/setupapi.spec index 1c86bb655ac..3a15bffab48 100644 --- a/dll/win32/setupapi/setupapi.spec +++ b/dll/win32/setupapi/setupapi.spec @@ -316,7 +316,7 @@ @ stdcall SetupDiGetClassRegistryPropertyA(ptr long ptr ptr long ptr str ptr) @ stdcall SetupDiGetClassRegistryPropertyW(ptr long ptr ptr long ptr wstr ptr) @ stub SetupDiGetCustomDevicePropertyA -@ stub SetupDiGetCustomDevicePropertyW +@ stdcall SetupDiGetCustomDevicePropertyW(ptr ptr wstr long ptr ptr long ptr) @ stdcall SetupDiGetDeviceInfoListClass(ptr ptr) @ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr) @ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr) diff --git a/sdk/include/psdk/setupapi.h b/sdk/include/psdk/setupapi.h index efe15a7b0bf..b209c8f00bb 100644 --- a/sdk/include/psdk/setupapi.h +++ b/sdk/include/psdk/setupapi.h @@ -117,6 +117,7 @@ extern "C" { #define DICS_START 4 #define DICS_FLAG_CONFIGGENERAL 4 #define DICS_STOP 5 +#define DICUSTOMDEVPROP_MERGE_MULTISZ 0x00000001 #define DIF_SELECTDEVICE 1 #define DIF_INSTALLDEVICE 2 #define DIF_ASSIGNRESOURCES 3