Use free Windows DDK and compile with latest MinGW releases.
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
1 /* $Id: vfat.h,v 1.46 2002/09/07 15:12:03 chorns Exp $ */
2
3 #define NTOS_KERNEL_MODE
4 #include <ntos.h>
5
6 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
7 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
8
9 struct _BootSector
10 {
11 unsigned char magic0, res0, magic1;
12 unsigned char OEMName[8];
13 unsigned short BytesPerSector;
14 unsigned char SectorsPerCluster;
15 unsigned short ReservedSectors;
16 unsigned char FATCount;
17 unsigned short RootEntries, Sectors;
18 unsigned char Media;
19 unsigned short FATSectors, SectorsPerTrack, Heads;
20 unsigned long HiddenSectors, SectorsHuge;
21 unsigned char Drive, Res1, Sig;
22 unsigned long VolumeID;
23 unsigned char VolumeLabel[11], SysType[8];
24 unsigned char Res2[446];
25 unsigned long Signatur1;
26 } __attribute__((packed));
27
28 struct _BootSector32
29 {
30 unsigned char magic0, res0, magic1; // 0
31 unsigned char OEMName[8]; // 3
32 unsigned short BytesPerSector; // 11
33 unsigned char SectorsPerCluster; // 13
34 unsigned short ReservedSectors; // 14
35 unsigned char FATCount; // 16
36 unsigned short RootEntries, Sectors; // 17
37 unsigned char Media; // 21
38 unsigned short FATSectors, SectorsPerTrack, Heads; // 22
39 unsigned long HiddenSectors, SectorsHuge; // 28
40 unsigned long FATSectors32; // 36
41 unsigned short ExtFlag; // 40
42 unsigned short FSVersion; // 42
43 unsigned long RootCluster; // 44
44 unsigned short FSInfoSector; // 48
45 unsigned long BootBackup; // 50
46 unsigned char Res3[10]; // 54
47 unsigned char Drive; // 64
48 unsigned char Res4; // 65
49 unsigned char ExtBootSignature; // 66
50 unsigned long VolumeID; // 67
51 unsigned char VolumeLabel[11], SysType[8]; // 71
52 unsigned char Res2[418]; // 90
53 unsigned long Signature1; // 508
54 } __attribute__((packed));
55
56 struct _BootBackupSector
57 {
58 unsigned long ExtBootSignature2; // 0
59 unsigned char Res6[480]; // 4
60 unsigned long FSINFOSignature; // 484
61 unsigned long FreeCluster; // 488
62 unsigned long NextCluster; // 492
63 unsigned char Res7[12]; // 496
64 unsigned long Signatur2; // 508
65 } __attribute__((packed));
66
67 typedef struct _BootSector BootSector;
68
69 struct _FATDirEntry
70 {
71 unsigned char Filename[8], Ext[3], Attrib, Res[2];
72 unsigned short CreationTime,CreationDate,AccessDate;
73 unsigned short FirstClusterHigh; // higher
74 unsigned short UpdateTime; //time create/update
75 unsigned short UpdateDate; //date create/update
76 unsigned short FirstCluster;
77 unsigned long FileSize;
78 } __attribute__((packed));
79
80 typedef struct _FATDirEntry FATDirEntry, FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
81
82 struct _slot
83 {
84 unsigned char id; // sequence number for slot
85 WCHAR name0_4[5]; // first 5 characters in name
86 unsigned char attr; // attribute byte
87 unsigned char reserved; // always 0
88 unsigned char alias_checksum; // checksum for 8.3 alias
89 WCHAR name5_10[6]; // 6 more characters in name
90 unsigned char start[2]; // starting cluster number
91 WCHAR name11_12[2]; // last 2 characters in name
92 } __attribute__((packed));
93
94
95 typedef struct _slot slot;
96
97 #define BLOCKSIZE 512
98
99 #define FAT16 (1)
100 #define FAT12 (2)
101 #define FAT32 (3)
102
103 #define VCB_VOLUME_LOCKED 0x0001
104 #define VCB_DISMOUNT_PENDING 0x0002
105
106 typedef struct
107 {
108 ULONG VolumeID;
109 ULONG FATStart;
110 ULONG FATCount;
111 ULONG FATSectors;
112 ULONG rootDirectorySectors;
113 ULONG rootStart;
114 ULONG dataStart;
115 ULONG RootCluster;
116 ULONG SectorsPerCluster;
117 ULONG BytesPerSector;
118 ULONG BytesPerCluster;
119 ULONG NumberOfClusters;
120 ULONG FatType;
121 ULONG Sectors;
122 } FATINFO, *PFATINFO;
123
124 struct _VFATFCB;
125
126 typedef struct
127 {
128 ERESOURCE DirResource;
129 ERESOURCE FatResource;
130
131 KSPIN_LOCK FcbListLock;
132 LIST_ENTRY FcbListHead;
133
134 PDEVICE_OBJECT StorageDevice;
135 PFILE_OBJECT FATFileObject;
136 FATINFO FatInfo;
137 ULONG LastAvailableCluster;
138 ULONG AvailableClusters;
139 BOOLEAN AvailableClustersValid;
140 ULONG Flags;
141 struct _VFATFCB * VolumeFcb;
142 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
143
144 typedef struct
145 {
146 PDRIVER_OBJECT DriverObject;
147 PDEVICE_OBJECT DeviceObject;
148 ULONG Flags;
149 } VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
150
151 extern PVFAT_GLOBAL_DATA VfatGlobalData;
152
153 #define FCB_CACHE_INITIALIZED 0x0001
154 #define FCB_DELETE_PENDING 0x0002
155 #define FCB_IS_FAT 0x0004
156 #define FCB_IS_PAGE_FILE 0x0008
157 #define FCB_IS_VOLUME 0x0010
158 #define FCB_UPDATE_DIRENTRY 0x0020
159
160 typedef struct _VFATFCB
161 {
162 REACTOS_COMMON_FCB_HEADER RFCB;
163 SECTION_OBJECT_POINTERS SectionObjectPointers;
164 FATDirEntry entry;
165 /* point on filename (250 chars max) in PathName */
166 WCHAR *ObjectName;
167 /* path+filename 260 max */
168 WCHAR PathName[MAX_PATH];
169 LONG RefCount;
170 PDEVICE_EXTENSION pDevExt;
171 LIST_ENTRY FcbListEntry;
172 struct _VFATFCB* parentFcb;
173 ULONG Flags;
174 PFILE_OBJECT FileObject;
175 ULONG dirIndex;
176 ERESOURCE PagingIoResource;
177 ERESOURCE MainResource;
178 ULONG TimerCount;
179 SHARE_ACCESS FCBShareAccess;
180
181 /* Structure members used only for paging files. */
182 ULONG FatChainSize;
183 PULONG FatChain;
184 } VFATFCB, *PVFATFCB;
185
186 typedef struct _VFATCCB
187 {
188 VFATFCB * pFcb;
189 LIST_ENTRY NextCCB;
190 PFILE_OBJECT PtrFileObject;
191 LARGE_INTEGER CurrentByteOffset;
192 /* for DirectoryControl */
193 ULONG Entry;
194 /* for DirectoryControl */
195 PWCHAR DirectorySearchPattern;
196 ULONG LastCluster;
197 ULONG LastOffset;
198
199 } VFATCCB, *PVFATCCB;
200
201 #ifndef TAG
202 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
203 #endif
204
205 #define TAG_CCB TAG('V', 'C', 'C', 'B')
206
207 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
208
209 typedef struct __DOSTIME
210 {
211 WORD Second:5;
212 WORD Minute:6;
213 WORD Hour:5;
214 }
215 DOSTIME, *PDOSTIME;
216
217 typedef struct __DOSDATE
218 {
219 WORD Day:5;
220 WORD Month:4;
221 WORD Year:5;
222 }
223 DOSDATE, *PDOSDATE;
224
225 #define IRPCONTEXT_CANWAIT 0x0001
226
227 typedef struct
228 {
229 PIRP Irp;
230 PDEVICE_OBJECT DeviceObject;
231 PDEVICE_EXTENSION DeviceExt;
232 ULONG Flags;
233 WORK_QUEUE_ITEM WorkQueueItem;
234 PIO_STACK_LOCATION Stack;
235 UCHAR MajorFunction;
236 UCHAR MinorFunction;
237 PFILE_OBJECT FileObject;
238 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
239
240 /* ------------------------------------------------------ shutdown.c */
241
242 NTSTATUS STDCALL VfatShutdown (PDEVICE_OBJECT DeviceObject,
243 PIRP Irp);
244
245 /* -------------------------------------------------------- volume.c */
246
247 NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
248
249 NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
250
251 /* ------------------------------------------------------ blockdev.c */
252
253 NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
254 IN PLARGE_INTEGER ReadOffset,
255 IN ULONG ReadLength,
256 IN PUCHAR Buffer);
257
258 NTSTATUS VfatWriteDisk(IN PDEVICE_OBJECT pDeviceObject,
259 IN PLARGE_INTEGER WriteOffset,
260 IN ULONG WriteLength,
261 IN PUCHAR Buffer);
262
263 NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
264 IN ULONG CtlCode,
265 IN PVOID InputBuffer,
266 IN ULONG InputBufferSize,
267 IN OUT PVOID OutputBuffer,
268 IN OUT PULONG pOutputBufferSize);
269
270 /* ----------------------------------------------------------- dir.c */
271
272 NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);
273
274 BOOL FsdDosDateTimeToFileTime (WORD wDosDate,
275 WORD wDosTime,
276 LARGE_INTEGER *FileTime);
277
278 BOOL FsdFileTimeToDosDateTime (LARGE_INTEGER *FileTime,
279 WORD *pwDosDate,
280 WORD *pwDosTime);
281
282 /* -------------------------------------------------------- create.c */
283
284 NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
285
286 NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
287 PFILE_OBJECT FileObject,
288 PWSTR FileName);
289
290 NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
291 PVFATFCB Fcb,
292 PVFATFCB Parent,
293 PWSTR FileToFind,
294 PULONG pDirIndex,
295 PULONG pDirIndex2);
296
297 VOID vfat8Dot3ToString (PCHAR pBasename,
298 PCHAR pExtension,
299 PWSTR pName);
300
301 NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
302 PVPB Vpb);
303
304 BOOLEAN IsDeletedEntry (PVOID Block,
305 ULONG Offset);
306
307 BOOLEAN IsLastEntry (PVOID Block,
308 ULONG Offset);
309
310 /* --------------------------------------------------------- close.c */
311
312 NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);
313
314 NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
315 PFILE_OBJECT FileObject);
316
317 /* ------------------------------------------------------- cleanup.c */
318
319 NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);
320
321 /* --------------------------------------------------------- fsctl.c */
322
323 NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);
324
325 /* --------------------------------------------------------- finfo.c */
326
327 NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
328
329 NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
330
331 NTSTATUS
332 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
333 PVFATFCB Fcb,
334 PDEVICE_EXTENSION DeviceExt,
335 PLARGE_INTEGER AllocationSize);
336
337 /* --------------------------------------------------------- iface.c */
338
339 NTSTATUS STDCALL DriverEntry (PDRIVER_OBJECT DriverObject,
340 PUNICODE_STRING RegistryPath);
341
342 /* --------------------------------------------------------- dirwr.c */
343
344 NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
345 PFILE_OBJECT pFileObject,
346 ULONG RequestedOptions,UCHAR ReqAttr);
347
348 NTSTATUS VfatUpdateEntry (PDEVICE_EXTENSION DeviceExt,
349 PFILE_OBJECT pFileObject);
350
351 NTSTATUS delEntry(PDEVICE_EXTENSION,
352 PFILE_OBJECT);
353
354 /* -------------------------------------------------------- string.c */
355
356 VOID vfat_initstr (wchar_t *wstr,
357 ULONG wsize);
358
359 wchar_t* vfat_wcsncat (wchar_t * dest,
360 const wchar_t * src,
361 size_t wstart,
362 size_t wcount);
363
364 wchar_t* vfat_wcsncpy (wchar_t * dest,
365 const wchar_t *src,
366 size_t wcount);
367
368 wchar_t* vfat_movstr (wchar_t *src,
369 ULONG dpos,
370 ULONG spos,
371 ULONG len);
372
373 BOOLEAN wstrcmpi (PWSTR s1,
374 PWSTR s2);
375
376 BOOLEAN wstrcmpjoki (PWSTR s1,
377 PWSTR s2);
378
379 PWCHAR vfatGetNextPathElement (PWCHAR pFileName);
380
381 VOID vfatWSubString (PWCHAR pTarget,
382 const PWCHAR pSource,
383 size_t pLength);
384
385 BOOL vfatIsFileNameValid (PWCHAR pFileName);
386
387 /* ----------------------------------------------------------- fat.c */
388
389 NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
390 PVFATFCB Fcb,
391 ULONG FirstCluster,
392 ULONG FileOffset,
393 PULONG Cluster,
394 BOOLEAN Extend);
395
396 ULONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
397 ULONG Cluster);
398
399 NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
400 ULONG CurrentCluster,
401 PULONG NextCluster,
402 BOOLEAN Extend);
403
404 NTSTATUS GetNextSector (PDEVICE_EXTENSION DeviceExt,
405 ULONG CurrentSector,
406 PULONG NextSector,
407 BOOLEAN Extend);
408
409 NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
410 PLARGE_INTEGER Clusters);
411
412 /* ------------------------------------------------------ direntry.c */
413
414 ULONG vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,
415 PFAT_DIR_ENTRY pDirEntry);
416
417 BOOL vfatIsDirEntryDeleted (FATDirEntry * pFatDirEntry);
418
419 BOOL vfatIsDirEntryVolume (FATDirEntry * pFatDirEntry);
420
421 BOOL vfatIsDirEntryEndMarker (FATDirEntry * pFatDirEntry);
422
423 VOID vfatGetDirEntryName (PFAT_DIR_ENTRY pDirEntry,
424 PWSTR pEntryName);
425
426 NTSTATUS vfatGetNextDirEntry (PDEVICE_EXTENSION pDeviceExt,
427 PVFATFCB pDirectoryFCB,
428 ULONG * pDirectoryIndex,
429 PWSTR pLongFileName,
430 PFAT_DIR_ENTRY pDirEntry);
431
432 /* ----------------------------------------------------------- fcb.c */
433
434 PVFATFCB vfatNewFCB (PWCHAR pFileName);
435
436 VOID vfatDestroyFCB (PVFATFCB pFCB);
437
438 VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB,
439 PVFATFCB pFCB);
440
441 VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB,
442 PVFATFCB pFCB);
443
444 VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB,
445 PVFATFCB pFCB);
446
447 PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt,
448 PWSTR pFileName);
449
450 PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB);
451
452 PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);
453
454 BOOL vfatFCBIsDirectory (PDEVICE_EXTENSION pVCB,
455 PVFATFCB FCB);
456
457 NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,
458 PVFATFCB fcb,
459 PFILE_OBJECT fileObject);
460
461 NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pVCB,
462 PVFATFCB parentFCB,
463 PWSTR elementName,
464 PVFATFCB * fileFCB);
465
466 NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
467 PVFATFCB *pParentFCB,
468 PVFATFCB *pFCB,
469 const PWSTR pFileName);
470
471 NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb,
472 PVFATFCB directoryFCB,
473 PWSTR longName,
474 PFAT_DIR_ENTRY dirEntry,
475 ULONG dirIndex,
476 PVFATFCB * fileFCB);
477
478 /* ------------------------------------------------------------ rw.c */
479
480 NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
481
482 NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
483
484 NTSTATUS VfatWriteFile (PDEVICE_EXTENSION DeviceExt,
485 PFILE_OBJECT FileObject,
486 PVOID Buffer,
487 ULONG Length,
488 ULONG WriteOffset,
489 BOOLEAN NoCache,
490 BOOLEAN PageIo);
491
492
493 NTSTATUS VfatReadFile (PDEVICE_EXTENSION DeviceExt,
494 PFILE_OBJECT FileObject,
495 PVOID Buffer, ULONG Length,
496 ULONG ReadOffset,
497 PULONG LengthRead,
498 ULONG NoCache);
499
500 NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
501 PVFATFCB Fcb,
502 ULONG FirstCluster,
503 PULONG CurrentCluster,
504 BOOLEAN Extend);
505
506 /* ----------------------------------------------------------- misc.c */
507
508 NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);
509
510 PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
511 PIRP Irp);
512
513 VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
514
515 NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
516 PIRP Irp);
517
518 PVOID VfatGetUserBuffer(IN PIRP);
519
520 NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
521 IN LOCK_OPERATION);
522
523 NTSTATUS
524 VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
525 PVOID Ea,
526 ULONG EaLength);
527 /* EOF */