4 #include <pseh/pseh2.h>
11 #define Add2Ptr(P,I,T) ((T)((PUCHAR)(P) + (I)))
12 #define PtrOffset(B,O) ((ULONG)((ULONG_PTR)(O) - (ULONG_PTR)(B)))
14 #define TAG_CCB 'BCCV'
15 #define TAG_FCB 'BCFV'
16 #define TAG_IRP 'PRIV'
17 #define TAG_VFAT 'TAFV'
20 /* Global resource acquire/release */
21 #define FatAcquireExclusiveGlobal(IrpContext) \
23 ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \
24 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
27 #define FatAcquireSharedGlobal(IrpContext) \
29 ExAcquireResourceSharedLite(&FatGlobalData.Resource, \
30 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
33 #define FatReleaseGlobal(IrpContext) \
35 ExReleaseResourceLite(&(FatGlobalData.Resource)); \
39 /* ------------------------------------------------------ shutdown.c */
41 DRIVER_DISPATCH FatShutdown
;
43 FatShutdown(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
45 /* -------------------------------------------------------- volume.c */
48 FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
51 FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
53 /* ------------------------------------------------------ blockdev.c */
57 IN PFAT_IRP_CONTEXT IrpContext
,
58 IN PLARGE_INTEGER Offset
,
62 FatPerformVirtualNonCachedIo(
63 IN PFAT_IRP_CONTEXT IrpContext
,
65 IN PLARGE_INTEGER Offset
,
72 /* ----------------------------------------------------------- dir.c */
75 FatDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
78 FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext
,
81 /* -------------------------------------------------------- create.c */
84 FatCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
87 /* --------------------------------------------------------- close.c */
90 FatClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
92 /* ------------------------------------------------------- cleanup.c */
95 FatCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
97 /* --------------------------------------------------------- fastio.c */
100 FatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
103 FatAcquireForLazyWrite(IN PVOID Context
,
107 FatReleaseFromLazyWrite(IN PVOID Context
);
110 FatAcquireForReadAhead(IN PVOID Context
,
114 FatReleaseFromReadAhead(IN PVOID Context
);
117 FatNoopAcquire(IN PVOID Context
,
121 FatNoopRelease(IN PVOID Context
);
123 /* --------------------------------------------------------- fastfat.c */
125 PFAT_IRP_CONTEXT NTAPI
126 FatBuildIrpContext(PIRP Irp
, BOOLEAN CanWait
);
129 FatDestroyIrpContext(PFAT_IRP_CONTEXT IrpContext
);
133 FatQueueRequest(IN PFAT_IRP_CONTEXT IrpContext
,
134 IN PFAT_OPERATION_HANDLER OperationHandler
);
137 FatCompleteRequest(PFAT_IRP_CONTEXT IrpContext OPTIONAL
,
142 FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext
,
146 FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext
,
151 FatDecodeFileObject(IN PFILE_OBJECT FileObject
,
156 /* --------------------------------------------------------- fcb.c */
159 FatFindFcb(PFAT_IRP_CONTEXT IrpContext
,
160 PRTL_SPLAY_LINKS
*RootNode
,
164 /* --------------------------------------------------------- fullfat.c */
167 FatWriteBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
170 FatReadBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
172 /* --------------------------------------------------------- lock.c */
175 FatLockControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
177 /* --------------------------------------------------------- fsctl.c */
180 FatFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
182 /* --------------------------------------------------------- finfo.c */
184 NTSTATUS NTAPI
FatQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
185 NTSTATUS NTAPI
FatSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
187 /* --------------------------------------------------------- iface.c */
191 DriverEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
);
193 /* ----------------------------------------------------------- fat.c */
196 PFAT_PAGE_CONTEXT Context
,
197 LONGLONG ByteOffset
);
201 PFAT_PAGE_CONTEXT Context
);
205 IN PFAT_IRP_CONTEXT IrpContext
,
207 IN PDEVICE_OBJECT TargetDeviceObject
,
217 IN LONGLONG Vbo
, OUT PLONGLONG Lbo
,
218 IN OUT PLONGLONG Length
,
222 /* ------------------------------------------------------ device.c */
225 FatDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
228 FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject
,
231 ULONG InputBufferSize
,
233 ULONG OutputBufferSize
,
236 /* ------------------------------------------------------ direntry.c */
238 FatFindDirent(IN OUT PFAT_FIND_DIRENT_CONTEXT Context
,
239 OUT PDIR_ENTRY
* Dirent
,
240 OUT PUNICODE_STRING LongFileName OPTIONAL
);
243 FatEnumerateDirents(IN OUT PFAT_ENUM_DIRENT_CONTEXT Context
,
247 FatQueryFileTimes(OUT PLARGE_INTEGER FileTimes
,
248 IN PDIR_ENTRY Dirent
);
250 /* ----------------------------------------------------------- fcb.c */
254 IN PUNICODE_STRING Name
);
268 OUT PFCB
* CreatedFcb
,
269 IN PFAT_IRP_CONTEXT IrpContext
,
271 IN PDIR_ENTRY Dirent
,
272 IN PUNICODE_STRING FileName
,
273 IN PUNICODE_STRING LongFileName OPTIONAL
);
278 IN PFAT_IRP_CONTEXT IrpContext
,
280 IN PUNICODE_STRING FileName
);
282 /* ------------------------------------------------------------ rw.c */
285 FatRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
288 FatWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
290 /* ------------------------------------------------------------- flush.c */
293 FatFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);