More small cluster size fixes
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
1 /* $Id: vfat.h,v 1.23 2001/01/14 15:05:53 dwelch Exp $ */
2
3 #include <ddk/ntifs.h>
4
5 struct _BootSector {
6 unsigned char magic0, res0, magic1;
7 unsigned char OEMName[8];
8 unsigned short BytesPerSector;
9 unsigned char SectorsPerCluster;
10 unsigned short ReservedSectors;
11 unsigned char FATCount;
12 unsigned short RootEntries, Sectors;
13 unsigned char Media;
14 unsigned short FATSectors, SectorsPerTrack, Heads;
15 unsigned long HiddenSectors, SectorsHuge;
16 unsigned char Drive, Res1, Sig;
17 unsigned long VolumeID;
18 unsigned char VolumeLabel[11], SysType[8];
19 unsigned char Res2[450];
20 } __attribute__((packed));
21
22 struct _BootSector32 {
23 unsigned char magic0, res0, magic1;
24 unsigned char OEMName[8];
25 unsigned short BytesPerSector;
26 unsigned char SectorsPerCluster;
27 unsigned short ReservedSectors;
28 unsigned char FATCount;
29 unsigned short RootEntries, Sectors;
30 unsigned char Media;
31 unsigned short FATSectors, SectorsPerTrack, Heads;
32 unsigned long HiddenSectors, SectorsHuge;
33 unsigned long FATSectors32;
34 unsigned char x[27];
35 unsigned long VolumeID;
36 unsigned char VolumeLabel[11], SysType[8];
37 unsigned char Res2[422];
38 } __attribute__((packed));
39
40 typedef struct _BootSector BootSector;
41
42 struct _FATDirEntry {
43 unsigned char Filename[8], Ext[3], Attrib, Res[2];
44 unsigned short CreationTime,CreationDate,AccessDate;
45 unsigned short FirstClusterHigh;// higher
46 unsigned short UpdateTime;//time create/update
47 unsigned short UpdateDate;//date create/update
48 unsigned short FirstCluster;
49 unsigned long FileSize;
50 } __attribute__((packed));
51
52 typedef struct _FATDirEntry FATDirEntry;
53
54 struct _slot
55 {
56 unsigned char id; // sequence number for slot
57 WCHAR name0_4[5]; // first 5 characters in name
58 unsigned char attr; // attribute byte
59 unsigned char reserved; // always 0
60 unsigned char alias_checksum; // checksum for 8.3 alias
61 WCHAR name5_10[6]; // 6 more characters in name
62 unsigned char start[2]; // starting cluster number
63 WCHAR name11_12[2]; // last 2 characters in name
64 } __attribute__((packed));
65
66
67 typedef struct _slot slot;
68
69 #define BLOCKSIZE 512
70
71 #define FAT16 (1)
72 #define FAT12 (2)
73 #define FAT32 (3)
74
75 typedef struct
76 {
77 ERESOURCE DirResource;
78 ERESOURCE FatResource;
79
80 KSPIN_LOCK FcbListLock;
81 LIST_ENTRY FcbListHead;
82
83 PDEVICE_OBJECT StorageDevice;
84 PFILE_OBJECT StreamStorageDevice;
85 PBCB StorageBcb;
86 BootSector *Boot;
87 int rootDirectorySectors, FATStart, rootStart, dataStart;
88 int FATEntriesPerSector, FATUnit;
89 ULONG BytesPerCluster;
90 ULONG FatType;
91 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
92
93 typedef struct _VFATFCB
94 {
95 REACTOS_COMMON_FCB_HEADER RFCB;
96 FATDirEntry entry;
97 /* point on filename (250 chars max) in PathName */
98 WCHAR *ObjectName;
99 /* path+filename 260 max */
100 WCHAR PathName[MAX_PATH];
101 LONG RefCount;
102 PDEVICE_EXTENSION pDevExt;
103 LIST_ENTRY FcbListEntry;
104 struct _VFATFCB* parentFcb;
105 } VFATFCB, *PVFATFCB;
106
107 typedef struct _VFATCCB
108 {
109 VFATFCB * pFcb;
110 LIST_ENTRY NextCCB;
111 PFILE_OBJECT PtrFileObject;
112 LARGE_INTEGER CurrentByteOffset;
113 /* for DirectoryControl */
114 ULONG StartSector;
115 /* for DirectoryControl */
116 ULONG StartEntry;
117 // PSTRING DirectorySearchPattern;// for DirectoryControl ?
118 } VFATCCB, *PVFATCCB;
119
120
121 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
122
123 typedef struct __DOSTIME
124 {
125 WORD Second:5;
126 WORD Minute:6;
127 WORD Hour:5;
128 } DOSTIME, *PDOSTIME;
129
130 typedef struct __DOSDATE
131 {
132 WORD Day:5;
133 WORD Month:4;
134 WORD Year:5;
135 } DOSDATE, *PDOSDATE;
136
137 /* functions called by i/o manager : */
138 NTSTATUS STDCALL
139 DriverEntry(PDRIVER_OBJECT _DriverObject,PUNICODE_STRING RegistryPath);
140 NTSTATUS STDCALL
141 VfatDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
142 NTSTATUS STDCALL
143 VfatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
144 NTSTATUS STDCALL
145 VfatWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
146 NTSTATUS STDCALL
147 VfatCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
148 NTSTATUS STDCALL
149 VfatClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
150 NTSTATUS STDCALL
151 VfatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
152 NTSTATUS STDCALL
153 VfatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
154
155
156 /* internal functions in blockdev.c */
157 NTSTATUS
158 VfatReadSectors(IN PDEVICE_OBJECT pDeviceObject,
159 IN ULONG DiskSector,
160 IN ULONG SectorCount,
161 IN UCHAR* Buffer);
162
163 NTSTATUS
164 VfatWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
165 IN ULONG DiskSector,
166 IN ULONG SectorCount,
167 IN UCHAR* Buffer);
168
169 /* internal functions in dir.c : */
170 BOOL FsdDosDateTimeToFileTime(WORD wDosDate,WORD wDosTime, TIME *FileTime);
171 BOOL FsdFileTimeToDosDateTime(TIME *FileTime,WORD *pwDosDate,WORD *pwDosTime);
172
173 /* internal functions in iface.c : */
174 NTSTATUS
175 FindFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb,
176 PVFATFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
177 NTSTATUS
178 VfatCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject);
179 NTSTATUS
180 VfatGetStandardInformation(PVFATFCB FCB, PDEVICE_OBJECT DeviceObject,
181 PFILE_STANDARD_INFORMATION StandardInfo);
182 NTSTATUS
183 VfatOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
184 PWSTR FileName);
185 NTSTATUS
186 VfatReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
187 PVOID Buffer, ULONG Length, ULONG ReadOffset,
188 PULONG LengthRead, ULONG NoCache);
189 NTSTATUS
190 VfatWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
191 PVOID Buffer, ULONG Length, ULONG WriteOffset);
192 NTSTATUS
193 GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster,
194 PULONG NextCluster);
195 BOOLEAN
196 IsDeletedEntry(PVOID Block, ULONG Offset);
197 BOOLEAN
198 IsLastEntry(PVOID Block, ULONG Offset);
199 wchar_t*
200 vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
201 NTSTATUS
202 VfatWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster);
203
204 /* internal functions in dirwr.c */
205 NTSTATUS
206 addEntry(PDEVICE_EXTENSION DeviceExt,
207 PFILE_OBJECT pFileObject,ULONG RequestedOptions,UCHAR ReqAttr);
208 NTSTATUS
209 updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject);
210
211 /*
212 * String functions
213 */
214 VOID
215 RtlAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length);
216 VOID
217 RtlCatAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length);
218 VOID
219 vfat_initstr(wchar_t *wstr, ULONG wsize);
220 wchar_t*
221 vfat_wcsncat(wchar_t * dest, const wchar_t * src,size_t wstart, size_t wcount);
222 wchar_t*
223 vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
224 wchar_t*
225 vfat_movstr(wchar_t *src, ULONG dpos, ULONG spos, ULONG len);
226 BOOLEAN
227 wstrcmpi(PWSTR s1, PWSTR s2);
228 BOOLEAN
229 wstrcmpjoki(PWSTR s1, PWSTR s2);
230
231 /*
232 * functions from fat.c
233 */
234 ULONG
235 ClusterToSector(PDEVICE_EXTENSION DeviceExt, ULONG Cluster);
236 NTSTATUS
237 GetNextCluster(PDEVICE_EXTENSION DeviceExt,
238 ULONG CurrentCluster,
239 PULONG NextCluster);
240 NTSTATUS
241 VfatRawReadCluster (PDEVICE_EXTENSION DeviceExt,
242 ULONG FirstCluster,
243 PVOID Buffer,
244 ULONG Cluster);
245 ULONG
246 FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
247 ULONG
248 FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
249 ULONG
250 FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
251 NTSTATUS
252 WriteCluster (PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
253 ULONG NewValue);
254
255 /*
256 * functions from volume.c
257 */
258 NTSTATUS STDCALL
259 VfatQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
260
261 /*
262 * functions from finfo.c
263 */
264 NTSTATUS STDCALL
265 VfatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
266
267 /*
268 * From create.c
269 */
270 NTSTATUS
271 ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt, PVPB Vpb);
272
273 /*
274 * functions from shutdown.c
275 */
276 NTSTATUS STDCALL VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp);
277