5 unsigned char magic0
, res0
, magic1
;
6 unsigned char OEMName
[8];
7 unsigned short BytesPerSector
;
8 unsigned char SectorsPerCluster
;
9 unsigned short ReservedSectors
;
10 unsigned char FATCount
;
11 unsigned short RootEntries
, Sectors
;
13 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
14 unsigned long HiddenSectors
, SectorsHuge
;
15 unsigned char Drive
, Res1
, Sig
;
16 unsigned long VolumeID
;
17 unsigned char VolumeLabel
[11], SysType
[8];
18 unsigned char Res2
[450];
19 } __attribute__((packed
));
21 struct _BootSector32
{
22 unsigned char magic0
, res0
, magic1
;
23 unsigned char OEMName
[8];
24 unsigned short BytesPerSector
;
25 unsigned char SectorsPerCluster
;
26 unsigned short ReservedSectors
;
27 unsigned char FATCount
;
28 unsigned short RootEntries
, Sectors
;
30 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
31 unsigned long HiddenSectors
, SectorsHuge
;
32 unsigned long FATSectors32
;
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
;
69 // Put the rest in struct.h
71 typedef unsigned int uint32;
73 typedef struct _SFsdIdentifier {
76 } SFsdIdentifier, *PtrSFsdIdentifier;
78 typedef struct _SFsdNTRequiredFCB {
79 FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
80 SECTION_OBJECT_POINTERS SectionObject;
81 ERESOURCE MainResource;
82 ERESOURCE PagingIoResource;
83 } SFsdNTRequiredFCB, *PtrSFsdNTRequiredFCB;
85 typedef struct _SFsdFileControlBlock {
86 SFsdIdentifier NodeIdentifier;
87 SFsdNTRequiredFCB NTRequiredFCB;
88 SFsdDiskDependentFCB DiskDependentFCB;
89 struct _SFsdVolumeControlBlock *PtrVCB;
93 SHARE_ACCESS FCBShareAccess;
94 uint32 LazyWriterThreadID;
95 uint32 ReferenceCount;
96 uint32 OpenHandleCount;
97 PtrSFsdObjectName FCBName;
98 LARGE_INTEGER CreationTime;
99 LARGE_INTEGER LastAccessTime;
100 LARGE_INTEGER LastWriteTime;
101 SFsdFileLockAnchorFCB ByteRangeLock;
103 } SFsdFCB, *PtrSFsdFCB;
112 PDEVICE_OBJECT StorageDevice
;
114 int rootDirectorySectors
, FATStart
, rootStart
, dataStart
;
115 int FATEntriesPerSector
, FATUnit
;
116 ULONG BytesPerCluster
;
119 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
124 WCHAR ObjectName
[251];// filename has 250 characters max
126 ULONG StartEntry
;//for DirectoryControl
130 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
134 // functions called by i/o manager :
135 NTSTATUS
DriverEntry(PDRIVER_OBJECT _DriverObject
,PUNICODE_STRING RegistryPath
);
136 NTSTATUS
FsdDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
137 NTSTATUS
FsdRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
138 NTSTATUS
FsdWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
139 NTSTATUS
FsdCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
140 NTSTATUS
FsdClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
141 NTSTATUS
FsdFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
142 NTSTATUS
FsdQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
145 // internal functions in blockdev.c
146 BOOLEAN
VFATReadSectors(IN PDEVICE_OBJECT pDeviceObject
,
148 IN ULONG SectorCount
,
151 BOOLEAN
VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject
,
153 IN ULONG SectorCount
,
156 //internal functions in iface.c :
157 NTSTATUS
FsdGetStandardInformation(PFCB FCB
, PDEVICE_OBJECT DeviceObject
,
158 PFILE_STANDARD_INFORMATION StandardInfo
);
159 NTSTATUS
FindFile(PDEVICE_EXTENSION DeviceExt
, PFCB Fcb
,
160 PFCB Parent
, PWSTR FileToFind
,ULONG
*StartSector
,ULONG
*Entry
);
161 wchar_t * vfat_wcsncpy(wchar_t * dest
, const wchar_t *src
,size_t wcount
);