Added a time conversion function and fixed a little bug
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
1 /* $Id: vfat.h,v 1.16 1999/12/16 23:08:17 ekohl 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 BOOL FsdFileTimeToDosDateTime(TIME *FileTime,WORD *pwDosDate,WORD *pwDosTime);
175
176 //internal functions in iface.c :
177 NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb,
178 PVFATFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
179 NTSTATUS FsdCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject);
180 NTSTATUS FsdGetStandardInformation(PVFATFCB FCB, PDEVICE_OBJECT DeviceObject,
181 PFILE_STANDARD_INFORMATION StandardInfo);
182 NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
183 PWSTR FileName);
184 NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
185 PVOID Buffer, ULONG Length, ULONG ReadOffset,
186 PULONG LengthRead);
187 NTSTATUS FsdWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
188 PVOID Buffer, ULONG Length, ULONG WriteOffset);
189 ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster);
190 BOOLEAN IsDeletedEntry(PVOID Block, ULONG Offset);
191 BOOLEAN IsLastEntry(PVOID Block, ULONG Offset);
192 wchar_t * vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
193 void VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster);
194
195 //internal functions in dirwr.c
196 NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt
197 ,PFILE_OBJECT pFileObject,ULONG RequestedOptions,UCHAR ReqAttr);
198 NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject);
199
200
201
202
203 /*
204 * String functions
205 */
206 void RtlAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length);
207 void RtlCatAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length);
208 void vfat_initstr(wchar_t *wstr, ULONG wsize);
209 wchar_t * vfat_wcsncat(wchar_t * dest, const wchar_t * src,size_t wstart, size_t wcount);
210 wchar_t * vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
211 wchar_t * vfat_movstr(wchar_t *src, ULONG dpos, ULONG spos, ULONG len);
212 BOOLEAN wstrcmpi(PWSTR s1, PWSTR s2);
213 BOOLEAN wstrcmpjoki(PWSTR s1, PWSTR s2);
214
215 /*
216 * functions from fat.c
217 */
218 ULONG ClusterToSector(PDEVICE_EXTENSION DeviceExt, ULONG Cluster);
219 ULONG GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster);
220 VOID VFATLoadCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster);
221 ULONG FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
222 ULONG FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
223 ULONG FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt);
224
225 /*
226 * functions from volume.c
227 */
228 NTSTATUS VfatQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
229
230 /*
231 * functions from finfo.c
232 */
233 NTSTATUS VfatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
234
235 /*
236 * From create.c
237 */
238 NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt, PVPB Vpb);