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