Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463/* * PROJECT: Safely Remove Hardware Applet * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: Applet initialization * COPYRIGHT: Copyright 2013 Johannes Anderwald <johannes.anderwald@reactos.org> * Copyright 2020 Eric Kohl <eric.kohl@reactos.org> */
#include "hotplug.h"
#define NDEBUG#include <debug.h>
// globalsHINSTANCE hApplet = 0;
/* Applets */APPLET Applets[NUM_APPLETS] ={ {IDI_HOTPLUG, IDS_CPLNAME, IDS_CPLDESCRIPTION, InitApplet}};
staticDWORDGetHotPlugFlags(VOID){ HKEY hKey = NULL; DWORD dwFlags = 0; DWORD dwSize, dwError;
dwError = RegOpenKeyExW(HKEY_CURRENT_USER, REGSTR_PATH_SYSTRAY, 0, KEY_READ, &hKey); if (dwError != ERROR_SUCCESS) goto done;
dwSize = sizeof(dwFlags); dwError = RegQueryValueExW(hKey, L"HotPlugFlags", NULL, NULL, (LPBYTE)&dwFlags, &dwSize); if (dwError != ERROR_SUCCESS) dwFlags = 0;
done: if (hKey != NULL) RegCloseKey(hKey);
return dwFlags;}
staticDWORDSetHotPlugFlags( _In_ DWORD dwFlags){ HKEY hKey = NULL; DWORD dwError;
dwError = RegCreateKeyExW(HKEY_CURRENT_USER, REGSTR_PATH_SYSTRAY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (dwError != ERROR_SUCCESS) goto done;
dwError = RegSetValueExW(hKey, L"HotPlugFlags", 0, REG_DWORD, (LPBYTE)&dwFlags, sizeof(dwFlags));
done: if (hKey != NULL) RegCloseKey(hKey);
return dwError;}
staticVOIDUpdateDialog( _In_ HWND hwndDlg){ HWND hwndDeviceTree; BOOL bHasItem;
hwndDeviceTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE);
bHasItem = (TreeView_GetCount(hwndDeviceTree) != 0); if (bHasItem) TreeView_SelectItem(hwndDeviceTree, TreeView_GetFirstVisible(hwndDeviceTree));
EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_PROPERTIES), bHasItem); EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_STOP), bHasItem);}
staticVOIDShowContextMenu( HWND hwndDlg, HWND hwndTreeView, PHOTPLUG_DATA pHotplugData){ HTREEITEM hTreeItem; RECT rc; POINT pt;
hTreeItem = TreeView_GetSelection(hwndTreeView); if (hTreeItem == NULL) return;
TreeView_GetItemRect(hwndTreeView, hTreeItem, &rc, TRUE);
pt.x = (rc.left + rc.right) / 2; pt.y = (rc.top + rc.bottom) / 2; ClientToScreen(hwndTreeView, &pt); TrackPopupMenu(GetSubMenu(pHotplugData->hPopupMenu, 0), TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hwndDlg, NULL);}
staticDEVINSTGetSelectedDeviceInst( _In_ PHOTPLUG_DATA pHotplugData){ HTREEITEM hTreeItem; TVITEMW item;
hTreeItem = TreeView_GetSelection(pHotplugData->hwndDeviceTree); if (hTreeItem == NULL) return 0;
ZeroMemory(&item, sizeof(item)); item.mask = TVIF_PARAM; item.hItem = hTreeItem;
TreeView_GetItem(pHotplugData->hwndDeviceTree, &item);
return item.lParam;}
staticVOIDShowDeviceProperties( _In_ HWND hwndParent, _In_ DEVINST DevInst){ ULONG ulSize; CONFIGRET cr; LPWSTR pszDevId;
cr = CM_Get_Device_ID_Size(&ulSize, DevInst, 0); if (cr != CR_SUCCESS || ulSize == 0) return;
/* Take the terminating NULL into account */ ulSize++;
pszDevId = HeapAlloc(GetProcessHeap(), 0, ulSize * sizeof(WCHAR)); if (pszDevId == NULL) return;
cr = CM_Get_Device_IDW(DevInst, pszDevId, ulSize, 0); if (cr == CR_SUCCESS) { typedef int (WINAPI *PFDEVICEPROPERTIESW)(HWND, LPCWSTR, LPCWSTR, BOOL); HMODULE hDevMgrDll; PFDEVICEPROPERTIESW pDevicePropertiesW;
hDevMgrDll = LoadLibraryW(L"devmgr.dll"); if (hDevMgrDll != NULL) { pDevicePropertiesW = (PFDEVICEPROPERTIESW)GetProcAddress(hDevMgrDll, "DevicePropertiesW"); if (pDevicePropertiesW != NULL) pDevicePropertiesW(hwndParent, NULL, pszDevId, FALSE);
FreeLibrary(hDevMgrDll); } }
HeapFree(GetProcessHeap(), 0, pszDevId);}
INT_PTRCALLBACKSafeRemovalDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PHOTPLUG_DATA pHotplugData;
pHotplugData = (PHOTPLUG_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: pHotplugData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HOTPLUG_DATA)); if (pHotplugData != NULL) { WCHAR szWindowTitle[MAX_PATH];
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pHotplugData);
if (LoadStringW(hApplet, IDS_CPLNAME, szWindowTitle, ARRAYSIZE(szWindowTitle))) { SetWindowTextW(hwndDlg, szWindowTitle); }
pHotplugData->hIcon = (HICON)LoadImageW(hApplet, MAKEINTRESOURCEW(IDI_HOTPLUG), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); pHotplugData->hIconSm = (HICON)LoadImageW(hApplet, MAKEINTRESOURCEW(IDI_HOTPLUG), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)pHotplugData->hIcon); SendMessageW(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)pHotplugData->hIconSm);
pHotplugData->ImageListData.cbSize = sizeof(pHotplugData->ImageListData); 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) Button_SetCheck(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DISPLAY_COMPONENTS), BST_CHECKED);
TreeView_SetImageList(pHotplugData->hwndDeviceTree, pHotplugData->ImageListData.ImageList, TVSIL_NORMAL);
EnumHotpluggedDevices(pHotplugData); UpdateDialog(hwndDlg); } return TRUE;
case WM_COMMAND: switch (LOWORD(wParam)) { case IDCLOSE: KillTimer(hwndDlg, 1); EndDialog(hwndDlg, TRUE); break;
case IDC_SAFE_REMOVE_DISPLAY_COMPONENTS: if (HIWORD(wParam) == BN_CLICKED) { if (pHotplugData != NULL) { if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DISPLAY_COMPONENTS)) == BST_CHECKED) pHotplugData->dwFlags |= HOTPLUG_DISPLAY_DEVICE_COMPONENTS; else pHotplugData->dwFlags &= ~HOTPLUG_DISPLAY_DEVICE_COMPONENTS;
SetHotPlugFlags(pHotplugData->dwFlags);
EnumHotpluggedDevices(pHotplugData); UpdateDialog(hwndDlg); } } break;
case IDC_SAFE_REMOVE_PROPERTIES: case IDM_PROPERTIES: ShowDeviceProperties(hwndDlg, GetSelectedDeviceInst(pHotplugData)); break;
case IDC_SAFE_REMOVE_STOP: case IDM_STOP: { if (pHotplugData != NULL) { DialogBoxParamW(hApplet, MAKEINTRESOURCEW(IDD_CONFIRM_STOP_HARDWARE_DIALOG), hwndDlg, ConfirmRemovalDlgProc, (LPARAM)pHotplugData); }
break; } } break;
case WM_DEVICECHANGE: switch (wParam) { case DBT_DEVNODES_CHANGED: SetTimer(hwndDlg, 1, 500, NULL); break; } break;
case WM_TIMER: if (wParam == 1) { KillTimer(hwndDlg, 1);
if (pHotplugData != NULL) { EnumHotpluggedDevices(pHotplugData); UpdateDialog(hwndDlg); } } break;
case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == IDC_SAFE_REMOVE_DEVICE_TREE) { if (((LPNMHDR)lParam)->code == NM_RCLICK) { if (pHotplugData != NULL) { ShowContextMenu(hwndDlg, ((LPNMHDR)lParam)->hwndFrom, pHotplugData); return TRUE; } } } break;
case WM_CLOSE: KillTimer(hwndDlg, 1); EndDialog(hwndDlg, TRUE); break;
case WM_DESTROY: if (pHotplugData != NULL) { if (pHotplugData->hPopupMenu != NULL) DestroyMenu(pHotplugData->hPopupMenu);
SetupDiDestroyClassImageList(&pHotplugData->ImageListData);
if (pHotplugData->hIconSm) DestroyIcon(pHotplugData->hIconSm);
if (pHotplugData->hIcon) DestroyIcon(pHotplugData->hIcon);
HeapFree(GetProcessHeap(), 0, pHotplugData); SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)NULL); } break; }
return FALSE;}
LONGAPIENTRYInitApplet( HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam){ DPRINT("InitApplet()\n");
DialogBox(hApplet, MAKEINTRESOURCE(IDD_SAFE_REMOVE_HARDWARE_DIALOG), hwnd, SafeRemovalDlgProc);
// TODO return TRUE;}
LONGCALLBACKCPlApplet( HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2){ UINT i = (UINT)lParam1;
switch(uMsg) { case CPL_INIT: return TRUE;
case CPL_GETCOUNT: return NUM_APPLETS;
case CPL_INQUIRE: if (i < NUM_APPLETS) { CPLINFO *CPlInfo = (CPLINFO*)lParam2; CPlInfo->lData = 0; CPlInfo->idIcon = Applets[i].idIcon; CPlInfo->idName = Applets[i].idName; CPlInfo->idInfo = Applets[i].idDescription; } else { return TRUE; } break;
case CPL_DBLCLK: if (i < NUM_APPLETS) Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); else return TRUE; break;
case CPL_STARTWPARMSW: if (i < NUM_APPLETS) return Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); break; } return FALSE;}
INTWINAPIDllMain( HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved){ UNREFERENCED_PARAMETER(lpvReserved);
switch (dwReason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: hApplet = hinstDLL; break; } return TRUE;}