Section and general memory manager enhancements including COW
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
1 /* $Id: vfat.h,v 1.25 2001/02/10 22:51:11 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 PFILE_OBJECT Fat12StorageDevice;
87 PBCB Fat12StorageBcb;
88 BootSector *Boot;
89 int rootDirectorySectors, FATStart, rootStart, dataStart;
90 int FATEntriesPerSector, FATUnit;
91 ULONG BytesPerCluster;
92 ULONG FatType;
93 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
94
95 typedef struct _VFATFCB
96 {
97 REACTOS_COMMON_FCB_HEADER RFCB;
98 SECTION_OBJECT_POINTERS SectionObjectPointers;
99 FATDirEntry entry;
100 /* point on filename (250 chars max) in PathName */
101 WCHAR *ObjectName;
102 /* path+filename 260 max */
103 WCHAR PathName[MAX_PATH];
104 LONG RefCount;
105 PDEVICE_EXTENSION pDevExt;
106 LIST_ENTRY FcbListEntry;
107 struct _VFATFCB* parentFcb;
108 } VFATFCB, *PVFATFCB;
109
110 typedef struct _VFATCCB
111 {
112 VFATFCB * pFcb;
113 LIST_ENTRY NextCCB;
114 PFILE_OBJECT PtrFileObject;
115 LARGE_INTEGER CurrentByteOffset;
116 /* for DirectoryControl */
117 ULONG StartSector;
118 /* for DirectoryControl */
119 ULONG StartEntry;
120 // PSTRING DirectorySearchPattern;// for DirectoryControl ?
121 } VFATCCB, *PVFATCCB;
122
123
124 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
125
126 typedef struct __DOSTIME
127 {
128 WORD Second:5;
129 WORD Minute:6;
130 WORD Hour:5;
131 } DOSTIME, *PDOSTIME;
132
133 typedef struct __DOSDATE
134 {
135 WORD Day:5;
136 WORD Month:4;
137 WORD Year:5;
138 } DOSDATE, *PDOSDATE;
139
140 /* functions called by i/o manager : */
141 NTSTATUS STDCALL
142 DriverEntry(PDRIVER_OBJECT _DriverObject,PUNICODE_STRING RegistryPath);
143 NTSTATUS STDCALL
144 VfatDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
145 NTSTATUS STDCALL
146 VfatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
147 NTSTATUS STDCALL
148 VfatWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
149 NTSTATUS STDCALL
150 VfatCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
151 NTSTATUS STDCALL
152 VfatClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
153 NTSTATUS STDCALL
154 VfatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
155 NTSTATUS STDCALL
156 VfatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
157
158
159 NTSTATUS
160 NextCluster(PDEVICE_EXTENSION DeviceExt,
161 ULONG FirstCluster,
162 PULONG CurrentCluster,
163 BOOLEAN Extend);
164
165 /* internal functions in blockdev.c */
166 NTSTATUS
167 VfatReadSectors(IN PDEVICE_OBJECT pDeviceObject,
168 IN ULONG DiskSector,
169 IN ULONG SectorCount,
170 IN UCHAR* Buffer);
171
172 NTSTATUS
173 VfatWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
174 IN ULONG DiskSector,
175 IN ULONG SectorCount,
176 IN UCHAR* Buffer);
177
178 /* internal functions in dir.c : */
179 BOOL FsdDosDateTimeToFileTime(WORD wDosDate,WORD wDosTime, TIME *FileTime);
180 BOOL FsdFileTimeToDosDateTime(TIME *FileTime,WORD *pwDosDate,WORD *pwDosTime);
181
182 /* internal functions in iface.c : */
183 NTSTATUS
184 FindFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb,
185 PVFATFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
186 NTSTATUS
187 VfatCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject);
188 NTSTATUS
189 VfatGetStandardInformation(PVFATFCB FCB, PDEVICE_OBJECT DeviceObject,
190 PFILE_STANDARD_INFORMATION StandardInfo);
191 NTSTATUS
192 VfatOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
193 PWSTR FileName);
194 NTSTATUS
195 VfatReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
196 PVOID Buffer, ULONG Length, ULONG ReadOffset,
197 PULONG LengthRead, ULONG NoCache);
198 NTSTATUS
199 VfatWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
200 PVOID Buffer, ULONG Length, ULONG WriteOffset, ULONG NoCache);
201 NTSTATUS
202 GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt,
203 ULONG FirstCluster,
204 ULONG CurrentCluster,
205 PULONG NextCluster);
206 BOOLEAN
207 IsDeletedEntry(PVOID Block, ULONG Offset);
208 BOOLEAN
209 IsLastEntry(PVOID Block, ULONG Offset);
210 wchar_t*
211 vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
212 NTSTATUS
213 VfatRawWriteCluster(PDEVICE_EXTENSION DeviceExt,
214 ULONG FirstCluster, PVOID Buffer, ULONG Cluster);
215
216 /* internal functions in dirwr.c */
217 NTSTATUS
218 addEntry(PDEVICE_EXTENSION DeviceExt,
219 PFILE_OBJECT pFileObject,ULONG RequestedOptions,UCHAR ReqAttr);
220 NTSTATUS
221 updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject);
222
223 /*
224 * String functions
225 */
226 VOID
227 RtlAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length);
228 VOID
229 RtlCatAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length);
230 VOID
231 vfat_initstr(wchar_t *wstr, ULONG wsize);
232 wchar_t*
233 vfat_wcsncat(wchar_t * dest, const wchar_t * src,size_t wstart, size_t wcount);
234 wchar_t*
235 vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
236 wchar_t*
237 vfat_movstr(wchar_t *src, ULONG dpos, ULONG spos, ULONG len);
238 BOOLEAN
239 wstrcmpi(PWSTR s1, PWSTR s2);
240 BOOLEAN
241 wstrcmpjoki(PWSTR s1, PWSTR s2);
242
243 /*
244 * functions from fat.c
245 */
246 ULONG
247 ClusterToSector(PDEVICE_EXTENSION DeviceExt, ULONG Cluster);
248 NTSTATUS
249 GetNextCluster(PDEVICE_EXTENSION DeviceExt,
250 ULONG CurrentCluster,
251 PULONG NextCluster,
252 BOOLEAN Extend);
253 NTSTATUS
254 VfatRawReadCluster (PDEVICE_EXTENSION DeviceExt,
255 ULONG FirstCluster,
256 PVOID Buffer,
257 ULONG Cluster);
258 ULONG
259 FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
260 ULONG
261 FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
262 ULONG
263 FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
264 NTSTATUS
265 WriteCluster (PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
266 ULONG NewValue);
267
268 /*
269 * functions from volume.c
270 */
271 NTSTATUS STDCALL
272 VfatQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
273
274 /*
275 * functions from finfo.c
276 */
277 NTSTATUS STDCALL
278 VfatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
279
280 /*
281 * From create.c
282 */
283 NTSTATUS
284 ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt, PVPB Vpb);
285 NTSTATUS
286 VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
287 PWSTR FileName);
288
289 /*
290 * functions from shutdown.c
291 */
292 NTSTATUS STDCALL VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp);
293