[ros-diffs] [gedmurphy] 24396: - Open the device propsheet for child items (not parents as there isn't much point) - Tag the Device ID onto the treeview items and provide functionality to tear it down - Remove/change some code which wasn't needed to speed up opening time3 - We now have a pretty functional device manager. However it's heavily reliant on devmgr.dll, therefore functionality per device will rely on how complete this lib is.

gedmurphy at svn.reactos.org gedmurphy at svn.reactos.org
Wed Oct 4 18:39:46 CEST 2006


Author: gedmurphy
Date: Wed Oct  4 20:39:45 2006
New Revision: 24396

URL: http://svn.reactos.org/svn/reactos?rev=24396&view=rev
Log:
- Open the device propsheet for child items (not parents as there isn't much point)
- Tag the Device ID onto the treeview items and provide functionality to tear it down
- Remove/change some code which wasn't needed to speed up opening time3
- We now have a pretty functional device manager. However it's heavily reliant on devmgr.dll, therefore functionality per device will rely on how complete this lib is.

Modified:
    trunk/reactos/base/applications/devmgmt/devmgmt.rbuild
    trunk/reactos/base/applications/devmgmt/enumdevices.c
    trunk/reactos/base/applications/devmgmt/mainwnd.c
    trunk/reactos/base/applications/devmgmt/precomp.h

Modified: trunk/reactos/base/applications/devmgmt/devmgmt.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/devmgmt/devmgmt.rbuild?rev=24396&r1=24395&r2=24396&view=diff
==============================================================================
--- trunk/reactos/base/applications/devmgmt/devmgmt.rbuild (original)
+++ trunk/reactos/base/applications/devmgmt/devmgmt.rbuild Wed Oct  4 20:39:45 2006
@@ -15,6 +15,7 @@
 		<library>user32</library>
 		<library>comctl32</library>
 		<library>advapi32</library>
+		<library>devmgr</library>
 		<compilationunit name="unit.c">
 			<file>about.c</file>
 			<file>devmgmt.c</file>

Modified: trunk/reactos/base/applications/devmgmt/enumdevices.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/devmgmt/enumdevices.c?rev=24396&r1=24395&r2=24396&view=diff
==============================================================================
--- trunk/reactos/base/applications/devmgmt/enumdevices.c (original)
+++ trunk/reactos/base/applications/devmgmt/enumdevices.c Wed Oct  4 20:39:45 2006
@@ -12,10 +12,84 @@
 static SP_CLASSIMAGELIST_DATA ImageListData;
 static HDEVINFO hDevInfo;
 
-
-VOID OpenPropSheet(HTREEITEM hItem)
-{
-    DisplayString(_T("Device Propsheet not yet implemented"));
+VOID
+FreeDeviceStrings(HWND hTV)
+{
+    HTREEITEM hItem;
+
+    hItem = TreeView_GetRoot(hTV);
+
+    if (hItem)
+    {
+        hItem = TreeView_GetChild(hTV,
+                                  hItem);
+        /* loop the parent items */
+        while (hItem)
+        {
+            hItem = TreeView_GetChild(hTV,
+                                      hItem);
+            if (hItem == NULL)
+                break;
+
+            /* loop the child items and free the DeviceID */
+            while (TRUE)
+            {
+                HTREEITEM hOldItem;
+                TV_ITEM tvItem;
+                //TCHAR Buf[100];
+
+                tvItem.hItem = hItem;
+                tvItem.mask = TVIF_PARAM;// | TVIF_TEXT;
+                //tvItem.pszText = Buf;
+                //tvItem.cchTextMax = 99;
+
+                (void)TreeView_GetItem(hTV, &tvItem);
+
+                //MessageBox(NULL, Buf, NULL, 0);
+
+                HeapFree(GetProcessHeap(),
+                         0,
+                         (LPTSTR)tvItem.lParam);
+
+                hOldItem = hItem;
+
+                hItem = TreeView_GetNextSibling(hTV,
+                                                hItem);
+                if (hItem == NULL)
+                {
+                    hItem = hOldItem;
+                    break;
+                }
+            }
+
+            hItem = TreeView_GetParent(hTV,
+                                       hItem);
+            hItem = TreeView_GetNextSibling(hTV,
+                                            hItem);
+        }
+    }
+}
+
+
+VOID
+OpenPropSheet(HWND hTV,
+              HTREEITEM hItem)
+{
+    TV_ITEM tvItem;
+
+    tvItem.hItem = hItem;
+    tvItem.mask = TVIF_PARAM;
+
+    if (TreeView_GetItem(hTV, &tvItem) &&
+        (LPTSTR)tvItem.lParam != NULL)
+    {
+        DevicePropertiesExW(hTV,
+                            NULL,
+                            (LPTSTR)tvItem.lParam,
+                            0,
+                            FALSE);
+    }
+
 }
 
 
@@ -23,6 +97,7 @@
 InsertIntoTreeView(HWND hTV,
                    HTREEITEM hRoot,
                    LPTSTR lpLabel,
+                   LPTSTR DeviceID,
                    INT DevImage)
 {
     TV_ITEM tvi;
@@ -31,9 +106,10 @@
     ZeroMemory(&tvi, sizeof(tvi));
     ZeroMemory(&tvins, sizeof(tvins));
 
-    tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+    tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
     tvi.pszText = lpLabel;
     tvi.cchTextMax = lstrlen(lpLabel);
+    tvi.lParam = (LPARAM)DeviceID;
     tvi.iImage = DevImage;
     tvi.iSelectedImage = DevImage;
 
@@ -58,11 +134,11 @@
     UINT Ret;
 
     *DevPresent = FALSE;
+    *DevClassName = _T('\0');
 
     Ret = CM_Enumerate_Classes(ClassIndex,
                                &ClassGuid,
                                0);
-
     if (Ret != CR_SUCCESS)
     {
         /* all classes enumerated */
@@ -84,10 +160,6 @@
                                  &RequiredSize))
     {
         lstrcpy(DevClassName, ClassName);
-    }
-    else
-    {
-        *DevClassName = _T('\0');
     }
 
     if (!SetupDiGetClassImageIndex(&ImageListData,
@@ -111,7 +183,6 @@
         return 0;
     }
 
-
     KeyClass = SetupDiOpenClassRegKeyEx(&ClassGuid,
                                         MAXIMUM_ALLOWED,
                                         DIOCR_INSTALLER,
@@ -145,65 +216,54 @@
 
 static INT
 EnumDevices(INT index,
-            TCHAR* DeviceClassName,
-            TCHAR* DeviceName)
+            LPTSTR DeviceClassName,
+            LPTSTR DeviceName,
+            LPTSTR *DeviceID)
 {
     SP_DEVINFO_DATA DeviceInfoData;
-    DWORD RequiredSize = 0;
-    GUID *guids = NULL;
-    BOOL bRet;
+    DWORD DevIdSize;
 
     *DeviceName = _T('\0');
-
-    bRet = SetupDiClassGuidsFromName(DeviceClassName,
-                                     NULL,
-                                     RequiredSize,
-                                     &RequiredSize);
-    if (RequiredSize == 0)
-        return -2;
-
-    if (!bRet)
-    {
-        guids = HeapAlloc(GetProcessHeap(),
-                          0,
-                          RequiredSize * sizeof(GUID));
-        if (guids == NULL)
-            return -1;
-
-        bRet = SetupDiClassGuidsFromName(DeviceClassName,
-                                         guids,
-                                         RequiredSize,
-                                         &RequiredSize);
-
-        if (!bRet || RequiredSize == 0)
-        {
-            /* incorrect class name */
-            HeapFree(GetProcessHeap(), 0, guids);
-            return -3;
-        }
-    }
-
-    HeapFree(GetProcessHeap(), 0, guids);
-    if(hDevInfo == INVALID_HANDLE_VALUE)
-    {
-        if(!bRet)
-        {
-            /* device info is unavailable */
-            return -4;
-        }
-    }
+    *DeviceID = NULL;
 
     ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
 
-    bRet = SetupDiEnumDeviceInfo(hDevInfo,
-                                 index,
-                                 &DeviceInfoData);
-
-    if (!bRet)
+    if (!SetupDiEnumDeviceInfo(hDevInfo,
+                               index,
+                               &DeviceInfoData))
     {
         /* no such device */
         return -1;
+    }
+
+    /* get the device ID */
+    if (!SetupDiGetDeviceInstanceId(hDevInfo,
+                                    &DeviceInfoData,
+                                    NULL,
+                                    0,
+                                    &DevIdSize))
+    {
+        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+        {
+            (*DeviceID) = (LPTSTR)HeapAlloc(GetProcessHeap(),
+                                            0,
+                                            DevIdSize * sizeof(TCHAR));
+            if (*DeviceID)
+            {
+                if (!SetupDiGetDeviceInstanceId(hDevInfo,
+                                                &DeviceInfoData,
+                                                *DeviceID,
+                                                DevIdSize,
+                                                NULL))
+                {
+                    HeapFree(GetProcessHeap(),
+                             0,
+                             *DeviceID);
+                    *DeviceID = NULL;
+                }
+            }
+        }
     }
 
     /* get the device's friendly name */
@@ -216,17 +276,16 @@
                                           NULL))
     {
         /* if the friendly name fails, try the description instead */
-        bRet = SetupDiGetDeviceRegistryProperty(hDevInfo,
-                                               &DeviceInfoData,
-                                               SPDRP_DEVICEDESC,
-                                               0,
-                                               (BYTE*)DeviceName,
-                                               MAX_DEV_LEN,
-                                               NULL);
-        if (!bRet)
+        if (!SetupDiGetDeviceRegistryProperty(hDevInfo,
+                                              &DeviceInfoData,
+                                              SPDRP_DEVICEDESC,
+                                              0,
+                                              (BYTE*)DeviceName,
+                                              MAX_DEV_LEN,
+                                              NULL))
         {
             /* if the description fails, just give up! */
-            return -5;
+            return -2;
         }
     }
 
@@ -241,6 +300,7 @@
     HTREEITEM hDevItem;
     TCHAR DevName[MAX_DEV_LEN];
     TCHAR DevDesc[MAX_DEV_LEN];
+    LPTSTR DeviceID = NULL;
     BOOL DevExist = FALSE;
     INT ClassRet;
     INT index = 0;
@@ -264,6 +324,7 @@
                 hDevItem = InsertIntoTreeView(Info->hTreeView,
                                               hRoot,
                                               DevDesc,
+                                              NULL,
                                               DevImage);
             }
             else
@@ -271,6 +332,7 @@
                 hDevItem = InsertIntoTreeView(Info->hTreeView,
                                               hRoot,
                                               DevName,
+                                              NULL,
                                               DevImage);
             }
 
@@ -278,12 +340,14 @@
             {
                 Ret = EnumDevices(DevIndex,
                                   DevName,
-                                  DeviceName);
+                                  DeviceName,
+                                  &DeviceID);
                 if (Ret == 0)
                 {
                     InsertIntoTreeView(Info->hTreeView,
                                        hDevItem,
                                        DeviceName,
+                                       DeviceID,
                                        DevImage);
                 }
 
@@ -298,6 +362,7 @@
                 hDevInfo = NULL;
             }
 
+            /* don't insert classes with no devices */
             if (!TreeView_GetChild(Info->hTreeView,
                                    hDevItem))
             {
@@ -366,6 +431,7 @@
     hRoot = InsertIntoTreeView(Info->hTreeView,
                                NULL,
                                ComputerName,
+                               NULL,
                                RootImage);
 
     return hRoot;

Modified: trunk/reactos/base/applications/devmgmt/mainwnd.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/devmgmt/mainwnd.c?rev=24396&r1=24395&r2=24396&view=diff
==============================================================================
--- trunk/reactos/base/applications/devmgmt/mainwnd.c (original)
+++ trunk/reactos/base/applications/devmgmt/mainwnd.c Wed Oct  4 20:39:45 2006
@@ -285,7 +285,8 @@
             if (!TreeView_GetChild(Info->hTreeView,
                                    hSelected))
             {
-                OpenPropSheet(hSelected);
+                OpenPropSheet(Info->hTreeView,
+                              hSelected);
             }
         }
         break;
@@ -348,13 +349,18 @@
         case IDC_PROP:
         {
             HTREEITEM hSelected = TreeView_GetSelection(Info->hTreeView);
-            OpenPropSheet(hSelected);
+            OpenPropSheet(Info->hTreeView,
+                          hSelected);
         }
         break;
 
         case IDC_REFRESH:
         {
-            HTREEITEM hRoot = InitTreeView(Info);
+            HTREEITEM hRoot;
+
+            FreeDeviceStrings(Info->hTreeView);
+
+            hRoot = InitTreeView(Info);
             if (hRoot)
                 ListDevicesByType(Info, hRoot);
         }
@@ -525,6 +531,7 @@
 
         case WM_CLOSE:
         {
+            FreeDeviceStrings(Info->hTreeView);
             DestroyMenu(Info->hShortcutMenu);
             DestroyWindow(hwnd);
         }
@@ -532,8 +539,6 @@
 
         case WM_DESTROY:
         {
-            //DestroyMainWnd(Info);
-
             HeapFree(ProcessHeap,
                      0,
                      Info);

Modified: trunk/reactos/base/applications/devmgmt/precomp.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/devmgmt/precomp.h?rev=24396&r1=24395&r2=24396&view=diff
==============================================================================
--- trunk/reactos/base/applications/devmgmt/precomp.h (original)
+++ trunk/reactos/base/applications/devmgmt/precomp.h Wed Oct  4 20:39:45 2006
@@ -53,7 +53,29 @@
 
 
 /* enumdevices.c */
-VOID OpenPropSheet(HTREEITEM hItem);
+// undocumented API's from devmgr
+#ifdef _UNICODE
+#define DevicePropertiesEx DevicePropertiesExW
+INT_PTR
+WINAPI
+DevicePropertiesExW(IN HWND hWndParent  OPTIONAL,
+                    IN LPCWSTR lpMachineName  OPTIONAL,
+                    IN LPCWSTR lpDeviceID  OPTIONAL,
+                    IN DWORD dwFlags  OPTIONAL,
+                    IN BOOL bShowDevMgr);
+#else
+#define DevicePropertiesEx DevicePropertiesExA
+INT_PTR
+WINAPI
+DevicePropertiesExA(IN HWND hWndParent  OPTIONAL,
+                    IN LPCSTR lpMachineName  OPTIONAL,
+                    IN LPCSTR lpDeviceID  OPTIONAL,
+                    IN DWORD dwFlags  OPTIONAL,
+                    IN BOOL bShowDevMgr);
+#endif
+
+VOID FreeDeviceStrings(HWND hTV);
+VOID OpenPropSheet(HWND hTV, HTREEITEM hItem);
 HTREEITEM InitTreeView(PMAIN_WND_INFO Info);
 VOID ListDevicesByType(PMAIN_WND_INFO Info, HTREEITEM hRoot);
 




More information about the Ros-diffs mailing list