1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Windows/FileIO.h
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef __WINDOWS_FILEIO_H
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define __WINDOWS_FILEIO_H
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/Types.h"
7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Defs.h"
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
10baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NWindows {
11baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NFile {
12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NIO {
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstruct CByHandleFileInfo
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  DWORD Attrib;
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  FILETIME CTime;
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  FILETIME ATime;
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  FILETIME MTime;
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  DWORD VolumeSerialNumber;
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 Size;
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  DWORD NumberOfLinks;
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 FileIndex;
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CFileBase
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
28baa3858d3f5d128a5c8466b700098109edcad5f2repo syncprotected:
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HANDLE _handle;
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Create(LPCTSTR fileName, DWORD desiredAccess,
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifndef _UNICODE
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Create(LPCWSTR fileName, DWORD desiredAccess,
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
38baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic:
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifdef SUPPORT_DEVICE_FILE
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool IsDeviceFile;
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool LengthDefined;
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 Length;
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CFileBase(): _handle(INVALID_HANDLE_VALUE) {};
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  ~CFileBase();
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Close();
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool GetPosition(UInt64 &position) const;
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool GetLength(UInt64 &length) const;
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const;
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Seek(UInt64 position, UInt64 &newPosition);
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool SeekToBegin();
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool SeekToEnd(UInt64 &newPosition);
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool GetFileInformation(CByHandleFileInfo &fileInfo) const;
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define IOCTL_CDROM_BASE  FILE_DEVICE_CD_ROM
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define IOCTL_CDROM_GET_DRIVE_GEOMETRY  CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define IOCTL_CDROM_MEDIA_REMOVAL  CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
65baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CInFile: public CFileBase
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifdef SUPPORT_DEVICE_FILE
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize,
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped) const
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize,
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        outBuffer, outSize, bytesReturned, overlapped));
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer,
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      DWORD inSize, LPVOID outBuffer, DWORD outSize) const
77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    DWORD ret;
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return DeviceIoControl(controlCode, inBuffer, inSize, outBuffer, outSize, &ret, 0);
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    { return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize); }
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifndef UNDER_CE
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool GetGeometry(DISK_GEOMETRY *res) const
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool GetCdRomGeometry(DISK_GEOMETRY *res) const
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool GetPartitionInfo(PARTITION_INFORMATION *res)
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); }
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  void GetDeviceLength();
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
99baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic:
100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool OpenShared(LPCTSTR fileName, bool shareForWrite);
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCTSTR fileName);
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifndef _UNICODE
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool OpenShared(LPCWSTR fileName, bool shareForWrite);
106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCWSTR fileName);
107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Read1(void *data, UInt32 size, UInt32 &processedSize);
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool ReadPart(void *data, UInt32 size, UInt32 &processedSize);
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Read(void *data, UInt32 size, UInt32 &processedSize);
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
113baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass COutFile: public CFileBase
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
115baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic:
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCTSTR fileName, DWORD creationDisposition);
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Create(LPCTSTR fileName, bool createAlways);
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifndef _UNICODE
121baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Open(LPCWSTR fileName, DWORD creationDisposition);
123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Create(LPCWSTR fileName, bool createAlways);
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime);
127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool SetMTime(const FILETIME *mTime);
128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool WritePart(const void *data, UInt32 size, UInt32 &processedSize);
129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool Write(const void *data, UInt32 size, UInt32 &processedSize);
130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool SetEndOfFile();
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool SetLength(UInt64 length);
132baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}}}
135baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
136baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
137