1 /* $Id: vfat.h,v 1.16 1999/12/16 23:08:17 ekohl Exp $ */
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
;
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
));
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
;
29 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
30 unsigned long HiddenSectors
, SectorsHuge
;
31 unsigned long FATSectors32
;
33 unsigned long VolumeID
;
34 unsigned char VolumeLabel
[11], SysType
[8];
35 unsigned char Res2
[422];
36 } __attribute__((packed
));
38 typedef struct _BootSector BootSector
;
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
));
50 typedef struct _FATDirEntry FATDirEntry
;
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
));
65 typedef struct _slot slot
;
75 ERESOURCE DirResource
;
76 ERESOURCE FatResource
;
78 KSPIN_LOCK FcbListLock
;
79 LIST_ENTRY FcbListHead
;
81 PDEVICE_OBJECT StorageDevice
;
83 int rootDirectorySectors
, FATStart
, rootStart
, dataStart
;
84 int FATEntriesPerSector
, FATUnit
;
85 ULONG BytesPerCluster
;
89 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
91 typedef struct _FSRTL_COMMON_FCB_HEADER
{
92 char IsFastIoPossible
;//is char the realtype ?
94 ERESOURCE PagingIoResource
;
95 ULONG Flags
;// is long the real type ?
96 LARGE_INTEGER AllocationSize
;
97 LARGE_INTEGER FileSize
;
98 LARGE_INTEGER ValidDataLength
;
100 } FSRTL_COMMON_FCB_HEADER
;
102 typedef struct _SFsdNTRequiredFCB
{
103 FSRTL_COMMON_FCB_HEADER CommonFCBHeader
;
104 SECTION_OBJECT_POINTERS SectionObject
;
105 ERESOURCE MainResource
;
106 ERESOURCE PagingIoResource
;
107 } SFsdNTRequiredFCB
, *PtrSFsdNTRequiredFCB
;
109 typedef struct _VFATFCB
111 SFsdNTRequiredFCB NTRequiredFCB
;
113 WCHAR
*ObjectName
; // point on filename (250 chars max) in PathName
114 WCHAR PathName
[MAX_PATH
];// path+filename 260 max
116 PDEVICE_EXTENSION pDevExt
;
117 LIST_ENTRY FcbListEntry
;
118 struct _VFATFCB
* parentFcb
;
119 } VFATFCB
, *PVFATFCB
;
121 typedef struct _VFATCCB
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
;
133 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
136 typedef struct __DOSTIME
141 } DOSTIME
, *PDOSTIME
;
143 typedef struct __DOSDATE
148 } DOSDATE
, *PDOSDATE
;
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
);
161 // internal functions in blockdev.c
162 BOOLEAN
VFATReadSectors(IN PDEVICE_OBJECT pDeviceObject
,
164 IN ULONG SectorCount
,
167 BOOLEAN
VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject
,
169 IN ULONG SectorCount
,
172 //internal functions in dir.c :
173 BOOL
FsdDosDateTimeToFileTime(WORD wDosDate
,WORD wDosTime
, TIME
*FileTime
);
174 BOOL
FsdFileTimeToDosDateTime(TIME
*FileTime
,WORD
*pwDosDate
,WORD
*pwDosTime
);
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
,
184 NTSTATUS
FsdReadFile(PDEVICE_EXTENSION DeviceExt
, PFILE_OBJECT FileObject
,
185 PVOID Buffer
, ULONG Length
, ULONG ReadOffset
,
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
);
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
);
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
);
216 * functions from fat.c
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
);
226 * functions from volume.c
228 NTSTATUS
VfatQueryVolumeInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
231 * functions from finfo.c
233 NTSTATUS
VfatSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
238 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
, PVPB Vpb
);