4 #include <pseh/pseh2.h>
9 #define Add2Ptr(P,I,T) ((T)((PUCHAR)(P) + (I)))
10 #define PtrOffset(B,O) ((ULONG)((ULONG_PTR)(O) - (ULONG_PTR)(B)))
12 #define TAG_CCB 'BCCV'
13 #define TAG_FCB 'BCFV'
14 #define TAG_IRP 'PRIV'
15 #define TAG_VFAT 'TAFV'
18 /* Global resource acquire/release */
19 #define FatAcquireExclusiveGlobal(IrpContext) \
21 ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \
22 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
25 #define FatAcquireSharedGlobal(IrpContext) \
27 ExAcquireResourceSharedLite(&FatGlobalData.Resource, \
28 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
31 #define FatReleaseGlobal(IrpContext) \
33 ExReleaseResourceLite(&(FatGlobalData.Resource)); \
37 /* ------------------------------------------------------ shutdown.c */
39 DRIVER_DISPATCH FatShutdown
;
41 FatShutdown(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
43 /* -------------------------------------------------------- volume.c */
46 FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
49 FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
51 /* ------------------------------------------------------ blockdev.c */
55 IN PFAT_IRP_CONTEXT IrpContext
,
56 IN PLARGE_INTEGER Offset
,
60 FatPerformVirtualNonCachedIo(
61 IN PFAT_IRP_CONTEXT IrpContext
,
63 IN PLARGE_INTEGER Offset
,
70 /* ----------------------------------------------------------- dir.c */
73 FatDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
76 FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext
,
79 /* -------------------------------------------------------- create.c */
82 FatCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
85 /* --------------------------------------------------------- close.c */
88 FatClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
90 /* ------------------------------------------------------- cleanup.c */
93 FatCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
95 /* --------------------------------------------------------- fastio.c */
98 FatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
101 FatAcquireForLazyWrite(IN PVOID Context
,
105 FatReleaseFromLazyWrite(IN PVOID Context
);
108 FatAcquireForReadAhead(IN PVOID Context
,
112 FatReleaseFromReadAhead(IN PVOID Context
);
115 FatNoopAcquire(IN PVOID Context
,
119 FatNoopRelease(IN PVOID Context
);
121 /* --------------------------------------------------------- fastfat.c */
123 PFAT_IRP_CONTEXT NTAPI
124 FatBuildIrpContext(PIRP Irp
, BOOLEAN CanWait
);
127 FatDestroyIrpContext(PFAT_IRP_CONTEXT IrpContext
);
131 FatQueueRequest(IN PFAT_IRP_CONTEXT IrpContext
,
132 IN PFAT_OPERATION_HANDLER OperationHandler
);
135 FatCompleteRequest(PFAT_IRP_CONTEXT IrpContext OPTIONAL
,
140 FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext
,
144 FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext
,
149 FatDecodeFileObject(IN PFILE_OBJECT FileObject
,
154 /* --------------------------------------------------------- lock.c */
157 FatLockControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
159 /* --------------------------------------------------------- fsctl.c */
162 FatFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
164 /* --------------------------------------------------------- finfo.c */
166 NTSTATUS NTAPI
FatQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
167 NTSTATUS NTAPI
FatSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
169 /* --------------------------------------------------------- iface.c */
173 DriverEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
);
175 /* ----------------------------------------------------------- fat.c */
178 PFAT_PAGE_CONTEXT Context
,
179 LONGLONG ByteOffset
);
183 PFAT_PAGE_CONTEXT Context
);
187 IN PFAT_IRP_CONTEXT IrpContext
,
189 IN PDEVICE_OBJECT TargetDeviceObject
,
199 IN LONGLONG Vbo
, OUT PLONGLONG Lbo
,
200 IN OUT PLONGLONG Length
,
204 /* ------------------------------------------------------ device.c */
207 FatDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
210 FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject
,
213 ULONG InputBufferSize
,
215 ULONG OutputBufferSize
,
218 /* ------------------------------------------------------ direntry.c */
220 FatFindDirent(IN OUT PFAT_FIND_DIRENT_CONTEXT Context
,
221 OUT PDIR_ENTRY
* Dirent
,
222 OUT PUNICODE_STRING LongFileName OPTIONAL
);
225 FatEnumerateDirents(IN OUT PFAT_ENUM_DIRENT_CONTEXT Context
,
229 FatQueryFileTimes(OUT PLARGE_INTEGER FileTimes
,
230 IN PDIR_ENTRY Dirent
);
232 /* ----------------------------------------------------------- fcb.c */
236 IN PUNICODE_STRING Name
);
250 OUT PFCB
* CreatedFcb
,
251 IN PFAT_IRP_CONTEXT IrpContext
,
253 IN PDIR_ENTRY Dirent
,
254 IN PUNICODE_STRING FileName
,
255 IN PUNICODE_STRING LongFileName OPTIONAL
);
260 IN PFAT_IRP_CONTEXT IrpContext
,
262 IN PUNICODE_STRING FileName
);
264 /* ------------------------------------------------------------ rw.c */
267 FatRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
270 FatWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
272 /* ------------------------------------------------------------- flush.c */
275 FatFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);