Skip to content

Commit

Permalink
Update eject routine (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
malensek committed Oct 6, 2015
1 parent 9bee69f commit 627290c
Showing 1 changed file with 24 additions and 8 deletions.
32 changes: 24 additions & 8 deletions 3RVX/OSD/EjectOSD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,38 @@ void EjectOSD::EjectDrive(std::wstring driveLetter) {
std::wstring name = L"\\\\.\\" + driveLetter + L":";
CLOG(L"Ejecting %s", name.c_str());

HANDLE dev = CreateFile(name.c_str(),
GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
HANDLE dev = CreateFile(
name.c_str(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL);

if (dev == INVALID_HANDLE_VALUE) {
CLOG(L"Failed to get device handle");
return;
}

DWORD bytesReturned = 0;
bool success = DeviceIoControl(dev, FSCTL_LOCK_VOLUME,
NULL, NULL, NULL, NULL, &bytesReturned, NULL)
&& DeviceIoControl(dev, FSCTL_DISMOUNT_VOLUME,
NULL, NULL, NULL, NULL, &bytesReturned, NULL)
&& DeviceIoControl(dev, IOCTL_STORAGE_EJECT_MEDIA,

DeviceIoControl(dev, FSCTL_LOCK_VOLUME,
NULL, NULL, NULL, NULL, &bytesReturned, NULL);

PREVENT_MEDIA_REMOVAL pmr = { 0 };
pmr.PreventMediaRemoval = FALSE;
DeviceIoControl(dev, IOCTL_STORAGE_MEDIA_REMOVAL,
&pmr, sizeof(PREVENT_MEDIA_REMOVAL), NULL, 0, &bytesReturned, NULL);

DeviceIoControl(dev, FSCTL_DISMOUNT_VOLUME,
NULL, NULL, NULL, NULL, &bytesReturned, NULL);

BOOL ejected = FALSE;
ejected = DeviceIoControl(dev, IOCTL_STORAGE_EJECT_MEDIA,
NULL, NULL, NULL, NULL, &bytesReturned, NULL);

if (success) {
if (ejected != FALSE) {
std::wstring rootPath = driveLetter + L":\\";
if (GetDriveType(rootPath.c_str()) != DRIVE_CDROM) {
int driveBit = (int) pow(2, (driveLetter.at(0) - 65));
Expand Down

0 comments on commit 627290c

Please sign in to comment.