mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[HOTPLUG] Add device removal support (#5836)
This commit is contained in:
parent
b69a7460db
commit
119057800e
20 changed files with 686 additions and 239 deletions
|
@ -3,6 +3,7 @@ spec2def(hotplug.dll hotplug.spec)
|
||||||
|
|
||||||
list(APPEND SOURCE
|
list(APPEND SOURCE
|
||||||
hotplug.c
|
hotplug.c
|
||||||
|
eject.c
|
||||||
enum.c)
|
enum.c)
|
||||||
|
|
||||||
file(GLOB hotplug_rc_deps resources/*.*)
|
file(GLOB hotplug_rc_deps resources/*.*)
|
||||||
|
|
137
dll/cpl/hotplug/eject.c
Normal file
137
dll/cpl/hotplug/eject.c
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: Safely Remove Hardware Applet
|
||||||
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||||
|
* PURPOSE: Device removal support
|
||||||
|
* COPYRIGHT: Copyright 2023 Thamatip Chitpong <thamatip.chitpong@reactos.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hotplug.h"
|
||||||
|
|
||||||
|
#include <strsafe.h>
|
||||||
|
|
||||||
|
DEVINST
|
||||||
|
GetDeviceInstForRemoval(
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
HTREEITEM hItem, hParentItem;
|
||||||
|
TVITEMW tvItem;
|
||||||
|
|
||||||
|
hItem = TreeView_GetSelection(pHotplugData->hwndDeviceTree);
|
||||||
|
if (!hItem)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Find root item */
|
||||||
|
hParentItem = TreeView_GetParent(pHotplugData->hwndDeviceTree, hItem);
|
||||||
|
while (hParentItem)
|
||||||
|
{
|
||||||
|
hItem = hParentItem;
|
||||||
|
hParentItem = TreeView_GetParent(pHotplugData->hwndDeviceTree, hItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZeroMemory(&tvItem, sizeof(tvItem));
|
||||||
|
tvItem.mask = TVIF_PARAM;
|
||||||
|
tvItem.hItem = hItem;
|
||||||
|
|
||||||
|
TreeView_GetItem(pHotplugData->hwndDeviceTree, &tvItem);
|
||||||
|
|
||||||
|
return tvItem.lParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
FillConfirmDeviceList(
|
||||||
|
_In_ HWND hwndCfmDeviceList,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
LVCOLUMNW lvColumn;
|
||||||
|
|
||||||
|
ZeroMemory(&lvColumn, sizeof(lvColumn));
|
||||||
|
lvColumn.mask = LVCF_FMT;
|
||||||
|
lvColumn.fmt = LVCFMT_LEFT | LVCFMT_IMAGE;
|
||||||
|
ListView_InsertColumn(hwndCfmDeviceList, 0, &lvColumn);
|
||||||
|
|
||||||
|
CfmListEnumDevices(hwndCfmDeviceList, pHotplugData);
|
||||||
|
|
||||||
|
ListView_SetColumnWidth(hwndCfmDeviceList, 0, LVSCW_AUTOSIZE_USEHEADER);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
SafeRemoveDevice(
|
||||||
|
_In_ DEVINST DevInst,
|
||||||
|
_In_opt_ HWND hwndDlg)
|
||||||
|
{
|
||||||
|
PNP_VETO_TYPE VetoType = PNP_VetoTypeUnknown;
|
||||||
|
CONFIGRET cr;
|
||||||
|
|
||||||
|
cr = CM_Request_Device_EjectW(DevInst, &VetoType, NULL, 0, 0);
|
||||||
|
if (cr != CR_SUCCESS && VetoType == PNP_VetoTypeUnknown)
|
||||||
|
{
|
||||||
|
LPCWSTR pszFormat = L"";
|
||||||
|
WCHAR szError[64];
|
||||||
|
|
||||||
|
/* NOTES: IDS_EJECT_ERROR_FORMAT resource has to be explicitly NULL-terminated
|
||||||
|
* so we can use the string directly without having to make a copy of it. */
|
||||||
|
LoadStringW(hApplet, IDS_EJECT_ERROR_FORMAT, (LPWSTR)&pszFormat, 0);
|
||||||
|
StringCbPrintfW(szError, sizeof(szError), pszFormat, cr);
|
||||||
|
|
||||||
|
MessageBoxW(hwndDlg, szError, NULL, MB_ICONEXCLAMATION | MB_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INT_PTR
|
||||||
|
CALLBACK
|
||||||
|
ConfirmRemovalDlgProc(
|
||||||
|
_In_ HWND hwndDlg,
|
||||||
|
_In_ UINT uMsg,
|
||||||
|
_In_ WPARAM wParam,
|
||||||
|
_In_ LPARAM lParam)
|
||||||
|
{
|
||||||
|
PHOTPLUG_DATA pHotplugData;
|
||||||
|
|
||||||
|
pHotplugData = (PHOTPLUG_DATA)GetWindowLongPtrW(hwndDlg, DWLP_USER);
|
||||||
|
|
||||||
|
switch (uMsg)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
{
|
||||||
|
HWND hwndDevList;
|
||||||
|
|
||||||
|
pHotplugData = (PHOTPLUG_DATA)lParam;
|
||||||
|
SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)pHotplugData);
|
||||||
|
|
||||||
|
hwndDevList = GetDlgItem(hwndDlg, IDC_CONFIRM_STOP_DEVICE_LIST);
|
||||||
|
|
||||||
|
ListView_SetImageList(hwndDevList,
|
||||||
|
pHotplugData->ImageListData.ImageList,
|
||||||
|
LVSIL_SMALL);
|
||||||
|
|
||||||
|
FillConfirmDeviceList(hwndDevList, pHotplugData);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDOK:
|
||||||
|
SafeRemoveDevice(GetDeviceInstForRemoval(pHotplugData), hwndDlg);
|
||||||
|
EndDialog(hwndDlg, LOWORD(wParam));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDCANCEL:
|
||||||
|
EndDialog(hwndDlg, LOWORD(wParam));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
|
@ -1,7 +1,284 @@
|
||||||
/*
|
/*
|
||||||
* PROJECT: Safely Remove Hardware Applet
|
* PROJECT: Safely Remove Hardware Applet
|
||||||
* LICENSE: GPL - See COPYING in the top level directory
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||||
* FILE: dll/cpl/hotplug/enum.c
|
* PURPOSE: Device enumeration
|
||||||
* PURPOSE: device enumeration
|
* COPYRIGHT: Copyright 2013 Johannes Anderwald <johannes.anderwald@reactos.org>
|
||||||
* PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
|
* Copyright 2023 Thamatip Chitpong <thamatip.chitpong@reactos.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "hotplug.h"
|
||||||
|
|
||||||
|
#include <initguid.h>
|
||||||
|
#include <devguid.h>
|
||||||
|
|
||||||
|
#define MAX_DEVICE_DISPLAYNAME_LEN 256
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
GetDeviceDisplayInfo(
|
||||||
|
_In_ DEVINST DevInst,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData,
|
||||||
|
_Out_writes_z_(cchDesc) LPWSTR pszDesc,
|
||||||
|
_In_ ULONG cchDesc,
|
||||||
|
_Out_ PINT pImageIndex)
|
||||||
|
{
|
||||||
|
WCHAR szGuidString[MAX_GUID_STRING_LEN];
|
||||||
|
GUID ClassGuid;
|
||||||
|
ULONG ulSize;
|
||||||
|
CONFIGRET cr;
|
||||||
|
|
||||||
|
/* Get the device description */
|
||||||
|
ulSize = cchDesc * sizeof(WCHAR);
|
||||||
|
cr = CM_Get_DevNode_Registry_PropertyW(DevInst,
|
||||||
|
CM_DRP_FRIENDLYNAME,
|
||||||
|
NULL,
|
||||||
|
pszDesc,
|
||||||
|
&ulSize,
|
||||||
|
0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
{
|
||||||
|
ulSize = cchDesc * sizeof(WCHAR);
|
||||||
|
cr = CM_Get_DevNode_Registry_PropertyW(DevInst,
|
||||||
|
CM_DRP_DEVICEDESC,
|
||||||
|
NULL,
|
||||||
|
pszDesc,
|
||||||
|
&ulSize,
|
||||||
|
0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
LoadStringW(hApplet, IDS_UNKNOWN_DEVICE, pszDesc, cchDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the class GUID */
|
||||||
|
ulSize = sizeof(szGuidString);
|
||||||
|
cr = CM_Get_DevNode_Registry_PropertyW(DevInst,
|
||||||
|
CM_DRP_CLASSGUID,
|
||||||
|
NULL,
|
||||||
|
szGuidString,
|
||||||
|
&ulSize,
|
||||||
|
0);
|
||||||
|
if (cr == CR_SUCCESS)
|
||||||
|
{
|
||||||
|
pSetupGuidFromString(szGuidString, &ClassGuid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClassGuid = GUID_DEVCLASS_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the image for the class this device is in */
|
||||||
|
SetupDiGetClassImageIndex(&pHotplugData->ImageListData,
|
||||||
|
&ClassGuid,
|
||||||
|
pImageIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
HTREEITEM
|
||||||
|
InsertDeviceTreeItem(
|
||||||
|
_In_ HTREEITEM hParent,
|
||||||
|
_In_ DEVINST DevInst,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
WCHAR szDisplayName[MAX_DEVICE_DISPLAYNAME_LEN];
|
||||||
|
INT nClassImage;
|
||||||
|
TVINSERTSTRUCTW tvItem;
|
||||||
|
|
||||||
|
GetDeviceDisplayInfo(DevInst,
|
||||||
|
pHotplugData,
|
||||||
|
szDisplayName,
|
||||||
|
ARRAYSIZE(szDisplayName),
|
||||||
|
&nClassImage);
|
||||||
|
|
||||||
|
ZeroMemory(&tvItem, sizeof(tvItem));
|
||||||
|
tvItem.hParent = hParent;
|
||||||
|
tvItem.hInsertAfter = TVI_LAST;
|
||||||
|
|
||||||
|
tvItem.item.mask = TVIF_STATE | TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
||||||
|
tvItem.item.state = TVIS_EXPANDED;
|
||||||
|
tvItem.item.stateMask = TVIS_EXPANDED;
|
||||||
|
tvItem.item.pszText = szDisplayName;
|
||||||
|
tvItem.item.iImage = nClassImage;
|
||||||
|
tvItem.item.iSelectedImage = nClassImage;
|
||||||
|
tvItem.item.lParam = (LPARAM)DevInst;
|
||||||
|
|
||||||
|
return TreeView_InsertItem(pHotplugData->hwndDeviceTree, &tvItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
DevTreeRecursiveInsertSubDevices(
|
||||||
|
_In_ HTREEITEM hParentItem,
|
||||||
|
_In_ DEVINST ParentDevInst,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
HTREEITEM hTreeItem;
|
||||||
|
DEVINST ChildDevInst;
|
||||||
|
CONFIGRET cr;
|
||||||
|
|
||||||
|
cr = CM_Get_Child(&ChildDevInst, ParentDevInst, 0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hTreeItem = InsertDeviceTreeItem(hParentItem,
|
||||||
|
ChildDevInst,
|
||||||
|
pHotplugData);
|
||||||
|
if (hTreeItem != NULL)
|
||||||
|
{
|
||||||
|
DevTreeRecursiveInsertSubDevices(hTreeItem,
|
||||||
|
ChildDevInst,
|
||||||
|
pHotplugData);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
cr = CM_Get_Sibling(&ChildDevInst, ChildDevInst, 0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hTreeItem = InsertDeviceTreeItem(hParentItem,
|
||||||
|
ChildDevInst,
|
||||||
|
pHotplugData);
|
||||||
|
if (hTreeItem != NULL)
|
||||||
|
{
|
||||||
|
DevTreeRecursiveInsertSubDevices(hTreeItem,
|
||||||
|
ChildDevInst,
|
||||||
|
pHotplugData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EnumHotpluggedDevices(
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
SP_DEVINFO_DATA did = { 0 };
|
||||||
|
HDEVINFO hdev;
|
||||||
|
int idev;
|
||||||
|
DWORD dwCapabilities, dwSize;
|
||||||
|
ULONG ulStatus, ulProblem;
|
||||||
|
HTREEITEM hTreeItem;
|
||||||
|
CONFIGRET cr;
|
||||||
|
|
||||||
|
TreeView_DeleteAllItems(pHotplugData->hwndDeviceTree);
|
||||||
|
|
||||||
|
hdev = SetupDiGetClassDevs(NULL, NULL, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);
|
||||||
|
if (hdev == INVALID_HANDLE_VALUE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
did.cbSize = sizeof(did);
|
||||||
|
|
||||||
|
/* Enumerate all the attached devices */
|
||||||
|
for (idev = 0; SetupDiEnumDeviceInfo(hdev, idev, &did); idev++)
|
||||||
|
{
|
||||||
|
ulStatus = 0;
|
||||||
|
ulProblem = 0;
|
||||||
|
|
||||||
|
cr = CM_Get_DevNode_Status(&ulStatus,
|
||||||
|
&ulProblem,
|
||||||
|
did.DevInst,
|
||||||
|
0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dwCapabilities = 0,
|
||||||
|
dwSize = sizeof(dwCapabilities);
|
||||||
|
cr = CM_Get_DevNode_Registry_Property(did.DevInst,
|
||||||
|
CM_DRP_CAPABILITIES,
|
||||||
|
NULL,
|
||||||
|
&dwCapabilities,
|
||||||
|
&dwSize,
|
||||||
|
0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Add devices that require safe removal to the device tree */
|
||||||
|
if ( (dwCapabilities & CM_DEVCAP_REMOVABLE) &&
|
||||||
|
!(dwCapabilities & CM_DEVCAP_DOCKDEVICE) &&
|
||||||
|
!(dwCapabilities & CM_DEVCAP_SURPRISEREMOVALOK) &&
|
||||||
|
((dwCapabilities & CM_DEVCAP_EJECTSUPPORTED) || (ulStatus & DN_DISABLEABLE)) &&
|
||||||
|
ulProblem == 0)
|
||||||
|
{
|
||||||
|
hTreeItem = InsertDeviceTreeItem(TVI_ROOT,
|
||||||
|
did.DevInst,
|
||||||
|
pHotplugData);
|
||||||
|
|
||||||
|
if ((hTreeItem != NULL) && (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS))
|
||||||
|
{
|
||||||
|
DevTreeRecursiveInsertSubDevices(hTreeItem,
|
||||||
|
did.DevInst,
|
||||||
|
pHotplugData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupDiDestroyDeviceInfoList(hdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
InsertConfirmDeviceListItem(
|
||||||
|
_In_ HWND hwndCfmDeviceList,
|
||||||
|
_In_ DEVINST DevInst,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
WCHAR szDisplayName[MAX_DEVICE_DISPLAYNAME_LEN];
|
||||||
|
INT nClassImage;
|
||||||
|
LVITEMW lvItem;
|
||||||
|
|
||||||
|
GetDeviceDisplayInfo(DevInst,
|
||||||
|
pHotplugData,
|
||||||
|
szDisplayName,
|
||||||
|
ARRAYSIZE(szDisplayName),
|
||||||
|
&nClassImage);
|
||||||
|
|
||||||
|
ZeroMemory(&lvItem, sizeof(lvItem));
|
||||||
|
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
|
||||||
|
lvItem.iItem = ListView_GetItemCount(hwndCfmDeviceList);
|
||||||
|
lvItem.pszText = szDisplayName;
|
||||||
|
lvItem.iImage = nClassImage;
|
||||||
|
lvItem.lParam = (LPARAM)DevInst;
|
||||||
|
|
||||||
|
ListView_InsertItem(hwndCfmDeviceList, &lvItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
CfmListRecursiveInsertSubDevices(
|
||||||
|
_In_ HWND hwndCfmDeviceList,
|
||||||
|
_In_ DEVINST ParentDevInst,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
DEVINST ChildDevInst;
|
||||||
|
CONFIGRET cr;
|
||||||
|
|
||||||
|
cr = CM_Get_Child(&ChildDevInst, ParentDevInst, 0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
InsertConfirmDeviceListItem(hwndCfmDeviceList, ChildDevInst, pHotplugData);
|
||||||
|
CfmListRecursiveInsertSubDevices(hwndCfmDeviceList, ChildDevInst, pHotplugData);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
cr = CM_Get_Sibling(&ChildDevInst, ChildDevInst, 0);
|
||||||
|
if (cr != CR_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
InsertConfirmDeviceListItem(hwndCfmDeviceList, ChildDevInst, pHotplugData);
|
||||||
|
CfmListRecursiveInsertSubDevices(hwndCfmDeviceList, ChildDevInst, pHotplugData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
CfmListEnumDevices(
|
||||||
|
_In_ HWND hwndCfmDeviceList,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
|
{
|
||||||
|
DEVINST DevInst;
|
||||||
|
|
||||||
|
DevInst = GetDeviceInstForRemoval(pHotplugData);
|
||||||
|
if (DevInst != 0)
|
||||||
|
{
|
||||||
|
InsertConfirmDeviceListItem(hwndCfmDeviceList, DevInst, pHotplugData);
|
||||||
|
CfmListRecursiveInsertSubDevices(hwndCfmDeviceList, DevInst, pHotplugData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -8,23 +8,9 @@
|
||||||
|
|
||||||
#include "hotplug.h"
|
#include "hotplug.h"
|
||||||
|
|
||||||
#include <initguid.h>
|
|
||||||
#include <devguid.h>
|
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct _HOTPLUG_DATA
|
|
||||||
{
|
|
||||||
HICON hIcon;
|
|
||||||
HICON hIconSm;
|
|
||||||
SP_CLASSIMAGELIST_DATA ImageListData;
|
|
||||||
HMENU hPopupMenu;
|
|
||||||
DWORD dwFlags;
|
|
||||||
} HOTPLUG_DATA, *PHOTPLUG_DATA;
|
|
||||||
|
|
||||||
|
|
||||||
// globals
|
// globals
|
||||||
HINSTANCE hApplet = 0;
|
HINSTANCE hApplet = 0;
|
||||||
|
|
||||||
|
@ -102,215 +88,22 @@ done:
|
||||||
return dwError;
|
return dwError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
HTREEITEM
|
|
||||||
InsertDeviceTreeItem(
|
|
||||||
_In_ HWND hwndDeviceTree,
|
|
||||||
_In_ HTREEITEM hParent,
|
|
||||||
_In_ DWORD DevInst,
|
|
||||||
_In_ PHOTPLUG_DATA pHotplugData)
|
|
||||||
{
|
|
||||||
WCHAR szDisplayName[40];
|
|
||||||
WCHAR szGuidString[MAX_GUID_STRING_LEN];
|
|
||||||
TVINSERTSTRUCTW tvItem;
|
|
||||||
GUID ClassGuid;
|
|
||||||
INT nClassImage;
|
|
||||||
DWORD dwSize;
|
|
||||||
CONFIGRET cr;
|
|
||||||
|
|
||||||
/* Get the device description */
|
|
||||||
dwSize = sizeof(szDisplayName);
|
|
||||||
cr = CM_Get_DevNode_Registry_Property(DevInst,
|
|
||||||
CM_DRP_DEVICEDESC,
|
|
||||||
NULL,
|
|
||||||
szDisplayName,
|
|
||||||
&dwSize,
|
|
||||||
0);
|
|
||||||
if (cr != CR_SUCCESS)
|
|
||||||
wcscpy(szDisplayName, L"Unknown Device");
|
|
||||||
|
|
||||||
/* Get the class GUID */
|
|
||||||
dwSize = sizeof(szGuidString);
|
|
||||||
cr = CM_Get_DevNode_Registry_Property(DevInst,
|
|
||||||
CM_DRP_CLASSGUID,
|
|
||||||
NULL,
|
|
||||||
szGuidString,
|
|
||||||
&dwSize,
|
|
||||||
0);
|
|
||||||
if (cr == CR_SUCCESS)
|
|
||||||
{
|
|
||||||
pSetupGuidFromString(szGuidString, &ClassGuid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(&ClassGuid, &GUID_DEVCLASS_UNKNOWN, sizeof(GUID));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the image for the class this device is in */
|
|
||||||
SetupDiGetClassImageIndex(&pHotplugData->ImageListData,
|
|
||||||
&ClassGuid,
|
|
||||||
&nClassImage);
|
|
||||||
|
|
||||||
/* Add it to the device tree */
|
|
||||||
ZeroMemory(&tvItem, sizeof(tvItem));
|
|
||||||
tvItem.hParent = hParent;
|
|
||||||
tvItem.hInsertAfter = TVI_LAST;
|
|
||||||
|
|
||||||
tvItem.item.mask = TVIF_STATE | TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
|
||||||
tvItem.item.state = TVIS_EXPANDED;
|
|
||||||
tvItem.item.stateMask = TVIS_EXPANDED;
|
|
||||||
tvItem.item.pszText = szDisplayName;
|
|
||||||
tvItem.item.iImage = nClassImage;
|
|
||||||
tvItem.item.iSelectedImage = nClassImage;
|
|
||||||
tvItem.item.lParam = (LPARAM)DevInst;
|
|
||||||
|
|
||||||
return TreeView_InsertItem(hwndDeviceTree, &tvItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
VOID
|
VOID
|
||||||
RecursiveInsertSubDevices(
|
UpdateDialog(
|
||||||
_In_ HWND hwndDeviceTree,
|
_In_ HWND hwndDlg)
|
||||||
_In_ HTREEITEM hParentItem,
|
|
||||||
_In_ DWORD ParentDevInst,
|
|
||||||
_In_ PHOTPLUG_DATA pHotplugData)
|
|
||||||
{
|
{
|
||||||
HTREEITEM hTreeItem;
|
HWND hwndDeviceTree;
|
||||||
DEVINST ChildDevInst;
|
BOOL bHasItem;
|
||||||
CONFIGRET cr;
|
|
||||||
|
|
||||||
DPRINT("RecursiveInsertSubDevices()\n");
|
hwndDeviceTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE);
|
||||||
|
|
||||||
cr = CM_Get_Child(&ChildDevInst, ParentDevInst, 0);
|
bHasItem = (TreeView_GetCount(hwndDeviceTree) != 0);
|
||||||
if (cr != CR_SUCCESS)
|
if (bHasItem)
|
||||||
{
|
TreeView_SelectItem(hwndDeviceTree, TreeView_GetFirstVisible(hwndDeviceTree));
|
||||||
DPRINT("No child! %lu\n", cr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hTreeItem = InsertDeviceTreeItem(hwndDeviceTree,
|
EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_PROPERTIES), bHasItem);
|
||||||
hParentItem,
|
EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_STOP), bHasItem);
|
||||||
ChildDevInst,
|
|
||||||
pHotplugData);
|
|
||||||
if (hTreeItem != NULL)
|
|
||||||
{
|
|
||||||
RecursiveInsertSubDevices(hwndDeviceTree,
|
|
||||||
hTreeItem,
|
|
||||||
ChildDevInst,
|
|
||||||
pHotplugData);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
cr = CM_Get_Sibling(&ChildDevInst, ChildDevInst, 0);
|
|
||||||
if (cr != CR_SUCCESS)
|
|
||||||
{
|
|
||||||
DPRINT("No sibling! %lu\n", cr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hTreeItem = InsertDeviceTreeItem(hwndDeviceTree,
|
|
||||||
hParentItem,
|
|
||||||
ChildDevInst,
|
|
||||||
pHotplugData);
|
|
||||||
if (hTreeItem != NULL)
|
|
||||||
{
|
|
||||||
RecursiveInsertSubDevices(hwndDeviceTree,
|
|
||||||
hTreeItem,
|
|
||||||
ChildDevInst,
|
|
||||||
pHotplugData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
VOID
|
|
||||||
EnumHotpluggedDevices(
|
|
||||||
HWND hwndDeviceTree,
|
|
||||||
PHOTPLUG_DATA pHotplugData)
|
|
||||||
{
|
|
||||||
SP_DEVINFO_DATA did = { 0 };
|
|
||||||
HDEVINFO hdev;
|
|
||||||
int idev;
|
|
||||||
DWORD dwCapabilities, dwSize;
|
|
||||||
ULONG ulStatus, ulProblem;
|
|
||||||
HTREEITEM hTreeItem;
|
|
||||||
CONFIGRET cr;
|
|
||||||
|
|
||||||
DPRINT1("EnumHotpluggedDevices()\n");
|
|
||||||
|
|
||||||
TreeView_DeleteAllItems(hwndDeviceTree);
|
|
||||||
|
|
||||||
hdev = SetupDiGetClassDevs(NULL, NULL, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);
|
|
||||||
if (hdev == INVALID_HANDLE_VALUE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
did.cbSize = sizeof(did);
|
|
||||||
|
|
||||||
/* Enumerate all the attached devices */
|
|
||||||
for (idev = 0; SetupDiEnumDeviceInfo(hdev, idev, &did); idev++)
|
|
||||||
{
|
|
||||||
ulStatus = 0;
|
|
||||||
ulProblem = 0;
|
|
||||||
|
|
||||||
cr = CM_Get_DevNode_Status(&ulStatus,
|
|
||||||
&ulProblem,
|
|
||||||
did.DevInst,
|
|
||||||
0);
|
|
||||||
if (cr != CR_SUCCESS)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
dwCapabilities = 0,
|
|
||||||
dwSize = sizeof(dwCapabilities);
|
|
||||||
cr = CM_Get_DevNode_Registry_Property(did.DevInst,
|
|
||||||
CM_DRP_CAPABILITIES,
|
|
||||||
NULL,
|
|
||||||
&dwCapabilities,
|
|
||||||
&dwSize,
|
|
||||||
0);
|
|
||||||
if (cr != CR_SUCCESS)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Add devices that require safe removal to the device tree */
|
|
||||||
if ( (dwCapabilities & CM_DEVCAP_REMOVABLE) &&
|
|
||||||
!(dwCapabilities & CM_DEVCAP_DOCKDEVICE) &&
|
|
||||||
!(dwCapabilities & CM_DEVCAP_SURPRISEREMOVALOK) &&
|
|
||||||
((dwCapabilities & CM_DEVCAP_EJECTSUPPORTED) || (ulStatus & DN_DISABLEABLE)) &&
|
|
||||||
ulProblem == 0)
|
|
||||||
{
|
|
||||||
hTreeItem = InsertDeviceTreeItem(hwndDeviceTree,
|
|
||||||
TVI_ROOT,
|
|
||||||
did.DevInst,
|
|
||||||
pHotplugData);
|
|
||||||
|
|
||||||
if ((hTreeItem != NULL) && (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS))
|
|
||||||
{
|
|
||||||
RecursiveInsertSubDevices(hwndDeviceTree,
|
|
||||||
hTreeItem,
|
|
||||||
did.DevInst,
|
|
||||||
pHotplugData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetupDiDestroyDeviceInfoList(hdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
VOID
|
|
||||||
UpdateButtons(
|
|
||||||
HWND hwndDlg)
|
|
||||||
{
|
|
||||||
BOOL bEnabled;
|
|
||||||
|
|
||||||
bEnabled = (TreeView_GetCount(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE)) != 0);
|
|
||||||
|
|
||||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_PROPERTIES), bEnabled);
|
|
||||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_STOP), bEnabled);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -347,12 +140,12 @@ ShowContextMenu(
|
||||||
static
|
static
|
||||||
DEVINST
|
DEVINST
|
||||||
GetSelectedDeviceInst(
|
GetSelectedDeviceInst(
|
||||||
_In_ HWND hwndDeviceTree)
|
_In_ PHOTPLUG_DATA pHotplugData)
|
||||||
{
|
{
|
||||||
HTREEITEM hTreeItem;
|
HTREEITEM hTreeItem;
|
||||||
TVITEMW item;
|
TVITEMW item;
|
||||||
|
|
||||||
hTreeItem = TreeView_GetSelection(hwndDeviceTree);
|
hTreeItem = TreeView_GetSelection(pHotplugData->hwndDeviceTree);
|
||||||
if (hTreeItem == NULL)
|
if (hTreeItem == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -360,7 +153,7 @@ GetSelectedDeviceInst(
|
||||||
item.mask = TVIF_PARAM;
|
item.mask = TVIF_PARAM;
|
||||||
item.hItem = hTreeItem;
|
item.hItem = hTreeItem;
|
||||||
|
|
||||||
TreeView_GetItem(hwndDeviceTree, &item);
|
TreeView_GetItem(pHotplugData->hwndDeviceTree, &item);
|
||||||
|
|
||||||
return item.lParam;
|
return item.lParam;
|
||||||
}
|
}
|
||||||
|
@ -456,19 +249,18 @@ SafeRemovalDlgProc(
|
||||||
SetupDiGetClassImageList(&pHotplugData->ImageListData);
|
SetupDiGetClassImageList(&pHotplugData->ImageListData);
|
||||||
|
|
||||||
pHotplugData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_DEVICE_TREE));
|
pHotplugData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_DEVICE_TREE));
|
||||||
|
pHotplugData->hwndDeviceTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE);
|
||||||
pHotplugData->dwFlags = GetHotPlugFlags();
|
pHotplugData->dwFlags = GetHotPlugFlags();
|
||||||
|
|
||||||
if (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS)
|
if (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS)
|
||||||
Button_SetCheck(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DISPLAY_COMPONENTS), BST_CHECKED);
|
Button_SetCheck(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DISPLAY_COMPONENTS), BST_CHECKED);
|
||||||
|
|
||||||
TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE),
|
TreeView_SetImageList(pHotplugData->hwndDeviceTree,
|
||||||
pHotplugData->ImageListData.ImageList,
|
pHotplugData->ImageListData.ImageList,
|
||||||
TVSIL_NORMAL);
|
TVSIL_NORMAL);
|
||||||
|
|
||||||
EnumHotpluggedDevices(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE),
|
EnumHotpluggedDevices(pHotplugData);
|
||||||
pHotplugData);
|
UpdateDialog(hwndDlg);
|
||||||
UpdateButtons(hwndDlg);
|
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -492,17 +284,29 @@ SafeRemovalDlgProc(
|
||||||
|
|
||||||
SetHotPlugFlags(pHotplugData->dwFlags);
|
SetHotPlugFlags(pHotplugData->dwFlags);
|
||||||
|
|
||||||
EnumHotpluggedDevices(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE),
|
EnumHotpluggedDevices(pHotplugData);
|
||||||
pHotplugData);
|
UpdateDialog(hwndDlg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_SAFE_REMOVE_PROPERTIES:
|
case IDC_SAFE_REMOVE_PROPERTIES:
|
||||||
case IDM_PROPERTIES:
|
case IDM_PROPERTIES:
|
||||||
|
ShowDeviceProperties(hwndDlg, GetSelectedDeviceInst(pHotplugData));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDC_SAFE_REMOVE_STOP:
|
||||||
|
case IDM_STOP:
|
||||||
{
|
{
|
||||||
HWND hwndDevTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE);
|
if (pHotplugData != NULL)
|
||||||
ShowDeviceProperties(hwndDlg, GetSelectedDeviceInst(hwndDevTree));
|
{
|
||||||
|
DialogBoxParamW(hApplet,
|
||||||
|
MAKEINTRESOURCEW(IDD_CONFIRM_STOP_HARDWARE_DIALOG),
|
||||||
|
hwndDlg,
|
||||||
|
ConfirmRemovalDlgProc,
|
||||||
|
(LPARAM)pHotplugData);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -524,9 +328,8 @@ SafeRemovalDlgProc(
|
||||||
|
|
||||||
if (pHotplugData != NULL)
|
if (pHotplugData != NULL)
|
||||||
{
|
{
|
||||||
EnumHotpluggedDevices(GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE),
|
EnumHotpluggedDevices(pHotplugData);
|
||||||
pHotplugData);
|
UpdateDialog(hwndDlg);
|
||||||
UpdateButtons(hwndDlg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -38,7 +38,38 @@ typedef struct
|
||||||
APPLET_PROC AppletProc;
|
APPLET_PROC AppletProc;
|
||||||
}APPLET, *PAPPLET;
|
}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
|
||||||
|
DEVINST
|
||||||
|
GetDeviceInstForRemoval(
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData);
|
||||||
|
|
||||||
|
INT_PTR
|
||||||
|
CALLBACK
|
||||||
|
ConfirmRemovalDlgProc(
|
||||||
|
_In_ HWND hwndDlg,
|
||||||
|
_In_ UINT uMsg,
|
||||||
|
_In_ WPARAM wParam,
|
||||||
|
_In_ LPARAM lParam);
|
||||||
|
|
||||||
|
// enum.c
|
||||||
|
VOID
|
||||||
|
EnumHotpluggedDevices(
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
CfmListEnumDevices(
|
||||||
|
_In_ HWND hwndCfmDeviceList,
|
||||||
|
_In_ PHOTPLUG_DATA pHotplugData);
|
||||||
|
|
||||||
// hotplug.c
|
// hotplug.c
|
||||||
LONG
|
LONG
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Schließen", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Schließen", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Hardware sicher entfernen"
|
IDS_CPLNAME "Hardware sicher entfernen"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Close", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Close", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Safely Remove Hardware"
|
IDS_CPLNAME "Safely Remove Hardware"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Cerrar", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Cerrar", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Retirar hardware con seguridad"
|
IDS_CPLNAME "Retirar hardware con seguridad"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -24,6 +24,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Fermer", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Fermer", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -43,4 +55,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Retirer un périphérique en toute sécurité"
|
IDS_CPLNAME "Retirer un périphérique en toute sécurité"
|
||||||
IDS_CPLDESCRIPTION "Déconnecter ou éjecter un périphérique de votre ordinateur en sécurité."
|
IDS_CPLDESCRIPTION "Déconnecter ou éjecter un périphérique de votre ordinateur en sécurité."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Tutup", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Tutup", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Hapus perangkat keras dengan aman"
|
IDS_CPLNAME "Hapus perangkat keras dengan aman"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "閉じる(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "閉じる(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "安全なハードウェアの取り外し"
|
IDS_CPLNAME "安全なハードウェアの取り外し"
|
||||||
IDS_CPLDESCRIPTION "コンピュータからデバイスを安全に取り外しできます。"
|
IDS_CPLDESCRIPTION "コンピュータからデバイスを安全に取り外しできます。"
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "Za&mknij", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "Za&mknij", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Bezpieczne usuwanie sprzętu"
|
IDS_CPLNAME "Bezpieczne usuwanie sprzętu"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Fechar", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Fechar", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Remover Hardware com segurança"
|
IDS_CPLNAME "Remover Hardware com segurança"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -24,6 +24,18 @@ BEGIN
|
||||||
PUSHBUTTON "Î&nchidere", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "Î&nchidere", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -43,4 +55,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Eliminare în siguranță a dispozitivul fizic"
|
IDS_CPLNAME "Eliminare în siguranță a dispozitivul fizic"
|
||||||
IDS_CPLDESCRIPTION "Deconectare sau scoatere în siguranță a dispozitivelor din calculator."
|
IDS_CPLDESCRIPTION "Deconectare sau scoatere în siguranță a dispozitivelor din calculator."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -17,6 +17,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Закрыть", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Закрыть", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -36,4 +48,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Безопасное извлечение устройств"
|
IDS_CPLNAME "Безопасное извлечение устройств"
|
||||||
IDS_CPLDESCRIPTION "Безопасно отключайте или извлекайте устройства из вашего компьютера."
|
IDS_CPLDESCRIPTION "Безопасно отключайте или извлекайте устройства из вашего компьютера."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -19,6 +19,18 @@ BEGIN
|
||||||
PUSHBUTTON "&Kapat", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "&Kapat", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -38,4 +50,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "Donanımı Güvenli Kaldır"
|
IDS_CPLNAME "Donanımı Güvenli Kaldır"
|
||||||
IDS_CPLDESCRIPTION "Aygıtları bilgisayarınızdan güvenle çıkarın veya çıkarın."
|
IDS_CPLDESCRIPTION "Aygıtları bilgisayarınızdan güvenle çıkarın veya çıkarın."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -24,6 +24,18 @@ BEGIN
|
||||||
PUSHBUTTON "关闭(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "关闭(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
IDM_POPUP_DEVICE_TREE MENU
|
IDM_POPUP_DEVICE_TREE MENU
|
||||||
BEGIN
|
BEGIN
|
||||||
POPUP ""
|
POPUP ""
|
||||||
|
@ -37,4 +49,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "安全地移除硬件"
|
IDS_CPLNAME "安全地移除硬件"
|
||||||
IDS_CPLDESCRIPTION "从您的计算机安全地拔出或弹出设备。"
|
IDS_CPLDESCRIPTION "从您的计算机安全地拔出或弹出设备。"
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -24,6 +24,18 @@ BEGIN
|
||||||
PUSHBUTTON "關閉(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "關閉(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -43,4 +55,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "安全地移除硬件"
|
IDS_CPLNAME "安全地移除硬件"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -24,6 +24,18 @@ BEGIN
|
||||||
PUSHBUTTON "關閉(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
PUSHBUTTON "關閉(&C)", IDCLOSE, 216, 224, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_CONFIRM_STOP_HARDWARE_DIALOG DIALOGEX 32, 10, 256, 148
|
||||||
|
CAPTION "Stop a Hardware Device"
|
||||||
|
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Confirm devices to be stopped, choose OK to continue.", IDC_STATIC, 7, 8, 241, 14, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
LTEXT "ReactOS will attempt to stop the following devices. After the devices are stopped they may be removed safely.", IDC_STATIC, 7, 22, 240, 18, WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
CONTROL "", IDC_CONFIRM_STOP_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 8, 45, 240, 78
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 144, 127, 50, 14
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 198, 127, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
/* Menus */
|
/* Menus */
|
||||||
|
|
||||||
|
@ -43,4 +55,6 @@ STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_CPLNAME "安全地移除硬體"
|
IDS_CPLNAME "安全地移除硬體"
|
||||||
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
IDS_CPLDESCRIPTION "Safely unplug or eject devices from your computer."
|
||||||
|
IDS_UNKNOWN_DEVICE "Unknown Device"
|
||||||
|
IDS_EJECT_ERROR_FORMAT "Failed to remove device (0x%x)\0"
|
||||||
END
|
END
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#define IDC_SAFE_REMOVE_DISPLAY_COMPONENTS 306
|
#define IDC_SAFE_REMOVE_DISPLAY_COMPONENTS 306
|
||||||
|
|
||||||
#define IDD_CONFIRM_STOP_HARDWARE_DIALOG 310
|
#define IDD_CONFIRM_STOP_HARDWARE_DIALOG 310
|
||||||
|
#define IDC_CONFIRM_STOP_DEVICE_LIST 311
|
||||||
|
|
||||||
/* Menu IDs */
|
/* Menu IDs */
|
||||||
#define IDM_POPUP_DEVICE_TREE 500
|
#define IDM_POPUP_DEVICE_TREE 500
|
||||||
|
@ -22,6 +23,7 @@
|
||||||
#define IDM_PROPERTIES 502
|
#define IDM_PROPERTIES 502
|
||||||
|
|
||||||
/* Resource strings IDs */
|
/* Resource strings IDs */
|
||||||
#define IDS_CPLNAME 1000
|
#define IDS_CPLNAME 1000
|
||||||
#define IDS_CPLDESCRIPTION 1001
|
#define IDS_CPLDESCRIPTION 1001
|
||||||
|
#define IDS_UNKNOWN_DEVICE 1002
|
||||||
|
#define IDS_EJECT_ERROR_FORMAT 1003
|
||||||
|
|
Loading…
Reference in a new issue