ReactOS  0.4.15-dev-1386-g5cb9f87
DeviceView.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Device Manager
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: dll/win32/devmgr/devmgmt/DeviceView.cpp
5  * PURPOSE: Implements the tree view which contains the devices
6  * COPYRIGHT: Copyright 2015 Ged Murphy <gedmurphy@reactos.org>
7  */
8 
9 
10 
11 #include "precomp.h"
12 #include "devmgmt.h"
13 #include "DeviceView.h"
14 
15 
16 // DATA ********************************************/
17 
18 #define CLASS_NAME_LEN 256
19 #define CLASS_DESC_LEN 256
20 #define ROOT_NAME_SIZE MAX_COMPUTERNAME_LENGTH + 1
21 
22 
24 
26 {
30 };
31 
32 
33 // PUBLIC METHODS ************************************/
34 
37  ) :
38  m_hMainWnd(hMainWnd),
39  m_hTreeView(NULL),
40  m_hPropertyDialog(NULL),
41  m_hMenu(NULL),
42  m_ViewType(DevicesByType),
43  m_ShowHidden(false),
44  m_RootNode(NULL)
45 {
47 }
48 
50 {
51 }
52 
53 bool
55 {
56  // Get the device image list
59  if (bSuccess == FALSE)
60  return false;
61 
62  // Create the main treeview
65  NULL,
68  0, 0, 0, 0,
69  m_hMainWnd,
72  NULL);
73  if (m_hTreeView)
74  {
75  // Set the image list against the treeview
78  TVSIL_NORMAL);
79 
80  // Give the treeview arrows instead of +/- boxes (on Win7)
81  SetWindowTheme(m_hTreeView, L"explorer", NULL);
82 
83  // Create the root node
86  }
87 
88 
89 
90  return !!(m_hTreeView);
91 }
92 
93 bool
95 {
97 
99  {
102  }
103 
104  return true;
105 }
106 
107 LRESULT
109  _In_ int x,
110  _In_ int y,
111  _In_ int cx,
112  _In_ int cy
113  )
114 {
115  // Resize the treeview
117  NULL,
118  x,
119  y,
120  cx,
121  cy,
122  SWP_NOZORDER);
123 
124  return 0;
125 }
126 
127 LRESULT
129  _In_ LPNMHDR NmHdr
130  )
131 {
132  TVHITTESTINFO hitInfo;
134 
135  GetCursorPos(&hitInfo.pt);
136  ScreenToClient(m_hTreeView, &hitInfo.pt);
137 
138  hItem = TreeView_HitTest(m_hTreeView, &hitInfo);
139  if (hItem != NULL && (hitInfo.flags & (TVHT_ONITEM | TVHT_ONITEMICON)))
140  {
142  }
143 
144  return 0;
145 }
146 
147 LRESULT
150  )
151 {
153 
154  RECT rc;
156  hSelected,
157  &rc,
158  TRUE))
159  {
160  POINT pt;
161  if (GetCursorPos(&pt) &&
163  PtInRect(&rc, pt))
164  {
166  if (Node)
167  {
168  // Create the context menu
169  HMENU hContextMenu = CreatePopupMenu();
170 
171  // Add the actions for this node
172  BuildActionMenuForNode(hContextMenu, Node, false);
173 
174  INT xPos = GET_X_LPARAM(lParam);
175  INT yPos = GET_Y_LPARAM(lParam);
176 
177  // Display the menu
178  TrackPopupMenuEx(hContextMenu,
180  xPos,
181  yPos,
182  m_hMainWnd,
183  NULL);
184 
185  DestroyMenu(hContextMenu);
186  }
187  }
188  }
189 
190  return 0;
191 }
192 
193 
194 void
197  _In_ bool ScanForChanges,
198  _In_ bool UpdateView
199  )
200 {
201  // Enum devices on a separate thread to keep the gui responsive
202 
203  m_ViewType = Type;
204 
207  ThreadData->This = this;
208  ThreadData->ScanForChanges = ScanForChanges;
209  ThreadData->UpdateView = UpdateView;
210 
211  HANDLE hThread;
213  0,
215  ThreadData,
216  0,
217  NULL);
219 }
220 
221 LRESULT
224 )
225 {
226  switch (Action)
227  {
228  case IDM_PROPERTIES:
229  {
231  break;
232  }
233 
234  case IDM_SCAN_HARDWARE:
235  {
237  true,
238  true);
239  break;
240  }
241 
242  case IDM_ENABLE_DRV:
243  {
244  bool NeedsReboot;
245  if (EnableSelectedDevice(true, NeedsReboot) &&
246  NeedsReboot)
247  {
248  MessageBox(m_hMainWnd, L"Rebooting", L"Enable", MB_OK);
249  }
250  break;
251  }
252 
253  case IDM_DISABLE_DRV:
254  {
255  bool NeedsReboot;
256  EnableSelectedDevice(false, NeedsReboot);
257  break;
258  }
259 
260  case IDM_UPDATE_DRV:
261  {
262  bool NeedsReboot;
263  UpdateSelectedDevice(NeedsReboot);
264  break;
265  }
266 
267  case IDM_UNINSTALL_DRV:
268  {
270  break;
271  }
272 
273  case IDM_ADD_HARDWARE:
274  {
276  break;
277  }
278  }
279 
280  return 0;
281 }
282 
283 void
285 {
287  if (Node && Node->HasProperties())
288  {
290  NULL,
291  Node->GetDeviceId(),
292  1,//DPF_EXTENDED,
293  FALSE);
294  }
295 }
296 
297 void
299 {
301 }
302 
303 bool
305  _In_ HMENU OwnerMenu,
306  _In_ bool MainMenu
307  )
308 {
310  if (Node)
311  {
312  BuildActionMenuForNode(OwnerMenu, Node, MainMenu);
313  return true;
314  }
315 
316  return false;
317 }
318 
319 CNode*
321 {
322  TV_ITEM TvItem;
323  TvItem.hItem = TreeView_GetSelection(m_hTreeView);
324  return GetNode(&TvItem);
325 }
326 
327 
328 
329 // PRIVATE METHODS *******************************************/
330 
331 bool
333 {
335  return (m_hTreeRoot != NULL);
336 }
337 
338 bool
340  _In_ ULONG ClassIndex,
341  _Out_ LPGUID ClassGuid,
342  _Out_ HDEVINFO *hDevInfo
343  )
344 {
345  CONFIGRET cr;
346 
347  // Get the next class in the list
348  cr = CM_Enumerate_Classes(ClassIndex,
349  ClassGuid,
350  0);
351  if (cr != CR_SUCCESS)
352  return false;
353 
354  // Check if this is the unknown class
355  if (IsEqualGUID(*ClassGuid, GUID_DEVCLASS_UNKNOWN))
356  {
357  // Get device info for all devices
358  *hDevInfo = SetupDiGetClassDevsW(NULL,
359  NULL,
360  NULL,
362  }
363  else
364  {
365  // We only want the devices for this class
366  *hDevInfo = SetupDiGetClassDevsW(ClassGuid,
367  NULL,
368  NULL,
369  DIGCF_PRESENT);
370  }
371 
372  return (hDevInfo != INVALID_HANDLE_VALUE);
373 }
374 
375 unsigned int __stdcall CDeviceView::RefreshThread(void *Param)
376 {
378  CDeviceView *This = ThreadData->This;
379 
380  // Get a copy of the currently selected node
381  CNode *LastSelectedNode = This->GetSelectedNode();
382  if (LastSelectedNode == nullptr || (LastSelectedNode->GetNodeType() == RootNode))
383  {
384  LastSelectedNode = new CRootNode(*This->m_RootNode);
385  }
386  else if (LastSelectedNode->GetNodeType() == ClassNode)
387  {
388  LastSelectedNode = new CClassNode(*dynamic_cast<CClassNode *>(LastSelectedNode));
389  }
390  else if (LastSelectedNode->GetNodeType() == DeviceNode)
391  {
392  LastSelectedNode = new CDeviceNode(*dynamic_cast<CDeviceNode *>(LastSelectedNode));
393  }
394 
395  // Empty the treeview
396  This->EmptyDeviceView();
397 
398  // Re-add the root node to the tree
399  if (This->AddRootDevice() == false)
400  return 0;
401 
402  // Refresh the devices only if requested
403  if (ThreadData->ScanForChanges)
404  {
405  This->RefreshDeviceList();
406  }
407 
408  // display the type of view the user wants
409  switch (This->m_ViewType)
410  {
411  case DevicesByType:
412  (void)This->ListDevicesByType();
413  break;
414 
415  case DevicesByConnection:
416  (VOID)This->ListDevicesByConnection();
417  break;
418 
419  case ResourcesByType:
420  break;
421 
423  break;
424  }
425 
426  This->SelectNode(LastSelectedNode);
427 
428  delete ThreadData;
429 
430  return 0;
431 }
432 
433 
434 bool
436 {
439  HDEVINFO hDevInfo;
440  HTREEITEM hTreeItem = NULL;
441  GUID ClassGuid;
442  INT ClassIndex;
443  BOOL bClassSuccess, bSuccess;
444 
445  ClassIndex = 0;
446  do
447  {
448  // Loop through all the device classes
449  bClassSuccess = GetNextClass(ClassIndex, &ClassGuid, &hDevInfo);
450  if (bClassSuccess)
451  {
452  bool bClassUnknown = false;
453  bool AddedParent = false;
454  INT DeviceIndex = 0;
455  bool MoreItems = false;
456 
457  // Get the cached class node
458  ClassNode = GetClassNode(&ClassGuid);
459  if (ClassNode == nullptr)
460  {
461  ClassIndex++;
462  continue;
463  }
464 
465  // Set a flag is this is the (special case) unknown class
466  if (IsEqualGUID(ClassGuid, GUID_DEVCLASS_UNKNOWN))
467  bClassUnknown = true;
468 
469  // Check if this is a hidden class
470  if (IsEqualGUID(ClassGuid, GUID_DEVCLASS_LEGACYDRIVER) ||
471  IsEqualGUID(ClassGuid, GUID_DEVCLASS_VOLUME))
472  {
473  // Ignore this device if we aren't displaying hidden devices
474  if (m_ShowHidden == FALSE)
475  {
476  ClassIndex++;
477  continue;
478  }
479  }
480 
481  do
482  {
483  // Get a handle to all the devices in this class
487  bSuccess = SetupDiEnumDeviceInfo(hDevInfo,
488  DeviceIndex,
489  &DeviceInfoData);
491  MoreItems = false;
492 
493  if (bSuccess)
494  {
495  MoreItems = true;
496 
497  // The unknown class handle contains all devices on the system,
498  // and we're just looking for the ones with a null GUID
499  if (bClassUnknown)
500  {
502  {
503  // This is a known device, we aren't interested in it
504  DeviceIndex++;
505  continue;
506  }
507  }
508 
509  // Get the cached device node
511  if (DeviceNode == nullptr)
512  {
513  DeviceIndex++;
514  continue;
515  }
516 
517  // Check if this is a hidden device
518  if (DeviceNode->IsHidden())
519  {
520  // Ignore this device if we aren't displaying hidden devices
521  if (m_ShowHidden == FALSE)
522  {
523  DeviceIndex++;
524  continue;
525  }
526  }
527 
528  // We have a device, we need to add the parent if it hasn't yet been added
529  if (AddedParent == false)
530  {
531  // Insert the new class under the root item
532  hTreeItem = InsertIntoTreeView(m_hTreeRoot,
533  ClassNode);
534  AddedParent = true;
535  }
536 
537  // Add the device under the class item node
538  (void)InsertIntoTreeView(hTreeItem, DeviceNode);
539 
540  // Expand the class if it has a problem device
541  if (DeviceNode->HasProblem())
542  {
544  hTreeItem,
545  TVE_EXPAND);
546  }
547  }
548 
549  DeviceIndex++;
550 
551  } while (MoreItems);
552 
553  // If this class has devices, sort them alphabetically
554  if (AddedParent == true)
555  {
557  hTreeItem,
558  0);
559  }
560  }
561 
562  ClassIndex++;
563 
564  } while (bClassSuccess);
565 
566  // Sort the classes alphabetically
568  m_hTreeRoot,
569  0);
570 
571  // Expand the root item
573  m_hTreeRoot,
574  TVE_EXPAND);
575 
576  // Pre-select the root item
578  m_hTreeRoot);
579 
580  return 0;
581 }
582 
583 bool
585 {
586  // Walk the device tree and add all the devices
588 
589  // Expand the root item
591  m_hTreeRoot,
592  TVE_EXPAND);
593 
594  return true;
595 }
596 
597 bool
600  _In_ HTREEITEM hParentTreeItem
601  )
602 {
603  HTREEITEM hDevItem = NULL;
604  DEVINST Device;
605  bool HasProblem = false;
606  bool bSuccess;
607 
608  // Check if the parent has any child devices
610  return true;
611 
612  // Get the cached device node
614  DeviceNode = dynamic_cast<CDeviceNode *>(GetDeviceNode(Device));
615  if (DeviceNode == nullptr)
616  {
617  return false;
618  }
619 
620  // Don't show hidden devices if not requested
621  if ((m_ShowHidden == TRUE) || (!(DeviceNode->IsHidden())))
622  {
623  // Add this device to the tree under its parent
624  hDevItem = InsertIntoTreeView(hParentTreeItem,
625  DeviceNode);
626  if (hDevItem)
627  {
628  // Check if this child has any children itself
629  if (!RecurseChildDevices(Device, hDevItem))
630  HasProblem = true;
631  }
632 
633  if (DeviceNode->HasProblem())
634  {
635  HasProblem = true;
636  }
637  }
638 
639 
640  // Check for siblings
641  for (;;)
642  {
643  // Check if the parent device has anything at the same level
645  if (bSuccess == FALSE)
646  break;
647 
648  DeviceNode = dynamic_cast<CDeviceNode *>(GetDeviceNode(Device));
649  if (DeviceNode == nullptr)
650  {
651  continue;
652  }
653 
654  // Don't show hidden devices if not requested
655  if ((m_ShowHidden == TRUE) || (!(DeviceNode->IsHidden())))
656  {
657  if (DeviceNode->HasProblem())
658  {
659  HasProblem = true;
660  }
661 
662  // Add this device to the tree under its parent
663  hDevItem = InsertIntoTreeView(hParentTreeItem,
664  DeviceNode);
665  if (hDevItem)
666  {
667  // Check if this child has any children itself
668  if (!RecurseChildDevices(Device, hDevItem))
669  HasProblem = true;
670  }
671  }
672  }
673 
675  hParentTreeItem,
676  0);
677 
678  // Expand the class if it has a problem device
679  if (HasProblem == true)
680  {
682  hParentTreeItem,
683  TVE_EXPAND);
684  }
685 
686  // If there was a problem, expand the ancestors
687  if (HasProblem)
688  return false;
689 
690  return true;
691 }
692 
693 bool
695  _In_ bool Enable,
696  _Out_ bool &NeedsReboot
697  )
698 {
699  CDeviceNode *Node = dynamic_cast<CDeviceNode *>(GetSelectedNode());
700  if (Node == nullptr)
701  return false;
702 
703  if (Enable == false)
704  {
706  if (str.LoadStringW(g_hThisInstance, IDS_CONFIRM_DISABLE))
707  {
709  str,
710  Node->GetDisplayName(),
712  {
713  return false;
714  }
715  }
716  }
717 
718  return Node->EnableDevice(Enable, NeedsReboot);
719 }
720 
721 bool
723  _Out_ bool &NeedsReboot
724  )
725 {
726  CDeviceNode *Node = dynamic_cast<CDeviceNode *>(GetSelectedNode());
727  if (Node == nullptr)
728  return false;
729 
730  DWORD dwReboot;
731  if (InstallDevInst(m_hMainWnd, Node->GetDeviceId(), TRUE, &dwReboot))
732  {
733  NeedsReboot = false;
734  return true;
735  }
736 
737  return false;
738 }
739 
740 bool
742  )
743 {
744  CDeviceNode *Node = dynamic_cast<CDeviceNode *>(GetSelectedNode());
745  if (Node == nullptr)
746  return false;
747 
749  if (str.LoadStringW(g_hThisInstance, IDS_CONFIRM_UNINSTALL))
750  {
752  str,
753  Node->GetDisplayName(),
755  {
756  return false;
757  }
758  }
759 
760  return Node->UninstallDevice();
761 }
762 
763 bool
765 {
766  PADDHARDWAREWIZARD pAddHardwareWizard;
768 
769  hModule = LoadLibraryW(L"hdwwiz.cpl");
770  if (hModule == NULL)
771  return false;
772 
773  pAddHardwareWizard = (PADDHARDWAREWIZARD)GetProcAddress(hModule,
774  "AddHardwareWizard");
775  if (pAddHardwareWizard == NULL)
776  {
778  return false;
779  }
780 
781  pAddHardwareWizard(m_hMainWnd, NULL);
782 
784  return true;
785 }
786 
787 bool
789  _In_ DEVINST ParentDevInst,
790  _Out_ PDEVINST DevInst
791 )
792 {
793  CONFIGRET cr;
794  cr = CM_Get_Child(DevInst,
795  ParentDevInst,
796  0);
797  return (cr == CR_SUCCESS);
798 }
799 
800 bool
802  _In_ DEVINST PrevDevice,
803  _Out_ PDEVINST DevInst
804 )
805 {
806  CONFIGRET cr;
807  cr = CM_Get_Sibling(DevInst,
808  PrevDevice,
809  0);
810  return (cr == CR_SUCCESS);
811 }
812 
813 HTREEITEM
816  _In_ CNode *Node
817  )
818 {
819  LPWSTR lpLabel;
820  lpLabel = Node->GetDisplayName();
821 
822  TV_ITEMW tvi;
823  TV_INSERTSTRUCT tvins;
824  ZeroMemory(&tvi, sizeof(tvi));
825  ZeroMemory(&tvins, sizeof(tvins));
826 
828  tvi.pszText = lpLabel;
829  tvi.cchTextMax = wcslen(lpLabel);
830  tvi.lParam = (LPARAM)Node;
831  tvi.iImage = Node->GetClassImage();
832  tvi.iSelectedImage = Node->GetClassImage();
833 
834  // try to cast it to a device node. This will only succeed if it's the correct type
835  CDeviceNode *DeviceNode = dynamic_cast<CDeviceNode *>(Node);
836  if (DeviceNode && DeviceNode->GetOverlayImage())
837  {
838  tvi.mask |= TVIF_STATE;
839  tvi.stateMask = TVIS_OVERLAYMASK;
840  tvi.state = INDEXTOOVERLAYMASK(DeviceNode->GetOverlayImage());
841  }
842 
843  tvins.item = tvi;
844  tvins.hParent = hParent;
845 
846  return TreeView_InsertItem(m_hTreeView, &tvins);
847 }
848 
849 void
851  _In_ HMENU OwnerMenu,
852  _In_ CNode *Node,
853  _In_ bool MainMenu
854  )
855 {
856  // Create a separator structure
857  MENUITEMINFOW MenuSeparator = { 0 };
858  MenuSeparator.cbSize = sizeof(MENUITEMINFOW);
859  MenuSeparator.fType = MFT_SEPARATOR;
860 
861  // Setup the
862  MENUITEMINFOW MenuItemInfo = { 0 };
863  MenuItemInfo.cbSize = sizeof(MENUITEMINFOW);
864  MenuItemInfo.fMask = MIIM_ID | MIIM_STRING | MIIM_DATA | MIIM_SUBMENU;
865  MenuItemInfo.fType = MFT_STRING;
866 
868  int i = 0;
869 
870  // Device nodes have extra data
871  if (Node->GetNodeType() == DeviceNode)
872  {
873  CDeviceNode *DeviceNode = dynamic_cast<CDeviceNode *>(Node);
874 
875  if (DeviceNode->CanUpdate())
876  {
877  String.LoadStringW(g_hThisInstance, IDS_MENU_UPDATE);
878  MenuItemInfo.wID = IDM_UPDATE_DRV;
879  MenuItemInfo.dwTypeData = String.GetBuffer();
880  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
881  i++;
882  }
883 
884  if (DeviceNode->IsDisabled())
885  {
886  String.LoadStringW(g_hThisInstance, IDS_MENU_ENABLE);
887  MenuItemInfo.wID = IDM_ENABLE_DRV;
888  MenuItemInfo.dwTypeData = String.GetBuffer();
889  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
890  i++;
891  }
892 
893  if (DeviceNode->CanDisable() && !DeviceNode->IsDisabled())
894  {
896  MenuItemInfo.wID = IDM_DISABLE_DRV;
897  MenuItemInfo.dwTypeData = String.GetBuffer();
898  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
899  i++;
900  }
901 
902  if (DeviceNode->CanUninstall())
903  {
905  MenuItemInfo.wID = IDM_UNINSTALL_DRV;
906  MenuItemInfo.dwTypeData = String.GetBuffer();
907  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
908  i++;
909  }
910 
911  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuSeparator);
912  i++;
913  }
914 
915  // All nodes have the scan option
916  String.LoadStringW(g_hThisInstance, IDS_MENU_SCAN);
917  MenuItemInfo.wID = IDM_SCAN_HARDWARE;
918  MenuItemInfo.dwTypeData = String.GetBuffer();
919  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
920  i++;
921 
922  if ((Node->GetNodeType() == RootNode) || (MainMenu == true))
923  {
924  String.LoadStringW(g_hThisInstance, IDS_MENU_ADD);
925  MenuItemInfo.wID = IDM_ADD_HARDWARE;
926  MenuItemInfo.dwTypeData = String.GetBuffer();
927  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
928  i++;
929  }
930 
931  if (Node->HasProperties())
932  {
933  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuSeparator);
934  i++;
935 
937  MenuItemInfo.wID = IDM_PROPERTIES;
938  MenuItemInfo.dwTypeData = String.GetBuffer();
939  InsertMenuItemW(OwnerMenu, i, TRUE, &MenuItemInfo);
940  i++;
941 
943  }
944 }
945 
946 HTREEITEM
948  _In_ HTREEITEM hParentItem,
949  _In_ CNode *Node
950  )
951 {
952  HTREEITEM FoundItem;
954  TVITEMW tvItem;
955  CNode *FoundNode;
956 
957  // Check if this node has any children
958  hItem = TreeView_GetChild(m_hTreeView, hParentItem);
959  if (hItem == NULL)
960  return NULL;
961 
962  // The lParam contains the node pointer data
963  tvItem.hItem = hItem;
964  tvItem.mask = TVIF_PARAM;
965  if (TreeView_GetItem(m_hTreeView, &tvItem) &&
966  tvItem.lParam != NULL)
967  {
968  // check for a matching node
969  FoundNode = reinterpret_cast<CNode *>(tvItem.lParam);
970  if ((FoundNode->GetNodeType() == Node->GetNodeType()) &&
971  (IsEqualGUID(*FoundNode->GetClassGuid(), *Node->GetClassGuid())))
972  {
973  // check if this is a class node, or a device with matching ID's
974  if ((FoundNode->GetNodeType() == ClassNode) ||
975  (wcscmp(FoundNode->GetDeviceId(), Node->GetDeviceId()) == 0))
976  {
977  return hItem;
978  }
979  }
980  }
981 
982  // This node may have its own children
983  FoundItem = RecurseFindDevice(hItem, Node);
984  if (FoundItem)
985  return FoundItem;
986 
987  // Loop all the siblings
988  for (;;)
989  {
990  // Get the next item at this level
992  if (hItem == NULL)
993  break;
994 
995  // The lParam contains the node pointer data
996  tvItem.hItem = hItem;
997  tvItem.mask = TVIF_PARAM;
998  if (TreeView_GetItem(m_hTreeView, &tvItem))
999  {
1000  // check for a matching class
1001  FoundNode = reinterpret_cast<CNode *>(tvItem.lParam);
1002  if ((FoundNode->GetNodeType() == Node->GetNodeType()) &&
1003  (IsEqualGUID(*FoundNode->GetClassGuid(), *Node->GetClassGuid())))
1004  {
1005  // check if this is a class node, or a device with matching ID's
1006  if ((FoundNode->GetNodeType() == ClassNode) ||
1007  (wcscmp(FoundNode->GetDeviceId(), Node->GetDeviceId()) == 0))
1008  {
1009  return hItem;
1010  }
1011  }
1012  }
1013 
1014  // This node may have its own children
1015  FoundItem = RecurseFindDevice(hItem, Node);
1016  if (FoundItem)
1017  return FoundItem;
1018  }
1019 
1020  return hItem;
1021 }
1022 
1023 void
1025  _In_ CNode *Node
1026  )
1027 {
1029 
1030  // Check if there are any items in the tree
1032  if (hRoot == NULL)
1033  return;
1034 
1035  // If we don't want to set select a node, just select root
1036  if (Node == nullptr || Node->GetNodeType() == RootNode)
1037  {
1039  return;
1040  }
1041 
1042  // Scan the tree looking for the node we want
1044  if (hItem)
1045  {
1047  }
1048  else
1049  {
1051  }
1052 }
1053 
1054 
1055 void
1057 {
1059 }
1060 
1061 
1062 CClassNode*
1064  _In_ LPGUID ClassGuid
1065  )
1066 {
1067  POSITION Pos;
1068  CClassNode *Node = nullptr;
1069 
1070  Pos = m_ClassNodeList.GetHeadPosition();
1071  if (Pos == NULL)
1072  return nullptr;
1073 
1074  do
1075  {
1076  Node = m_ClassNodeList.GetNext(Pos);
1077  if (IsEqualGUID(*Node->GetClassGuid(), *ClassGuid))
1078  {
1079  ATLASSERT(Node->GetNodeType() == ClassNode);
1080  break;
1081  }
1082 
1083  Node = nullptr;
1084 
1085  } while (Pos != NULL);
1086 
1087  return Node;
1088 }
1089 
1090 CDeviceNode*
1093  )
1094 {
1095  POSITION Pos;
1096  CDeviceNode *Node = nullptr;
1097 
1098  Pos = m_DeviceNodeList.GetHeadPosition();
1099  if (Pos == NULL)
1100  return nullptr;
1101 
1102  do
1103  {
1104  Node = m_DeviceNodeList.GetNext(Pos);
1105  if (Node->GetDeviceInst() == Device)
1106  {
1107  ATLASSERT(Node->GetNodeType() == DeviceNode);
1108  break;
1109  }
1110 
1111  Node = nullptr;
1112 
1113  } while (Pos != NULL);
1114 
1115  return Node;
1116 }
1117 
1119  _In_ LPTV_ITEMW TvItem
1120  )
1121 {
1122  TvItem->mask = TVIF_PARAM;
1123  if (TreeView_GetItem(m_hTreeView, TvItem))
1124  {
1125  return (CNode *)TvItem->lParam;
1126  }
1127  return nullptr;
1128 }
1129 
1130 void
1132 {
1133  CNode *Node;
1134 
1135  while (!m_ClassNodeList.IsEmpty())
1136  {
1137  Node = m_ClassNodeList.RemoveTail();
1138  delete Node;
1139  }
1140 
1141  while (!m_DeviceNodeList.IsEmpty())
1142  {
1143  Node = m_DeviceNodeList.RemoveTail();
1144  delete Node;
1145  }
1146 }
1147 
1148 bool
1150 {
1151  GUID ClassGuid;
1154  HDEVINFO hDevInfo;
1156  DWORD i;
1157  BOOL Success;
1158 
1159  ULONG ClassIndex = 0;
1160 
1161  EmptyLists();
1162 
1163  if (m_RootNode) delete m_RootNode;
1165  m_RootNode->SetupNode();
1166 
1167  // Loop through all the classes
1168  do
1169  {
1170  Success = GetNextClass(ClassIndex, &ClassGuid, &hDevInfo);
1171  if (Success)
1172  {
1173  // Create a new class node and add it to the list
1174  ClassNode = new CClassNode(&ClassGuid, &m_ImageListData);
1175  if (ClassNode->SetupNode())
1176  {
1177  m_ClassNodeList.AddTail(ClassNode);
1178  }
1179 
1180  SetupDiDestroyDeviceInfoList(hDevInfo);
1181  }
1182  ClassIndex++;
1183  } while (Success);
1184 
1185  // Get all the devices on the local machine
1186  hDevInfo = SetupDiGetClassDevsW(NULL,
1187  0,
1188  0,
1190  if (hDevInfo == INVALID_HANDLE_VALUE)
1191  {
1192  return false;
1193  }
1194 
1195  // loop though all the devices
1197  for (i = 0;; i++)
1198  {
1199  // Get the devinst for this device
1201  if (Success == FALSE)
1202  break;
1203 
1204  // create a new device node and add it to the list
1206  /* FIXME: Start of Hack for CORE-5643 */
1207  if (!DeviceNode->IsInstalled())
1208  continue;
1209  /* FIXME: End of Hack for CORE-5643 */
1210 
1211  if (DeviceNode->SetupNode())
1212  {
1213  m_DeviceNodeList.AddTail(DeviceNode);
1214  }
1215  else
1216  {
1217  ATLASSERT(FALSE);
1218  }
1219  }
1220 
1221  SetupDiDestroyDeviceInfoList(hDevInfo);
1222 
1223  return TRUE;
1224 }
#define IDS_CONFIRM_DISABLE
Definition: resource.h:53
#define IDS_MENU_ADD
Definition: resource.h:62
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
Definition: devinst.c:1792
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define IDM_UPDATE_DRV
Definition: resource.h:26
#define MFT_STRING
Definition: winuser.h:741
bool RecurseChildDevices(_In_ DEVINST ParentDevice, _In_ HTREEITEM hParentTreeItem)
Definition: DeviceView.cpp:598
bool RunAddHardwareWizard()
Definition: DeviceView.cpp:764
#define TreeView_SortChildren(hwnd, hitem, recurse)
Definition: commctrl.h:3538
#define CloseHandle
Definition: compat.h:598
VOID SetFocus()
Definition: DeviceView.cpp:298
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
Definition: commctrl.h:3425
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
bool RefreshDeviceList()
#define IDYES
Definition: winuser.h:829
#define TV_ITEMW
Definition: commctrl.h:3293
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID *class, LPCWSTR enumstr, HWND parent, DWORD flags)
Definition: devinst.c:2297
#define TreeView_DeleteAllItems(hwnd)
Definition: commctrl.h:3413
#define TRUE
Definition: types.h:120
#define pt(x, y)
Definition: drawing.c:79
VOID Refresh(_In_ ViewType Type, _In_ bool ScanForChanges, _In_ bool UpdateView)
Definition: DeviceView.cpp:195
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3462
#define TVS_LINESATROOT
Definition: commctrl.h:3245
CAtlList< CClassNode * > m_ClassNodeList
Definition: DeviceView.h:27
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:140
#define IDS_MENU_SCAN
Definition: resource.h:61
CONFIGRET WINAPI CM_Enumerate_Classes(_In_ ULONG ulClassIndex, _Out_ LPGUID ClassGuid, _In_ ULONG ulFlags)
Definition: cfgmgr.c:1984
bool CreateActionMenu(_In_ HMENU OwnerMenu, _In_ bool MainMenu)
Definition: DeviceView.cpp:304
ush Pos
Definition: deflate.h:92
_In_ LPCSTR lpName
Definition: winbase.h:2752
LPARAM lParam
Definition: commctrl.h:3321
#define GET_X_LPARAM(lp)
Definition: windowsx.h:274
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1044
#define ZeroMemory
Definition: winbase.h:1648
HINSTANCE g_hThisInstance
Definition: MainWindow.cpp:25
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
CONFIGRET WINAPI CM_Get_Sibling(_Out_ PDEVINST pdnDevInst, _In_ DEVINST dnDevInst, _In_ ULONG ulFlags)
Definition: cfgmgr.c:5522
~CDeviceView(void)
Definition: DeviceView.cpp:49
LPWSTR dwTypeData
Definition: winuser.h:3244
#define WS_CHILD
Definition: pedump.c:617
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3463
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3267
#define SWP_NOZORDER
Definition: winuser.h:1232
UINT mask
Definition: commctrl.h:3312
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
LRESULT OnContextMenu(_In_ LPARAM lParam)
Definition: DeviceView.cpp:148
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2635
bool UpdateSelectedDevice(_Out_ bool &NeedsReboot)
Definition: DeviceView.cpp:722
BOOL WINAPI SetupDiGetClassImageList(OUT PSP_CLASSIMAGELIST_DATA ClassImageListData)
Definition: devclass.c:441
int32_t INT
Definition: typedefs.h:58
#define TVHT_ONITEMICON
Definition: commctrl.h:3521
static BOOLEAN bSuccess
Definition: drive.cpp:419
_Must_inspect_result_ _In_ WDFDEVICE ParentDevice
Definition: wdfpdo.h:220
#define _In_opt_
Definition: no_sal2.h:212
#define MB_ICONWARNING
Definition: winuser.h:780
ViewType m_ViewType
Definition: DeviceView.h:22
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3408
#define TPM_RIGHTBUTTON
Definition: winuser.h:2355
#define MIIM_SUBMENU
Definition: winuser.h:718
HWND m_hTreeView
Definition: DeviceView.h:19
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2430
HTREEITEM RecurseFindDevice(_In_ HTREEITEM hParentItem, _In_ CNode *Node)
Definition: DeviceView.cpp:947
CDeviceNode * GetDeviceNode(_In_ DEVINST Device)
#define FALSE
Definition: types.h:117
#define MB_YESNO
Definition: winuser.h:811
ViewType GetCurrentView()
Definition: DeviceView.h:74
#define IDM_UNINSTALL_DRV
Definition: resource.h:27
bool UninstallSelectedDevice()
Definition: DeviceView.cpp:741
unsigned int BOOL
Definition: ntddk_ex.h:94
CAtlList< CDeviceNode * > m_DeviceNodeList
Definition: DeviceView.h:28
union node Node
Definition: types.h:1255
#define LPTV_ITEMW
Definition: commctrl.h:3291
static HTREEITEM hRoot
Definition: treeview.c:381
#define TVS_HASBUTTONS
Definition: commctrl.h:3243
bool EnableSelectedDevice(_In_ bool Enable, _Out_ bool &NeedsReboot)
Definition: DeviceView.cpp:694
CONFIGRET WINAPI CM_Get_Child(_Out_ PDEVINST pdnDevInst, _In_ DEVINST dnDevInst, _In_ ULONG ulFlags)
Definition: cfgmgr.c:2522
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
#define CR_SUCCESS
Definition: cfgmgr32.h:842
NodeType GetNodeType()
Definition: Node.h:36
void EmptyLists()
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:581
HTREEITEM hItem
Definition: treelist.h:37
const WCHAR * str
#define TVIS_OVERLAYMASK
Definition: commctrl.h:3283
#define LoadLibraryW(x)
Definition: compat.h:606
CNode * GetSelectedNode()
Definition: DeviceView.cpp:320
#define _Out_
Definition: no_sal2.h:160
BOOL WINAPI SetupDiDestroyClassImageList(IN PSP_CLASSIMAGELIST_DATA ClassImageListData)
Definition: devclass.c:85
LONG_PTR LPARAM
Definition: windef.h:208
virtual bool SetupNode()
Definition: RootNode.cpp:27
#define false
Definition: osdep.h:35
HWND m_hMainWnd
Definition: DeviceView.h:18
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3443
Definition: Node.h:12
Definition: Node.h:8
#define MIIM_ID
Definition: winuser.h:717
struct _SP_DEVINFO_DATA SP_DEVINFO_DATA
CStringT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CAtlStringW
Definition: atlstr.h:126
VOID DisplayPropertySheet()
Definition: DeviceView.cpp:284
LRESULT OnAction(UINT Action)
Definition: DeviceView.cpp:222
bool GetNextClass(_In_ ULONG ClassIndex, _Out_ LPGUID ClassGuid, _Out_ HDEVINFO *hDevInfo)
Definition: DeviceView.cpp:339
bool Initialize()
Definition: DeviceView.cpp:54
static void UpdateView(TreeListData *pData)
Definition: treelist.c:1636
#define FreeLibrary(x)
Definition: compat.h:607
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3469
LPGUID GetClassGuid()
Definition: Node.h:37
#define WC_TREEVIEW
Definition: commctrl.h:3241
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
#define TreeView_HitTest(hwnd, lpht)
Definition: commctrl.h:3509
bool GetSiblingDevice(_In_ DEVINST PrevDevice, _Out_ PDEVINST DevInst)
Definition: DeviceView.cpp:801
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2898
HTREEITEM m_hTreeRoot
Definition: DeviceView.h:23
bool ListDevicesByType()
Definition: DeviceView.cpp:435
#define WINAPI
Definition: msvc.h:6
bool AddRootDevice()
Definition: DeviceView.cpp:332
bool Uninitialize()
Definition: DeviceView.cpp:94
void SelectNode(_In_ CNode *Node)
ViewType
Definition: DeviceView.h:6
_In_opt_ PSP_DEVINFO_DATA DeviceInfoData
Definition: setupapi.h:1523
Type
Definition: Type.h:6
#define IDC_PROPERTIES
Definition: resource.h:32
void EmptyDeviceView()
unsigned long DWORD
Definition: ntddk_ex.h:95
PVOID HANDLE
Definition: typedefs.h:73
CNode * GetNode(_In_ LPTV_ITEMW TvItem)
LRESULT OnSize(_In_ int x, _In_ int y, _In_ int cx, _In_ int cy)
Definition: DeviceView.cpp:108
#define __stdcall
Definition: typedefs.h:25
HTREEITEM InsertIntoTreeView(_In_opt_ HTREEITEM hParent, _In_ CNode *Node)
Definition: DeviceView.cpp:814
#define IDM_ADD_HARDWARE
Definition: resource.h:28
BOOL WINAPI InstallDevInst(IN HWND hWndParent, IN LPCWSTR InstanceId, IN BOOL bUpdate, OUT LPDWORD lpReboot)
Definition: stubs.cpp:24
#define TVE_EXPAND
Definition: commctrl.h:3419
Definition: Node.h:9
#define INDEXTOOVERLAYMASK(i)
Definition: commctrl.h:421
#define MFT_SEPARATOR
Definition: winuser.h:739
VOID(WINAPI * PADDHARDWAREWIZARD)(HWND hwnd, LPWSTR lpName)
Definition: DeviceView.cpp:23
#define DIGCF_ALLCLASSES
Definition: setupapi.h:172
HWND hMainWnd
Definition: magnifier.c:32
static const WCHAR L[]
Definition: oid.c:1250
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
CDeviceView * This
Definition: DeviceView.cpp:27
#define VOID
Definition: acefi.h:82
const DOCKBAR PVOID HWND hParent
Definition: tooldock.h:22
#define IDM_PROPERTIES
Definition: resources.h:9
#define IDC_TREEVIEW
Definition: resource.h:13
#define GUID_NULL
Definition: ks.h:106
#define MessageBox
Definition: winuser.h:5797
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474
#define IDS_MENU_DISABLE
Definition: resource.h:59
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define IDS_CONFIRM_UNINSTALL
Definition: resource.h:54
LPWSTR GetDeviceId()
Definition: Node.h:40
#define _In_
Definition: no_sal2.h:158
#define MIIM_STRING
Definition: winuser.h:722
#define IDM_SCAN_HARDWARE
Definition: resource.h:23
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
DEVINST GetDeviceInst()
Definition: RootNode.h:15
#define TV_ITEM
Definition: commctrl.h:3296
#define WS_BORDER
Definition: pedump.c:625
DWORD DEVINST
Definition: cfgmgr32.h:76
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define TreeView_GetRoot(hwnd)
Definition: commctrl.h:3471
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
CDeviceView(HWND hMainWnd)
Definition: DeviceView.cpp:35
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:506
#define IDM_DISABLE_DRV
Definition: resource.h:25
#define TVIF_TEXT
Definition: commctrl.h:3262
#define IDS_MENU_ENABLE
Definition: resource.h:58
#define TreeView_SelectItem(hwnd, hitem)
Definition: commctrl.h:3477
#define TVIF_IMAGE
Definition: commctrl.h:3263
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define MB_OK
Definition: winuser.h:784
#define IDS_MENU_PROPERTIES
Definition: resource.h:63
HTREEITEM hItem
Definition: commctrl.h:3313
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
HANDLE hThread
Definition: wizard.c:27
RETURN_TYPE CONFIGRET
Definition: cfgmgr32.h:74
DEVNODE * PDEVINST
Definition: cfgmgr32.h:77
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:275
#define TVS_SHOWSELALWAYS
Definition: commctrl.h:3248
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:846
#define IDS_MENU_UNINSTALL
Definition: resource.h:60
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
#define MB_DEFBUTTON2
Definition: winuser.h:793
#define TVS_HASLINES
Definition: commctrl.h:3244
_Out_opt_ int * cx
Definition: commctrl.h:581
#define TVSIL_NORMAL
Definition: commctrl.h:3439
bool GetChildDevice(_In_ DEVINST ParentDevInst, _Out_ PDEVINST DevInst)
Definition: DeviceView.cpp:788
#define IDS_MENU_UPDATE
Definition: resource.h:57
unsigned int ULONG
Definition: retypes.h:1
#define TVIF_STATE
Definition: commctrl.h:3265
CClassNode * GetClassNode(_In_ LPGUID ClassGuid)
static unsigned int __stdcall RefreshThread(void *Param)
Definition: DeviceView.cpp:375
#define GetProcAddress(x, y)
Definition: compat.h:612
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define TVIF_PARAM
Definition: commctrl.h:3264
struct _SP_CLASSIMAGELIST_DATA SP_CLASSIMAGELIST_DATA
void BuildActionMenuForNode(_In_ HMENU OwnerMenu, _In_ CNode *Node, _In_ bool MainMenu)
Definition: DeviceView.cpp:850
WCHAR * LPWSTR
Definition: xmlstorage.h:184
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
bool m_ShowHidden
Definition: DeviceView.h:24
#define MIIM_DATA
Definition: winuser.h:721
LONG_PTR LRESULT
Definition: windef.h:209
#define TVHT_ONITEM
Definition: commctrl.h:3523
#define TV_INSERTSTRUCT
Definition: commctrl.h:3373
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3416
#define WS_VISIBLE
Definition: pedump.c:620
INT_PTR WINAPI DevicePropertiesExW(IN HWND hWndParent OPTIONAL, IN LPCWSTR lpMachineName OPTIONAL, IN LPCWSTR lpDeviceID OPTIONAL, IN DWORD dwFlags OPTIONAL, IN BOOL bShowDevMgr)
Definition: api.cpp:272
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
LPARAM lParam
Definition: combotst.c:139
LRESULT OnRightClick(_In_ LPNMHDR NmHdr)
Definition: DeviceView.cpp:128
struct tagMENUITEMINFOW MENUITEMINFOW
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
bool ListDevicesByConnection()
Definition: DeviceView.cpp:584
#define IDM_ENABLE_DRV
Definition: resource.h:24
SP_CLASSIMAGELIST_DATA m_ImageListData
Definition: DeviceView.h:29
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3486
CRootNode * m_RootNode
Definition: DeviceView.h:26
HMODULE hModule
Definition: animate.c:44
#define DIGCF_PRESENT
Definition: setupapi.h:171
PCONFIGURATION_COMPONENT_DATA RootNode
Definition: macharm.c:19
Definition: dlist.c:348