https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d44ed03b6c3783369b0f25cd368f598757705165

commit d44ed03b6c3783369b0f25cd368f598757705165
Author:     Eric Kohl <eric.k...@reactos.org>
AuthorDate: Wed Dec 18 23:18:36 2024 +0100
Commit:     Eric Kohl <eric.k...@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

Reply via email to