mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 15:14:59 -06:00
120 lines
4.0 KiB
C++
Executable File
120 lines
4.0 KiB
C++
Executable File
// Windows/FileDevice.h
|
|
|
|
#ifndef __WINDOWS_FILEDEVICE_H
|
|
#define __WINDOWS_FILEDEVICE_H
|
|
|
|
#include "FileIO.h"
|
|
#include "Defs.h"
|
|
|
|
namespace NWindows {
|
|
namespace NFile {
|
|
namespace NDevice {
|
|
|
|
typedef struct _GET_LENGTH_INFORMATION
|
|
{
|
|
LARGE_INTEGER Length;
|
|
} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
|
|
|
|
#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
|
|
|
|
/*
|
|
typedef struct _DISK_GEOMETRY_EX {
|
|
DISK_GEOMETRY Geometry; // Standard disk geometry: may be faked by driver.
|
|
LARGE_INTEGER DiskSize; // Must always be correct
|
|
BYTE Data[1]; // Partition, Detect info
|
|
} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
|
|
*/
|
|
|
|
#define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
|
|
#define IOCTL_CDROM_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
|
|
#define IOCTL_CDROM_MEDIA_REMOVAL CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
|
|
|
|
class CFileBase: public NIO::CFileBase
|
|
{
|
|
public:
|
|
bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize,
|
|
LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped) const
|
|
{
|
|
return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize,
|
|
outBuffer, outSize, bytesReturned, overlapped));
|
|
}
|
|
|
|
bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer,
|
|
DWORD inSize, LPVOID outBuffer, DWORD outSize) const
|
|
{
|
|
DWORD ret;
|
|
return DeviceIoControl(controlCode, inBuffer, inSize, outBuffer, outSize, &ret, 0);
|
|
}
|
|
|
|
bool DeviceIoControlIn(DWORD controlCode, LPVOID inBuffer, DWORD inSize) const
|
|
{ return DeviceIoControl(controlCode, inBuffer, inSize, NULL, 0); }
|
|
|
|
bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const
|
|
{ return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize); }
|
|
|
|
bool GetGeometry(DISK_GEOMETRY *res) const
|
|
{ return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
|
|
|
|
bool GetCdRomGeometry(DISK_GEOMETRY *res) const
|
|
{ return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
|
|
|
|
/*
|
|
bool GetCdRomGeometryEx(DISK_GEOMETRY_EX *res) const
|
|
{ return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
|
|
*/
|
|
|
|
bool CdRomLock(bool lock) const
|
|
{
|
|
PREVENT_MEDIA_REMOVAL rem;
|
|
rem.PreventMediaRemoval = BoolToBOOL(lock);
|
|
return DeviceIoControlIn(IOCTL_CDROM_MEDIA_REMOVAL, &rem, sizeof(rem));
|
|
}
|
|
|
|
bool GetLengthInfo(UInt64 &length) const
|
|
{
|
|
GET_LENGTH_INFORMATION lengthInfo;
|
|
bool res = DeviceIoControlOut(IOCTL_DISK_GET_LENGTH_INFO, &lengthInfo, sizeof(lengthInfo));
|
|
length = lengthInfo.Length.QuadPart;
|
|
return res;
|
|
}
|
|
|
|
bool GetLengthSmart(UInt64 &length);
|
|
|
|
|
|
bool FormatTracks(const FORMAT_PARAMETERS *formatParams,
|
|
BAD_TRACK_NUMBER *badTrackNumbers, DWORD numBadTrackNumbers,
|
|
DWORD &numBadTrackNumbersReturned)
|
|
{
|
|
DWORD ret;
|
|
bool res = DeviceIoControl(IOCTL_DISK_FORMAT_TRACKS, badTrackNumbers, sizeof(*formatParams),
|
|
badTrackNumbers, numBadTrackNumbers * sizeof(*badTrackNumbers), &ret, NULL);
|
|
numBadTrackNumbersReturned = ret / sizeof(*badTrackNumbers);
|
|
return res;
|
|
}
|
|
|
|
bool Performance(DISK_PERFORMANCE *res)
|
|
{ return DeviceIoControlOut(IOCTL_DISK_PERFORMANCE, LPVOID(res), sizeof(*res)); }
|
|
|
|
bool GetPartitionInfo(PARTITION_INFORMATION *res)
|
|
{ return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); }
|
|
|
|
bool Verify(const VERIFY_INFORMATION *verifyInformation)
|
|
{ return DeviceIoControlIn(IOCTL_DISK_VERIFY, LPVOID(verifyInformation), sizeof(*verifyInformation)); }
|
|
};
|
|
|
|
class CInFile: public CFileBase
|
|
{
|
|
public:
|
|
bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
|
|
bool Open(LPCTSTR fileName);
|
|
#ifndef _UNICODE
|
|
bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
|
|
bool Open(LPCWSTR fileName);
|
|
#endif
|
|
bool Read(void *data, UInt32 size, UInt32 &processedSize);
|
|
};
|
|
|
|
}}}
|
|
|
|
#endif
|