https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d44ed03b6c3783369b0f2…
commit d44ed03b6c3783369b0f25cd368f598757705165
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Wed Dec 18 23:18:36 2024 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Wed Dec 18 23:18:36 2024 +0100
[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