Juan Lang : setupapi: Implement SetupDiCreateDeviceInterfaceRegKeyA/W.

Alexandre Julliard julliard at winehq.org
Mon Sep 24 08:08:04 CDT 2007


Module: wine
Branch: master
Commit: 21b7e1faf66e9a04473cf97c49a10d4545fa8be7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=21b7e1faf66e9a04473cf97c49a10d4545fa8be7

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Sep 21 17:07:16 2007 -0700

setupapi: Implement SetupDiCreateDeviceInterfaceRegKeyA/W.

---

 dlls/setupapi/devinst.c |  105 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 101 insertions(+), 4 deletions(-)

diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 9593b1c..6d90d15 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -2171,9 +2171,27 @@ HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyA(
         HINF InfHandle,
         PCSTR InfSectionName)
 {
-    FIXME("%p %p %d %08x %p %p\n", DeviceInfoSet, DeviceInterfaceData, Reserved,
+    HKEY key;
+    PWSTR InfSectionNameW = NULL;
+
+    TRACE("%p %p %d %08x %p %p\n", DeviceInfoSet, DeviceInterfaceData, Reserved,
             samDesired, InfHandle, InfSectionName);
-    return INVALID_HANDLE_VALUE;
+    if (InfHandle)
+    {
+        if (!InfSectionName)
+        {
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return INVALID_HANDLE_VALUE;
+        }
+        InfSectionNameW = MultiByteToUnicode(InfSectionName, CP_ACP);
+        if (!InfSectionNameW)
+            return INVALID_HANDLE_VALUE;
+    }
+    key = SetupDiCreateDeviceInterfaceRegKeyW(DeviceInfoSet,
+            DeviceInterfaceData, Reserved, samDesired, InfHandle,
+            InfSectionNameW);
+    MyFree(InfSectionNameW);
+    return key;
 }
 
 /***********************************************************************
@@ -2187,9 +2205,88 @@ HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW(
         HINF InfHandle,
         PCWSTR InfSectionName)
 {
-    FIXME("%p %p %d %08x %p %p\n", DeviceInfoSet, DeviceInterfaceData, Reserved,
+    struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
+    HKEY key = INVALID_HANDLE_VALUE, interfacesKey;
+    LONG l;
+
+    TRACE("%p %p %d %08x %p %p\n", DeviceInfoSet, DeviceInterfaceData, Reserved,
             samDesired, InfHandle, InfSectionName);
-    return INVALID_HANDLE_VALUE;
+
+    if (!DeviceInfoSet || DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE ||
+            set->magic != SETUP_DEVICE_INFO_SET_MAGIC)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return INVALID_HANDLE_VALUE;
+    }
+    if (!DeviceInterfaceData ||
+            DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA) ||
+            !DeviceInterfaceData->Reserved)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return INVALID_HANDLE_VALUE;
+    }
+    if (InfHandle && !InfSectionName)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return INVALID_HANDLE_VALUE;
+    }
+    if (!(l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, DeviceClasses, 0, NULL, 0,
+                    samDesired, NULL, &interfacesKey, NULL)))
+    {
+        HKEY parent;
+        WCHAR bracedGuidString[39];
+
+        SETUPDI_GuidToString(&DeviceInterfaceData->InterfaceClassGuid,
+                bracedGuidString);
+        if (!(l = RegCreateKeyExW(interfacesKey, bracedGuidString, 0, NULL, 0,
+                        samDesired, NULL, &parent, NULL)))
+        {
+            static const WCHAR hash[] = {'#',0};
+            struct InterfaceInfo *ifaceInfo =
+                (struct InterfaceInfo *)DeviceInterfaceData->Reserved;
+            LPCWSTR instancePath = NULL;
+            LPWSTR referencePath = NULL;
+
+            if (ifaceInfo->referenceString)
+            {
+                referencePath = HeapAlloc(GetProcessHeap(), 0,
+                        (lstrlenW(ifaceInfo->referenceString) + 2) *
+                        sizeof(WCHAR));
+                if (referencePath)
+                {
+                    lstrcpyW(referencePath, hash);
+                    lstrcatW(referencePath, ifaceInfo->referenceString);
+                    instancePath = referencePath;
+                }
+                else
+                    SetLastError(ERROR_OUTOFMEMORY);
+            }
+            else
+                instancePath = hash;
+            if (instancePath)
+            {
+                LONG l;
+
+                l = RegCreateKeyExW(parent, instancePath, 0, NULL, 0,
+                        samDesired, NULL, &key, NULL);
+                if (l)
+                {
+                    SetLastError(l);
+                    key = INVALID_HANDLE_VALUE;
+                }
+                else if (InfHandle)
+                    FIXME("INF section installation unsupported\n");
+            }
+            HeapFree(GetProcessHeap(), 0, referencePath);
+            RegCloseKey(parent);
+        }
+        else
+            SetLastError(l);
+        RegCloseKey(interfacesKey);
+    }
+    else
+        SetLastError(l);
+    return key;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list