diff --git a/dll/cpl/hotplug/eject.c b/dll/cpl/hotplug/eject.c index 2de314ba50e11..ffa107ee44ff6 100644 --- a/dll/cpl/hotplug/eject.c +++ b/dll/cpl/hotplug/eject.c @@ -7,6 +7,55 @@ #include "hotplug.h" +static +HTREEITEM +GetTopLevelItemOfSelectedDevice( + _In_ HWND hwndDeviceTree) +{ + HTREEITEM hTreeItem; + + hTreeItem = TreeView_GetSelection(hwndDeviceTree); + if (!hTreeItem) + return NULL; + + while (TreeView_GetParent(hwndDeviceTree, hTreeItem)) + { + hTreeItem = TreeView_GetParent(hwndDeviceTree, hTreeItem); + } + + return hTreeItem; +} + +static +VOID +FillConfirmDeviceList( + _In_ HWND hwndDeviceTree, + _In_ HWND hwndCfmDeviceList) +{ + +} + +static +DEVINST +GetDeviceInstForRemoval( + _In_ HWND hwndDeviceTree) +{ + HTREEITEM hTreeItem; + TVITEMW item; + + hTreeItem = GetTopLevelItemOfSelectedDevice(hwndDeviceTree); + if (!hTreeItem) + return 0; + + ZeroMemory(&item, sizeof(item)); + item.mask = TVIF_PARAM; + item.hItem = hTreeItem; + + TreeView_GetItem(hwndDeviceTree, &item); + + return item.lParam; +} + static VOID SafeRemoveDevice( @@ -32,20 +81,30 @@ ConfirmRemovalDlgProc( WPARAM wParam, LPARAM lParam) { - static DEVINST selectedDev; + PHOTPLUG_DATA pHotplugData; + + pHotplugData = (PHOTPLUG_DATA)GetWindowLongPtrW(hwndDlg, DWLP_USER); switch (uMsg) { case WM_INITDIALOG: - selectedDev = lParam; + { + pHotplugData = (PHOTPLUG_DATA)lParam; + SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)pHotplugData); + + ListView_SetImageList(GetDlgItem(hwndDlg, IDC_CONFIRM_STOP_DEVICE_LIST), + pHotplugData->ImageListData.ImageList, + LVSIL_NORMAL); + return TRUE; + } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: - SafeRemoveDevice(selectedDev); + SafeRemoveDevice(GetDeviceInstForRemoval(pHotplugData->hwndDeviceTree)); EndDialog(hwndDlg, TRUE); break; @@ -56,6 +115,10 @@ ConfirmRemovalDlgProc( break; } + + case WM_DESTROY: + SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)NULL); + break; } return FALSE; diff --git a/dll/cpl/hotplug/hotplug.c b/dll/cpl/hotplug/hotplug.c index a74728abf99a0..58c570fb6bd9c 100644 --- a/dll/cpl/hotplug/hotplug.c +++ b/dll/cpl/hotplug/hotplug.c @@ -14,17 +14,6 @@ #define NDEBUG #include - -typedef struct _HOTPLUG_DATA -{ - HICON hIcon; - HICON hIconSm; - SP_CLASSIMAGELIST_DATA ImageListData; - HMENU hPopupMenu; - DWORD dwFlags; -} HOTPLUG_DATA, *PHOTPLUG_DATA; - - // globals HINSTANCE hApplet = 0; @@ -456,7 +445,7 @@ SafeRemovalDlgProc( SetupDiGetClassImageList(&pHotplugData->ImageListData); pHotplugData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_DEVICE_TREE)); - + pHotplugData->hwndDeviceTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE); pHotplugData->dwFlags = GetHotPlugFlags(); if (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS) @@ -509,12 +498,15 @@ SafeRemovalDlgProc( case IDC_SAFE_REMOVE_STOP: case IDM_STOP: { - HWND hwndDevTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE); - DialogBoxParamW(hApplet, - MAKEINTRESOURCEW(IDD_CONFIRM_STOP_HARDWARE_DIALOG), - hwndDlg, - ConfirmRemovalDlgProc, - (LPARAM)GetSelectedDeviceInst(hwndDevTree)); + if (pHotplugData != NULL) + { + DialogBoxParamW(hApplet, + MAKEINTRESOURCEW(IDD_CONFIRM_STOP_HARDWARE_DIALOG), + hwndDlg, + ConfirmRemovalDlgProc, + (LPARAM)pHotplugData); + } + break; } } diff --git a/dll/cpl/hotplug/hotplug.h b/dll/cpl/hotplug/hotplug.h index 47cf851b93a9a..66e8dccb9f9d2 100644 --- a/dll/cpl/hotplug/hotplug.h +++ b/dll/cpl/hotplug/hotplug.h @@ -38,6 +38,15 @@ typedef struct APPLET_PROC AppletProc; }APPLET, *PAPPLET; +typedef struct _HOTPLUG_DATA +{ + HICON hIcon; + HICON hIconSm; + SP_CLASSIMAGELIST_DATA ImageListData; + HMENU hPopupMenu; + HWND hwndDeviceTree; + DWORD dwFlags; +} HOTPLUG_DATA, *PHOTPLUG_DATA; // eject.c INT_PTR