mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-14 12:11:39 -06:00
4.44 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
804edc5756
commit
d9666cf046
123
CPP/Windows/FileDevice.h
Executable file
123
CPP/Windows/FileDevice.h
Executable file
@@ -0,0 +1,123 @@
|
||||
// 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 = (BOOLEAN)(lock ? TRUE : FALSE);
|
||||
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;
|
||||
// Check params, Probabably error
|
||||
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
|
||||
Reference in New Issue
Block a user