114 lines
3 KiB
C++
114 lines
3 KiB
C++
#include "dfeject.h"
|
|
|
|
#include <stdio.h>
|
|
#include <winioctl.h>
|
|
|
|
#include "drvfull.h"
|
|
#include "dfioctl.h"
|
|
#include "dferr.h"
|
|
|
|
#include "dfhlprs.h"
|
|
|
|
HRESULT _IOCTLEject(DWORD dwFlags[], LPTSTR pszArg, DWORD cchIndent)
|
|
{
|
|
HRESULT hres = S_OK;
|
|
HANDLE hDevice;
|
|
DWORD dwDesiredAccess;
|
|
|
|
_StartClock();
|
|
|
|
switch(GetDriveType(pszArg + 4))
|
|
{
|
|
case DRIVE_REMOVABLE:
|
|
dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
|
|
break;
|
|
|
|
case DRIVE_CDROM:
|
|
dwDesiredAccess = GENERIC_READ;
|
|
break;
|
|
|
|
default:
|
|
hres = E_INVALIDARG;
|
|
}
|
|
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
DWORD dwDummy;
|
|
BOOL b;
|
|
|
|
hDevice = _GetDeviceHandle(pszArg, dwDesiredAccess);
|
|
|
|
if (INVALID_HANDLE_VALUE != hDevice)
|
|
{
|
|
// Lock the volume
|
|
b = DeviceIoControl(hDevice,
|
|
FSCTL_LOCK_VOLUME,
|
|
NULL, 0,
|
|
NULL, 0,
|
|
&dwDummy,
|
|
NULL);
|
|
|
|
if (b)
|
|
{
|
|
// Dismount the volume
|
|
b = DeviceIoControl(hDevice,
|
|
FSCTL_DISMOUNT_VOLUME,
|
|
NULL, 0,
|
|
NULL, 0,
|
|
&dwDummy,
|
|
NULL);
|
|
|
|
if (b)
|
|
{
|
|
b = DeviceIoControl(hDevice,
|
|
IOCTL_STORAGE_EJECT_MEDIA, // dwIoControlCode operation to perform
|
|
NULL, // lpInBuffer; must be NULL
|
|
0, // nInBufferSize; must be zero
|
|
NULL, // pointer to output buffer
|
|
0, // size of output buffer
|
|
&dwDummy, // receives number of bytes returned
|
|
NULL);
|
|
|
|
_StopClock();
|
|
|
|
_PrintIndent(cchIndent);
|
|
if (b)
|
|
{
|
|
wprintf(TEXT("Device ejected\n"));
|
|
hres = S_OK;
|
|
}
|
|
else
|
|
{
|
|
wprintf(TEXT("Cannot lock device\n"));
|
|
hres = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_PrintIndent(cchIndent);
|
|
wprintf(TEXT("Cannot lock device\n"));
|
|
hres = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_PrintIndent(cchIndent);
|
|
wprintf(TEXT("Cannot lock device\n"));
|
|
hres = E_FAIL;
|
|
}
|
|
|
|
CloseHandle(hDevice);
|
|
}
|
|
else
|
|
{
|
|
_PrintIndent(cchIndent);
|
|
wprintf(TEXT("Cannot open device\n"));
|
|
_PrintGetLastError(cchIndent);
|
|
hres = E_DF_CANNOTOPENDEVICE;
|
|
}
|
|
}
|
|
|
|
return hres;
|
|
}
|
|
|