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

commit b667d82f0bd7a0be6c0e4ece3dd77f530976bee8
Author:     Eric Kohl <eric.k...@reactos.org>
AuthorDate: Mon Dec 9 21:53:08 2024 +0100
Commit:     Eric Kohl <eric.k...@reactos.org>
CommitDate: Mon Dec 9 21:53:35 2024 +0100

    [SETUPAPI] Implement CM_Set_Class_Registry_PropertyA()
---
 dll/win32/setupapi/cfgmgr.c | 71 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 69 insertions(+), 2 deletions(-)

diff --git a/dll/win32/setupapi/cfgmgr.c b/dll/win32/setupapi/cfgmgr.c
index ffef4d5590c..bfd1da4a5f7 100644
--- a/dll/win32/setupapi/cfgmgr.c
+++ b/dll/win32/setupapi/cfgmgr.c
@@ -7843,10 +7843,77 @@ CM_Set_Class_Registry_PropertyA(
     _In_ ULONG ulFlags,
     _In_opt_ HMACHINE hMachine)
 {
-    FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
+    LPWSTR lpBuffer;
+    ULONG ulType;
+    CONFIGRET ret;
+
+    TRACE("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
           ClassGuid, ulProperty, Buffer, ulLength, ulFlags, hMachine);
 
-    return CR_CALL_NOT_IMPLEMENTED;
+    if (ClassGuid == NULL)
+        return CR_INVALID_POINTER;
+
+    if ((Buffer == NULL) && (ulLength != 0))
+        return CR_INVALID_POINTER;
+
+    if (ulFlags != 0)
+        return CR_INVALID_FLAG;
+
+    if (Buffer == NULL)
+    {
+        ret = CM_Set_Class_Registry_PropertyW(ClassGuid,
+                                              ulProperty,
+                                              Buffer,
+                                              ulLength,
+                                              ulFlags,
+                                              hMachine);
+    }
+    else
+    {
+        /* Get property type */
+        ulType = GetRegistryPropertyType(ulProperty);
+
+        /* Allocate buffer if needed */
+        if ((ulType == REG_SZ) || (ulType == REG_MULTI_SZ))
+        {
+            lpBuffer = MyMalloc(ulLength * sizeof(WCHAR));
+            if (lpBuffer == NULL)
+            {
+                ret = CR_OUT_OF_MEMORY;
+            }
+            else
+            {
+                if (!MultiByteToWideChar(CP_ACP, 0, Buffer,
+                                         ulLength, lpBuffer, ulLength))
+                {
+                    MyFree(lpBuffer);
+                    ret = CR_FAILURE;
+                }
+                else
+                {
+                    ret = CM_Set_Class_Registry_PropertyW(ClassGuid,
+                                                          ulProperty,
+                                                          lpBuffer,
+                                                          ulLength * 
sizeof(WCHAR),
+                                                          ulFlags,
+                                                          hMachine);
+                    MyFree(lpBuffer);
+                }
+            }
+        }
+        else
+        {
+            ret = CM_Set_Class_Registry_PropertyW(ClassGuid,
+                                                  ulProperty,
+                                                  Buffer,
+                                                  ulLength,
+                                                  ulFlags,
+                                                  hMachine);
+        }
+
+    }
+
+    return ret;
 }
 
 

Reply via email to