[ros-diffs] [janderwald] 44661: [SETUPAPI] - Implement SetupDiOpenDeviceInterfaceRegKey

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sun Dec 20 01:53:21 CET 2009


Author: janderwald
Date: Sun Dec 20 01:53:21 2009
New Revision: 44661

URL: http://svn.reactos.org/svn/reactos?rev=44661&view=rev
Log:
[SETUPAPI]
- Implement SetupDiOpenDeviceInterfaceRegKey

Modified:
    trunk/reactos/dll/win32/setupapi/interface.c
    trunk/reactos/dll/win32/setupapi/stubs.c

Modified: trunk/reactos/dll/win32/setupapi/interface.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/interface.c?rev=44661&r1=44660&r2=44661&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/interface.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/setupapi/interface.c [iso-8859-1] Sun Dec 20 01:53:21 2009
@@ -337,11 +337,9 @@
     IN HDEVINFO DeviceInfoSet,
     IN struct DeviceInfo *devInfo)
 {
-    BOOL ret;
     HKEY hKey, hRefKey;
     LPWSTR Path;
     SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
-    PLIST_ENTRY InterfaceListEntry;
     struct DeviceInterface *DevItf = NULL;
 
     if (InterfaceFlags != 0)
@@ -425,6 +423,8 @@
         SetLastError(ERROR_INVALID_HANDLE);
     else if (!DeviceInfoData)
         SetLastError(ERROR_INVALID_PARAMETER);
+    else if (DeviceInfoData && DeviceInfoData->Reserved == 0)
+        SetLastError(ERROR_INVALID_USER_BUFFER);
     else if (DeviceInfoData && DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
         SetLastError(ERROR_INVALID_USER_BUFFER);
     else
@@ -537,3 +537,87 @@
     TRACE("Returning %d\n", ret);
     return ret;
 }
+
+HKEY WINAPI
+SetupDiOpenDeviceInterfaceRegKey(
+    IN HDEVINFO  DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData, IN DWORD  Reserved, IN REGSAM  samDesired)
+{
+    HKEY hKey = INVALID_HANDLE_VALUE, hDevKey;
+    struct DeviceInfoSet * list;
+
+    TRACE("%p %p %p 0x%08x 0x%08x)\n", DeviceInfoSet, DeviceInterfaceData, Reserved, samDesired);
+
+    if (!DeviceInfoSet)
+        SetLastError(ERROR_INVALID_PARAMETER);
+    else if (DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE)
+        SetLastError(ERROR_INVALID_HANDLE);
+    else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEVICE_INFO_SET_MAGIC)
+        SetLastError(ERROR_INVALID_HANDLE);
+    else if (!DeviceInterfaceData)
+        SetLastError(ERROR_INVALID_PARAMETER);
+    else if (DeviceInterfaceData && DeviceInterfaceData->Reserved == 0)
+        SetLastError(ERROR_INVALID_USER_BUFFER);
+    else if (DeviceInterfaceData && DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA))
+        SetLastError(ERROR_INVALID_USER_BUFFER);
+    else
+    {
+        struct DeviceInterface *DevItf;
+        LPWSTR Path, Guid, Slash;
+        DWORD Length;
+        DevItf = (struct DeviceInterface *)DeviceInterfaceData->Reserved;
+
+        Length = wcslen(DevItf->SymbolicLink);
+
+        Path = HeapAlloc(GetProcessHeap(), 0, (Length+2) * sizeof(WCHAR));
+        if (!Path)
+        {
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            return INVALID_HANDLE_VALUE;
+        }
+
+        wcscpy(Path, DevItf->SymbolicLink);
+
+        Guid = wcsrchr(Path, '}');
+        Slash = wcsrchr(Path, '\\');
+        if (!Guid || !Slash)
+        {
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return INVALID_HANDLE_VALUE;
+        }
+
+        if ((ULONG_PTR)Slash > (ULONG_PTR)Guid)
+        {
+            /* Create an extra slash */
+            memmove(Slash+1, Slash, (wcslen(Slash) + 1) * sizeof(WCHAR));
+            Slash[1] = L'#';
+        }
+
+        Guid = Path;
+        while((ULONG_PTR)Guid < (ULONG_PTR)Slash)
+        {
+            if (*Guid == L'\\')
+                *Guid = L'#';
+
+            Guid++;
+        }
+
+        hKey = SetupDiOpenClassRegKeyExW(&DeviceInterfaceData->InterfaceClassGuid, samDesired, DIOCR_INTERFACE, NULL, NULL);
+        if (hKey != INVALID_HANDLE_VALUE)
+        {
+            if (RegOpenKeyExW(hKey, Path, 0, samDesired, &hDevKey) == ERROR_SUCCESS)
+            {
+                RegCloseKey(hKey);
+                hKey = hDevKey;
+            }
+            else
+            {
+                RegCloseKey(hKey);
+                hKey = INVALID_HANDLE_VALUE;
+            }
+        }
+
+        HeapFree(GetProcessHeap(), 0, Path);
+    }
+
+    return hKey;
+}

Modified: trunk/reactos/dll/win32/setupapi/stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/stubs.c?rev=44661&r1=44660&r2=44661&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/setupapi/stubs.c [iso-8859-1] Sun Dec 20 01:53:21 2009
@@ -241,8 +241,4 @@
     return FALSE;
 }
 
-HKEY WINAPI SetupDiOpenDeviceInterfaceRegKey(IN HDEVINFO  DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData, IN DWORD  Reserved, IN REGSAM  samDesired)
-{
-    FIXME("%p %p %p 0x%08x 0x%08x: stub\n", DeviceInfoSet, DeviceInterfaceData, Reserved, samDesired);
-    return INVALID_HANDLE_VALUE;
-}
+




More information about the Ros-diffs mailing list