[ros-diffs] [hpoussin] 24338: Rewrite SetupDiGetClassImageListExW and SetupDiGetClassImageIndex which were completly wrong Add stub for SetupDiDestroyClassImageList Now, you can see some icons in device manager

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Sun Oct 1 11:05:20 CEST 2006


Author: hpoussin
Date: Sun Oct  1 13:05:19 2006
New Revision: 24338

URL: http://svn.reactos.org/svn/reactos?rev=24338&view=rev
Log:
Rewrite SetupDiGetClassImageListExW and SetupDiGetClassImageIndex which were completly wrong
Add stub for SetupDiDestroyClassImageList
Now, you can see some icons in device manager

Modified:
    trunk/reactos/dll/win32/setupapi/devclass.c
    trunk/reactos/dll/win32/setupapi/setupapi.rbuild
    trunk/reactos/dll/win32/setupapi/setupapi_private.h
    trunk/reactos/dll/win32/setupapi/stubs.c

Modified: trunk/reactos/dll/win32/setupapi/devclass.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/devclass.c?rev=24338&r1=24337&r2=24338&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/devclass.c (original)
+++ trunk/reactos/dll/win32/setupapi/devclass.c Sun Oct  1 13:05:19 2006
@@ -670,6 +670,38 @@
 }
 
 /***********************************************************************
+ *		SetupDiDestroyClassImageList(SETUPAPI.@)
+ */
+BOOL WINAPI
+SetupDiDestroyClassImageList(
+    IN PSP_CLASSIMAGELIST_DATA ClassImageListData)
+{
+    struct ClassImageList *list;
+    BOOL ret = FALSE;
+
+    TRACE("%p\n", ClassImageListData);
+
+    if (!ClassImageListData)
+        SetLastError(ERROR_INVALID_PARAMETER);
+    else if (ClassImageListData->cbSize != sizeof(SP_CLASSIMAGELIST_DATA))
+        SetLastError(ERROR_INVALID_USER_BUFFER);
+    else if ((list = (struct ClassImageList *)ClassImageListData->Reserved) == NULL)
+        SetLastError(ERROR_INVALID_USER_BUFFER);
+    else if (list->magic != SETUP_CLASS_IMAGE_LIST_MAGIC)
+        SetLastError(ERROR_INVALID_USER_BUFFER);
+    else
+    {
+        //DestroyIcon()
+        //ImageList_Destroy();
+        FIXME("Stub %p\n", ClassImageListData);
+        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    }
+
+    TRACE("Returning %d\n", ret);
+    return ret;
+}
+
+/***********************************************************************
  *		SetupDiGetClassDescriptionA  (SETUPAPI.@)
  */
 BOOL WINAPI
@@ -1302,28 +1334,21 @@
         SetLastError(ERROR_INVALID_PARAMETER);
     else
     {
-        HKEY hKey = INVALID_HANDLE_VALUE;
-        INT iconIndex;
-
-        /* Read Icon registry entry into Buffer */
-        hKey = SetupDiOpenClassRegKeyExW(ClassGuid, KEY_QUERY_VALUE, DIOCR_INTERFACE, list->MachineName, NULL);
-        if (hKey == INVALID_HANDLE_VALUE)
-            goto cleanup;
-        if (!SETUP_GetIconIndex(hKey, &iconIndex))
-            goto cleanup;
-
-        if (iconIndex >= 0)
-        {
-            SetLastError(ERROR_INVALID_INDEX);
-            goto cleanup;
-        }
-
-        *ImageIndex = -iconIndex;
-        ret = TRUE;
-
-cleanup:
-        if (hKey != INVALID_HANDLE_VALUE)
-            RegCloseKey(hKey);
+        DWORD i;
+
+        for (i = 0; i < list->NumberOfGuids; i++)
+        {
+            if (IsEqualIID(ClassGuid, &list->Guids[i]))
+                break;
+        }
+
+        if (i == list->NumberOfGuids || list->IconIndexes[i] < 0)
+            SetLastError(ERROR_FILE_NOT_FOUND);
+        else
+        {
+            *ImageIndex = list->IconIndexes[i];
+            ret = TRUE;
+        }
     }
 
     TRACE("Returning %d\n", ret);
@@ -1388,11 +1413,24 @@
     else
     {
         struct ClassImageList *list = NULL;
+        DWORD RequiredSize;
+        HICON hIcon;
         DWORD size;
-
-        size = FIELD_OFFSET(struct ClassImageList, szData);
-        if (MachineName)
-            size += (strlenW(MachineName) + 3) * sizeof(WCHAR);
+        INT i;
+
+        /* Get list of all class GUIDs in given computer */
+        ret = SetupDiBuildClassInfoListExW(
+            0,
+            NULL,
+            0,
+            &RequiredSize,
+            MachineName,
+            NULL);
+        if (!ret && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+            goto cleanup;
+
+        size = sizeof(struct ClassImageList)
+            + (sizeof(GUID) + sizeof(INT)) * RequiredSize;
         list = HeapAlloc(GetProcessHeap(), 0, size);
         if (!list)
         {
@@ -1400,23 +1438,60 @@
             goto cleanup;
         }
         list->magic = SETUP_CLASS_IMAGE_LIST_MAGIC;
-        if (MachineName)
-        {
-            list->szData[0] = list->szData[1] = '\\';
-            strcpyW(list->szData + 2, MachineName);
-            list->MachineName = list->szData;
-        }
-        else
-        {
-            list->MachineName = NULL;
-        }
+        list->NumberOfGuids = RequiredSize;
+        list->Guids = (GUID*)(list + 1);
+        list->IconIndexes = (INT*)((ULONG_PTR)(list + 1) + sizeof(GUID) * RequiredSize);
+
+        ret = SetupDiBuildClassInfoListExW(
+            0,
+            list->Guids,
+            list->NumberOfGuids,
+            &RequiredSize,
+            MachineName,
+            NULL);
+        if (!ret)
+            goto cleanup;
+        else if (RequiredSize != list->NumberOfGuids)
+        {
+            /* Hm. Class list changed since last call. Ignore
+             * this case as it should be very rare */
+            SetLastError(ERROR_GEN_FAILURE);
+            ret = FALSE;
+            goto cleanup;
+        }
+
+        /* Prepare a HIMAGELIST */
+        InitCommonControls();
+        ClassImageListData->ImageList = ImageList_Create(16, 16, ILC_COLOR, 100, 10);
+        if (!ClassImageListData->ImageList)
+            goto cleanup;
 
         ClassImageListData->Reserved = (ULONG_PTR)list;
+
+        /* Now, we "simply" need to load icons associated with all class guids,
+         * and put their index in the image list in the IconIndexes array */
+        for (i = 0; i < list->NumberOfGuids; i++)
+        {
+            ret = SetupDiLoadClassIcon(
+                &list->Guids[i],
+                &hIcon,
+                NULL);
+            if (ret)
+                list->IconIndexes[i] = ImageList_AddIcon(ClassImageListData->ImageList, hIcon);
+            else
+                list->IconIndexes[i] = -1; /* Special value to tell that icon is unavailable */
+        }
+
         ret = TRUE;
 
 cleanup:
         if (!ret)
-            MyFree(list);
+        {
+            if (ClassImageListData->Reserved)
+                SetupDiDestroyClassImageList(ClassImageListData);
+            else if (list)
+                MyFree(list);
+        }
     }
 
     TRACE("Returning %d\n", ret);

Modified: trunk/reactos/dll/win32/setupapi/setupapi.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/setupapi.rbuild?rev=24338&r1=24337&r2=24338&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/setupapi.rbuild (original)
+++ trunk/reactos/dll/win32/setupapi/setupapi.rbuild Sun Oct  1 13:05:19 2006
@@ -17,6 +17,7 @@
 	<library>uuid</library>
 	<library>wine</library>
 	<library>ntdll</library>
+	<library>comctl32</library>
 	<library>kernel32</library>
 	<library>advapi32</library>
 	<library>user32</library>

Modified: trunk/reactos/dll/win32/setupapi/setupapi_private.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/setupapi_private.h?rev=24338&r1=24337&r2=24338&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/setupapi_private.h (original)
+++ trunk/reactos/dll/win32/setupapi/setupapi_private.h Sun Oct  1 13:05:19 2006
@@ -201,13 +201,14 @@
 {
     DWORD magic; /* SETUP_CLASS_IMAGE_LIST_MAGIC */
 
-    /* Contains the name of the remote computer ('\\COMPUTERNAME' for example),
-     * or NULL if related to local machine. Points into szData field at the
-     * end of the structure */
-    PCWSTR MachineName;
-
-    /* Variable size array (contains data for MachineName) */
-    WCHAR szData[ANYSIZE_ARRAY];
+    /* Number of GUIDs contained in Guids and IconIndexes arrays */
+    DWORD NumberOfGuids;
+    /* Array of GUIDs associated to icons of the image list. Its size
+     * is NumberOfGuids and is pointing after the end this structure */
+    GUID* Guids;
+    /* Array of corresponding icons index in the image list. Its size
+     * is NumberOfGuids and is pointing after the end this structure */
+    INT* IconIndexes;
 };
 
 extern HINSTANCE hInstance;

Modified: trunk/reactos/dll/win32/setupapi/stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/stubs.c?rev=24338&r1=24337&r2=24338&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/stubs.c (original)
+++ trunk/reactos/dll/win32/setupapi/stubs.c Sun Oct  1 13:05:19 2006
@@ -155,18 +155,6 @@
     return TRUE;
 }
 
-
-/***********************************************************************
- *		SetupDiDestroyClassImageList(SETUPAPI.@)
- */
-BOOL WINAPI SetupDiDestroyClassImageList(PSP_CLASSIMAGELIST_DATA ClassImageListData)
-{
-    FIXME ("Stub %p\n", ClassImageListData);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return TRUE;
-}
-
-
 /***********************************************************************
  *		SetupDiRegisterDeviceInfo(SETUPAPI.@)
  */




More information about the Ros-diffs mailing list