From f04f164e8ccfac5b0b5e1e34e340de8f6f2c0bdf Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Fri, 3 Nov 2017 20:54:39 +0900 Subject: [PATCH] eject trial --- dll/win32/shell32/folders/CDrivesFolder.cpp | 37 +++++++++++++++++++++++++---- dll/win32/shell32/lang/en-US.rc | 1 + dll/win32/shell32/shresdef.h | 2 ++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/dll/win32/shell32/folders/CDrivesFolder.cpp b/dll/win32/shell32/folders/CDrivesFolder.cpp index 7a088248c9..b503da7703 100644 --- a/dll/win32/shell32/folders/CDrivesFolder.cpp +++ b/dll/win32/shell32/folders/CDrivesFolder.cpp @@ -4,6 +4,7 @@ * Copyright 1997 Marcus Meissner * Copyright 1998, 1999, 2002 Juergen Schmied * Copyright 2009 Andrew Hill + * Copyright 2017 Katayama Hirofumi MZ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -70,6 +71,7 @@ HRESULT CALLBACK DrivesContextMenuCallback(IShellFolder *psf, PIDLIST_ABSOLUTE pidlFolder; PUITEMID_CHILD *apidl; UINT cidl; + UINT nDriveType; HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl); if (FAILED_UNEXPECTEDLY(hr)) return hr; @@ -82,6 +84,7 @@ HRESULT CALLBACK DrivesContextMenuCallback(IShellFolder *psf, _ILFreeaPidl(apidl, cidl); return E_FAIL; } + nDriveType = GetDriveTypeA(szDrive); if (uMsg == DFM_MERGECONTEXTMENU) { @@ -91,26 +94,50 @@ HRESULT CALLBACK DrivesContextMenuCallback(IShellFolder *psf, if (GetVolumeInformationA(szDrive, NULL, 0, NULL, NULL, &dwFlags, NULL, 0)) { /* Disable format if read only */ - if (!(dwFlags & FILE_READ_ONLY_VOLUME) && GetDriveTypeA(szDrive) != DRIVE_REMOTE) + if (!(dwFlags & FILE_READ_ONLY_VOLUME) && nDriveType != DRIVE_REMOTE) { _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, pqcminfo->idCmdFirst++, MFT_STRING, MAKEINTRESOURCEW(IDS_FORMATDRIVE), MFS_ENABLED); } + if (nDriveType == DRIVE_CDROM || nDriveType == DRIVE_REMOTE) + { + _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); + _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, pqcminfo->idCmdFirst++, MFT_STRING, MAKEINTRESOURCEW(IDS_EJECT), MFS_ENABLED); + } } } else if (uMsg == DFM_INVOKECOMMAND) { + WCHAR wszBuf[4]; + wcscpy(wszBuf, L"A:\\"); + wszBuf[0] = (WCHAR)szDrive[0]; + if (wParam == DFM_CMD_PROPERTIES) { - WCHAR wszBuf[4]; - wcscpy(wszBuf, L"A:\\"); - wszBuf[0] = (WCHAR)szDrive[0]; if (!SH_ShowDriveProperties(wszBuf, pidlFolder, apidl)) hr = E_FAIL; } else { - SHFormatDrive(hwnd, szDrive[0] - 'A', SHFMT_ID_DEFAULT, 0); + if (nDriveType == DRIVE_CDROM || nDriveType == DRIVE_REMOTE) + { + WCHAR physical[10]; + wsprintfW(physical, _T("\\\\.\\%c:"), szDrive[0]); + HANDLE hDrive = CreateFile(physical, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); + if (hDrive != INVALID_HANDLE_VALUE) + { + DeviceIoControl(hDrive, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, NULL, NULL); + DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, NULL, NULL); + DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, NULL, NULL); + CloseHandle(hDrive); + + SHChangeNotify(SHCNE_DRIVEREMOVED, SHCNF_PATH, wszBuf, NULL); + } + } + else + { + SHFormatDrive(hwnd, szDrive[0] - 'A', SHFMT_ID_DEFAULT, 0); + } } } diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index 4bbc8ac521..9e9c2569c2 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -684,6 +684,7 @@ BEGIN IDS_FORMATDRIVE "Format..." IDS_RENAME "Rename" IDS_PASTE "Paste" + IDS_EJECT "Eject" IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'" IDS_CREATEFOLDER_CAPTION "Unable to create folder" diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index 417759e82e..d8c3ac467d 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -206,6 +206,8 @@ #define IDS_FILEOOP_FROM 337 #define IDS_FILEOOP_PREFLIGHT 338 +#define IDS_EJECT 339 + #define IDS_MENU_EMPTY 34561 /* Note: those strings are referenced from the registry */ -- 2.14.2