ReactOS 0.4.15-dev-6069-g56a4501
hotplug.c
Go to the documentation of this file.
1/*
2* PROJECT: Safely Remove Hardware Applet
3* LICENSE: GPL - See COPYING in the top level directory
4* FILE: dll/cpl/hotplug/hotplug.c
5* PURPOSE: applet initialization
6* PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
7*/
8
9#include "hotplug.h"
10
11#include <initguid.h>
12#include <devguid.h>
13
14#define NDEBUG
15#include <debug.h>
16
17
18typedef struct _HOTPLUG_DATA
19{
26
27
28// globals
30
31/* Applets */
33{
35};
36
37static
40{
41 HKEY hKey = NULL;
42 DWORD dwFlags = 0;
43 DWORD dwSize, dwError;
44
47 0,
49 &hKey);
50 if (dwError != ERROR_SUCCESS)
51 goto done;
52
53 dwSize = sizeof(dwFlags);
54 dwError = RegQueryValueExW(hKey,
55 L"HotPlugFlags",
56 NULL,
57 NULL,
59 &dwSize);
60 if (dwError != ERROR_SUCCESS)
61 dwFlags = 0;
62
63done:
64 if (hKey != NULL)
66
67 return dwFlags;
68}
69
70
71static
75{
76 HKEY hKey = NULL;
77 DWORD dwError;
78
81 0,
82 NULL,
85 NULL,
86 &hKey,
87 NULL);
88 if (dwError != ERROR_SUCCESS)
89 goto done;
90
91 dwError = RegSetValueExW(hKey,
92 L"HotPlugFlags",
93 0,
96 sizeof(dwFlags));
97
98done:
99 if (hKey != NULL)
101
102 return dwError;
103}
104
105
106static
109 _In_ HWND hwndDeviceTree,
110 _In_ HTREEITEM hParent,
111 _In_ DWORD DevInst,
112 _In_ PHOTPLUG_DATA pHotplugData)
113{
114 WCHAR szDisplayName[40];
115 WCHAR szGuidString[MAX_GUID_STRING_LEN];
116 TVINSERTSTRUCTW tvItem;
117 GUID ClassGuid;
118 INT nClassImage;
120 CONFIGRET cr;
121
122 /* Get the device description */
123 dwSize = sizeof(szDisplayName);
126 NULL,
127 szDisplayName,
128 &dwSize,
129 0);
130 if (cr != CR_SUCCESS)
131 wcscpy(szDisplayName, L"Unknown Device");
132
133 /* Get the class GUID */
134 dwSize = sizeof(szGuidString);
137 NULL,
138 szGuidString,
139 &dwSize,
140 0);
141 if (cr == CR_SUCCESS)
142 {
143 pSetupGuidFromString(szGuidString, &ClassGuid);
144 }
145 else
146 {
147 memcpy(&ClassGuid, &GUID_DEVCLASS_UNKNOWN, sizeof(GUID));
148 }
149
150 /* Get the image for the class this device is in */
151 SetupDiGetClassImageIndex(&pHotplugData->ImageListData,
152 &ClassGuid,
153 &nClassImage);
154
155 /* Add it to the device tree */
156 ZeroMemory(&tvItem, sizeof(tvItem));
157 tvItem.hParent = hParent;
158 tvItem.hInsertAfter = TVI_LAST;
159
160 tvItem.item.mask = TVIF_STATE | TVIF_TEXT /*| TVIF_PARAM*/ | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
161 tvItem.item.state = TVIS_EXPANDED;
162 tvItem.item.stateMask = TVIS_EXPANDED;
163 tvItem.item.pszText = szDisplayName;
164 tvItem.item.iImage = nClassImage;
165 tvItem.item.iSelectedImage = nClassImage;
166 tvItem.item.lParam = (LPARAM)NULL;
167
168 return TreeView_InsertItem(hwndDeviceTree, &tvItem);
169}
170
171
172static
173VOID
175 _In_ HWND hwndDeviceTree,
176 _In_ HTREEITEM hParentItem,
177 _In_ DWORD ParentDevInst,
178 _In_ PHOTPLUG_DATA pHotplugData)
179{
180 HTREEITEM hTreeItem;
181 DEVINST ChildDevInst;
182 CONFIGRET cr;
183
184 DPRINT("RecursiveInsertSubDevices()\n");
185
186 cr = CM_Get_Child(&ChildDevInst, ParentDevInst, 0);
187 if (cr != CR_SUCCESS)
188 {
189 DPRINT("No child! %lu\n", cr);
190 return;
191 }
192
193 hTreeItem = InsertDeviceTreeItem(hwndDeviceTree,
194 hParentItem,
195 ChildDevInst,
196 pHotplugData);
197 if (hTreeItem != NULL)
198 {
199 RecursiveInsertSubDevices(hwndDeviceTree,
200 hTreeItem,
201 ChildDevInst,
202 pHotplugData);
203 }
204
205 for (;;)
206 {
207 cr = CM_Get_Sibling(&ChildDevInst, ChildDevInst, 0);
208 if (cr != CR_SUCCESS)
209 {
210 DPRINT("No sibling! %lu\n", cr);
211 return;
212 }
213
214 hTreeItem = InsertDeviceTreeItem(hwndDeviceTree,
215 hParentItem,
216 ChildDevInst,
217 pHotplugData);
218 if (hTreeItem != NULL)
219 {
220 RecursiveInsertSubDevices(hwndDeviceTree,
221 hTreeItem,
222 ChildDevInst,
223 pHotplugData);
224 }
225 }
226}
227
228
229static
230VOID
232 HWND hwndDeviceTree,
233 PHOTPLUG_DATA pHotplugData)
234{
235 SP_DEVINFO_DATA did = { 0 };
237 int idev;
238 DWORD dwCapabilities, dwSize;
239 ULONG ulStatus, ulProblem;
240 HTREEITEM hTreeItem;
241 CONFIGRET cr;
242
243 DPRINT1("EnumHotpluggedDevices()\n");
244
245 TreeView_DeleteAllItems(hwndDeviceTree);
246
249 return;
250
251 did.cbSize = sizeof(did);
252
253 /* Enumerate all the attached devices */
254 for (idev = 0; SetupDiEnumDeviceInfo(hdev, idev, &did); idev++)
255 {
256 ulStatus = 0;
257 ulProblem = 0;
258
259 cr = CM_Get_DevNode_Status(&ulStatus,
260 &ulProblem,
261 did.DevInst,
262 0);
263 if (cr != CR_SUCCESS)
264 continue;
265
266 dwCapabilities = 0,
267 dwSize = sizeof(dwCapabilities);
270 NULL,
271 &dwCapabilities,
272 &dwSize,
273 0);
274 if (cr != CR_SUCCESS)
275 continue;
276
277 /* Add devices that require safe removal to the device tree */
278 if ( (dwCapabilities & CM_DEVCAP_REMOVABLE) &&
279 !(dwCapabilities & CM_DEVCAP_DOCKDEVICE) &&
280 !(dwCapabilities & CM_DEVCAP_SURPRISEREMOVALOK) &&
281 ((dwCapabilities & CM_DEVCAP_EJECTSUPPORTED) || (ulStatus & DN_DISABLEABLE)) &&
282 ulProblem == 0)
283 {
284 hTreeItem = InsertDeviceTreeItem(hwndDeviceTree,
285 TVI_ROOT,
286 did.DevInst,
287 pHotplugData);
288
289 if ((hTreeItem != NULL) && (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS))
290 {
291 RecursiveInsertSubDevices(hwndDeviceTree,
292 hTreeItem,
293 did.DevInst,
294 pHotplugData);
295 }
296 }
297 }
298
300}
301
302
303static
304VOID
306 HWND hwndDlg)
307{
308 BOOL bEnabled;
309
310 bEnabled = (TreeView_GetCount(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE)) != 0);
311
313 EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_STOP), bEnabled);
314}
315
316
317static
318VOID
320 HWND hwndDlg,
322 PHOTPLUG_DATA pHotplugData)
323{
324 HTREEITEM hTreeItem;
325 RECT rc;
326 POINT pt;
327
329 if (hTreeItem == NULL)
330 return;
331
332 TreeView_GetItemRect(hwndTreeView, hTreeItem, &rc, TRUE);
333
334 pt.x = (rc.left + rc.right) / 2;
335 pt.y = (rc.top + rc.bottom) / 2;
337 TrackPopupMenu(GetSubMenu(pHotplugData->hPopupMenu, 0),
339 pt.x,
340 pt.y,
341 0,
342 hwndDlg,
343 NULL);
344}
345
346
350 HWND hwndDlg,
351 UINT uMsg,
354{
355 PHOTPLUG_DATA pHotplugData;
356
357 pHotplugData = (PHOTPLUG_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
358
359 switch (uMsg)
360 {
361 case WM_INITDIALOG:
362 pHotplugData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HOTPLUG_DATA));
363 if (pHotplugData != NULL)
364 {
365 WCHAR szWindowTitle[MAX_PATH];
366
367 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pHotplugData);
368
371 szWindowTitle,
372 ARRAYSIZE(szWindowTitle)))
373 {
374 SetWindowTextW(hwndDlg, szWindowTitle);
375 }
376
377 pHotplugData->hIcon = (HICON)LoadImageW(hApplet,
383 pHotplugData->hIconSm = (HICON)LoadImageW(hApplet,
389 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)pHotplugData->hIcon);
390 SendMessageW(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)pHotplugData->hIconSm);
391
392 pHotplugData->ImageListData.cbSize = sizeof(pHotplugData->ImageListData);
393 SetupDiGetClassImageList(&pHotplugData->ImageListData);
394
395 pHotplugData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_DEVICE_TREE));
396
397 pHotplugData->dwFlags = GetHotPlugFlags();
398
399 if (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS)
401
403 pHotplugData->ImageListData.ImageList,
405
407 pHotplugData);
408 UpdateButtons(hwndDlg);
409 }
410 return TRUE;
411
412 case WM_COMMAND:
413 switch (LOWORD(wParam))
414 {
415 case IDCLOSE:
416 KillTimer(hwndDlg, 1);
417 EndDialog(hwndDlg, TRUE);
418 break;
419
421 if (HIWORD(wParam) == BN_CLICKED)
422 {
423 if (pHotplugData != NULL)
424 {
427 else
428 pHotplugData->dwFlags &= ~HOTPLUG_DISPLAY_DEVICE_COMPONENTS;
429
430 SetHotPlugFlags(pHotplugData->dwFlags);
431
433 pHotplugData);
434 }
435 }
436 break;
437 }
438 break;
439
440 case WM_DEVICECHANGE:
441 switch (wParam)
442 {
444 SetTimer(hwndDlg, 1, 500, NULL);
445 break;
446 }
447 break;
448
449 case WM_TIMER:
450 if (wParam == 1)
451 {
452 KillTimer(hwndDlg, 1);
453
454 if (pHotplugData != NULL)
455 {
457 pHotplugData);
458 UpdateButtons(hwndDlg);
459 }
460 }
461 break;
462
463 case WM_NOTIFY:
465 {
466 if (((LPNMHDR)lParam)->code == NM_RCLICK)
467 {
468 if (pHotplugData != NULL)
469 {
470 ShowContextMenu(hwndDlg,
471 ((LPNMHDR)lParam)->hwndFrom,
472 pHotplugData);
473 return TRUE;
474 }
475 }
476 }
477 break;
478
479 case WM_CLOSE:
480 KillTimer(hwndDlg, 1);
481 EndDialog(hwndDlg, TRUE);
482 break;
483
484 case WM_DESTROY:
485 if (pHotplugData != NULL)
486 {
487 if (pHotplugData->hPopupMenu != NULL)
488 DestroyMenu(pHotplugData->hPopupMenu);
489
491
492 if (pHotplugData->hIconSm)
493 {
494 DestroyIcon(pHotplugData->hIconSm);
495 }
496
497 if (pHotplugData->hIcon)
498 {
499 DestroyIcon(pHotplugData->hIcon);
500 }
501
502 HeapFree(GetProcessHeap(), 0, pHotplugData);
504 }
505 break;
506 }
507
508 return FALSE;
509}
510
511
512LONG
515 HWND hwnd,
516 UINT uMsg,
519{
520 DPRINT("InitApplet()\n");
521
524 hwnd,
526
527 // TODO
528 return TRUE;
529}
530
531
532LONG
535 HWND hwndCPl,
536 UINT uMsg,
537 LPARAM lParam1,
538 LPARAM lParam2)
539{
540 UINT i = (UINT)lParam1;
541
542 switch(uMsg)
543 {
544 case CPL_INIT:
545 return TRUE;
546
547 case CPL_GETCOUNT:
548 return NUM_APPLETS;
549
550 case CPL_INQUIRE:
551 if (i < NUM_APPLETS)
552 {
553 CPLINFO *CPlInfo = (CPLINFO*)lParam2;
554 CPlInfo->lData = 0;
555 CPlInfo->idIcon = Applets[i].idIcon;
556 CPlInfo->idName = Applets[i].idName;
557 CPlInfo->idInfo = Applets[i].idDescription;
558 }
559 else
560 {
561 return TRUE;
562 }
563 break;
564
565 case CPL_DBLCLK:
566 if (i < NUM_APPLETS)
567 Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
568 else
569 return TRUE;
570 break;
571
572 case CPL_STARTWPARMSW:
573 if (i < NUM_APPLETS)
574 return Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
575 break;
576 }
577 return FALSE;
578}
579
580
581INT
582WINAPI
584 HINSTANCE hinstDLL,
587{
589
590 switch (dwReason)
591 {
594 hApplet = hinstDLL;
595 break;
596 }
597 return TRUE;
598}
#define DPRINT1
Definition: precomp.h:8
DWORD dwReason
Definition: misc.cpp:154
#define RegCloseKey(hKey)
Definition: registry.h:47
#define DN_DISABLEABLE
Definition: cfg.h:131
#define CM_DEVCAP_EJECTSUPPORTED
Definition: cfgmgr32.h:736
#define CM_DRP_CAPABILITIES
Definition: cfgmgr32.h:691
#define CM_DRP_CLASSGUID
Definition: cfgmgr32.h:684
#define CM_DRP_DEVICEDESC
Definition: cfgmgr32.h:676
DWORD DEVINST
Definition: cfgmgr32.h:76
#define CM_Get_DevNode_Registry_Property
Definition: cfgmgr32.h:1733
#define CM_DEVCAP_SURPRISEREMOVALOK
Definition: cfgmgr32.h:742
#define CM_DEVCAP_DOCKDEVICE
Definition: cfgmgr32.h:738
#define CM_DEVCAP_REMOVABLE
Definition: cfgmgr32.h:737
RETURN_TYPE CONFIGRET
Definition: cfgmgr32.h:74
#define CR_SUCCESS
Definition: cfgmgr32.h:842
CONFIGRET WINAPI CM_Get_DevNode_Status(_Out_ PULONG pulStatus, _Out_ PULONG pulProblemNumber, _In_ DEVINST dnDevInst, _In_ ULONG ulFlags)
Definition: cfgmgr.c:3573
CONFIGRET WINAPI CM_Get_Child(_Out_ PDEVINST pdnDevInst, _In_ DEVINST dnDevInst, _In_ ULONG ulFlags)
Definition: cfgmgr.c:2530
CONFIGRET WINAPI CM_Get_Sibling(_Out_ PDEVINST pdnDevInst, _In_ DEVINST dnDevInst, _In_ ULONG ulFlags)
Definition: cfgmgr.c:5530
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define CPL_INQUIRE
Definition: cpl.h:14
#define CPL_DBLCLK
Definition: cpl.h:16
#define CPL_STARTWPARMSW
Definition: cpl.h:21
#define CPL_INIT
Definition: cpl.h:12
#define CPL_GETCOUNT
Definition: cpl.h:13
#define DBT_DEVNODES_CHANGED
Definition: dbt.h:28
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MAX_GUID_STRING_LEN
Definition: apphelp.c:29
#define NUM_APPLETS
Definition: access.c:14
#define IDS_CPLNAME
Definition: resource.h:8
#define IDS_CPLDESCRIPTION
Definition: resource.h:9
#define IDM_POPUP_DEVICE_TREE
Definition: resource.h:20
#define IDC_SAFE_REMOVE_DEVICE_TREE
Definition: resource.h:11
#define IDC_SAFE_REMOVE_DISPLAY_COMPONENTS
Definition: resource.h:15
#define IDC_SAFE_REMOVE_PROPERTIES
Definition: resource.h:13
#define IDC_SAFE_REMOVE_STOP
Definition: resource.h:14
#define IDI_HOTPLUG
Definition: resource.h:4
#define IDD_SAFE_REMOVE_HARDWARE_DIALOG
Definition: resource.h:9
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define APIENTRY
Definition: api.h:79
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1091
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3353
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4897
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4118
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define DLL_THREAD_ATTACH
Definition: compat.h:132
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
DWORD WINAPI pSetupGuidFromString(PCWSTR pString, LPGUID lpGUID)
Definition: misc.c:1751
BOOL WINAPI SetupDiDestroyClassImageList(IN PSP_CLASSIMAGELIST_DATA ClassImageListData)
Definition: devclass.c:85
BOOL WINAPI SetupDiGetClassImageIndex(IN PSP_CLASSIMAGELIST_DATA ClassImageListData, IN CONST GUID *ClassGuid, OUT PINT ImageIndex)
Definition: devclass.c:277
BOOL WINAPI SetupDiGetClassImageList(OUT PSP_CLASSIMAGELIST_DATA ClassImageListData)
Definition: devclass.c:322
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
Definition: devinst.c:1787
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2893
#define pt(x, y)
Definition: drawing.c:79
HWND hwndTreeView
Definition: eventvwr.c:65
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
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
static VOID ShowContextMenu(HWND hwndDlg, HWND hwndTreeView, PHOTPLUG_DATA pHotplugData)
Definition: hotplug.c:319
LONG APIENTRY InitApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
Definition: hotplug.c:514
INT_PTR CALLBACK SafeRemovalDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: hotplug.c:349
static DWORD SetHotPlugFlags(_In_ DWORD dwFlags)
Definition: hotplug.c:73
static VOID RecursiveInsertSubDevices(_In_ HWND hwndDeviceTree, _In_ HTREEITEM hParentItem, _In_ DWORD ParentDevInst, _In_ PHOTPLUG_DATA pHotplugData)
Definition: hotplug.c:174
static VOID EnumHotpluggedDevices(HWND hwndDeviceTree, PHOTPLUG_DATA pHotplugData)
Definition: hotplug.c:231
INT WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
Definition: hotplug.c:583
static HTREEITEM InsertDeviceTreeItem(_In_ HWND hwndDeviceTree, _In_ HTREEITEM hParent, _In_ DWORD DevInst, _In_ PHOTPLUG_DATA pHotplugData)
Definition: hotplug.c:108
static DWORD GetHotPlugFlags(VOID)
Definition: hotplug.c:39
APPLET Applets[NUM_APPLETS]
Definition: hotplug.c:32
struct _HOTPLUG_DATA * PHOTPLUG_DATA
static VOID UpdateButtons(HWND hwndDlg)
Definition: hotplug.c:305
struct _HOTPLUG_DATA HOTPLUG_DATA
HINSTANCE hApplet
Definition: hotplug.c:29
#define HOTPLUG_DISPLAY_DEVICE_COMPONENTS
Definition: hotplug.h:24
static IN DWORD IN LPVOID lpvReserved
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HICON
Definition: imagelist.c:84
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define _In_
Definition: ms_sal.h:308
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1023
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_WRITE
Definition: nt_native.h:1031
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
#define TVI_LAST
Definition: commctrl.h:3370
#define TreeView_DeleteAllItems(hwnd)
Definition: commctrl.h:3417
#define TVIF_TEXT
Definition: commctrl.h:3266
#define TVIF_IMAGE
Definition: commctrl.h:3267
#define TVSIL_NORMAL
Definition: commctrl.h:3443
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3473
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
Definition: commctrl.h:3429
#define TreeView_GetCount(hwnd)
Definition: commctrl.h:3432
#define TVI_ROOT
Definition: commctrl.h:3368
#define TVIS_EXPANDED
Definition: commctrl.h:3284
#define NM_RCLICK
Definition: commctrl.h:133
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3447
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3412
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3271
#define TVIF_STATE
Definition: commctrl.h:3269
#define REGSTR_PATH_SYSTRAY
Definition: regstr.h:531
#define WM_NOTIFY
Definition: richedit.h:61
#define REG_DWORD
Definition: sdbapi.c:596
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define DIGCF_ALLCLASSES
Definition: setupapi.h:172
#define SetupDiGetClassDevs
Definition: setupapi.h:2593
#define DIGCF_PRESENT
Definition: setupapi.h:171
#define DPRINT
Definition: sndvol32.h:71
Definition: hotplug.h:34
int idDescription
Definition: hotplug.h:37
int idName
Definition: hotplug.h:36
int idIcon
Definition: hotplug.h:35
APPLET_PROC AppletProc
Definition: hotplug.h:38
HMENU hPopupMenu
Definition: hotplug.c:23
HICON hIcon
Definition: hotplug.c:20
DWORD dwFlags
Definition: hotplug.c:24
HICON hIconSm
Definition: hotplug.c:21
SP_CLASSIMAGELIST_DATA ImageListData
Definition: hotplug.c:22
Definition: inflate.c:139
Definition: cpl.h:24
LONG_PTR lData
Definition: cpl.h:28
int idName
Definition: cpl.h:26
int idInfo
Definition: cpl.h:27
int idIcon
Definition: cpl.h:25
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
HTREEITEM hParent
Definition: commctrl.h:3393
HTREEITEM hInsertAfter
Definition: commctrl.h:3394
#define ICON_BIG
Definition: tnclass.cpp:51
#define ICON_SMALL
Definition: tnclass.cpp:48
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
int32_t INT_PTR
Definition: typedefs.h:64
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define ZeroMemory
Definition: winbase.h:1670
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ HDEV hdev
Definition: winddi.h:3449
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define Button_GetCheck(hwndCtl)
Definition: windowsx.h:31
#define Button_SetCheck(hwndCtl, check)
Definition: windowsx.h:35
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define WM_CLOSE
Definition: winuser.h:1611
#define DWLP_USER
Definition: winuser.h:866
#define IMAGE_ICON
Definition: winuser.h:212
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define WM_COMMAND
Definition: winuser.h:1730
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2172
#define SM_CYSMICON
Definition: winuser.h:1007
#define WM_INITDIALOG
Definition: winuser.h:1729
#define WM_DEVICECHANGE
Definition: winuser.h:1801
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define TPM_TOPALIGN
Definition: winuser.h:2373
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define SM_CXSMICON
Definition: winuser.h:1006
#define SM_CYICON
Definition: winuser.h:967
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define WM_TIMER
Definition: winuser.h:1732
#define TPM_LEFTALIGN
Definition: winuser.h:2367
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define LoadMenu
Definition: winuser.h:5807
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define LR_DEFAULTCOLOR
Definition: winuser.h:1081
#define BN_CLICKED
Definition: winuser.h:1915
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define WM_DESTROY
Definition: winuser.h:1599
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SM_CXICON
Definition: winuser.h:966
#define MAKEINTRESOURCE
Definition: winuser.h:591
int WINAPI GetSystemMetrics(_In_ int)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
#define DialogBox
Definition: winuser.h:5751
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
__wchar_t WCHAR
Definition: xmlstorage.h:180