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
);
54 FatReadStreamFile(PVCB Vcb
,
60 /* ------------------------------------------------------ blockdev.c */
64 IN PFAT_IRP_CONTEXT IrpContext
,
65 IN PLARGE_INTEGER Offset
,
69 FatPerformVirtualNonCachedIo(
70 IN PFAT_IRP_CONTEXT IrpContext
,
72 IN PLARGE_INTEGER Offset
,
75 /* ----------------------------------------------------------- dir.c */
78 FatDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
81 FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext
,
85 FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext
,
88 IN FF_FILE
*FileHandle
);
91 FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext
,
92 IN PFILE_OBJECT FileObject
,
95 IN PACCESS_MASK DesiredAccess
,
96 IN USHORT ShareAccess
,
97 IN ULONG CreateDisposition
,
98 IN BOOLEAN NoEaKnowledge
,
99 IN BOOLEAN DeleteOnClose
);
101 /* -------------------------------------------------------- create.c */
104 FatCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
107 /* --------------------------------------------------------- close.c */
110 FatClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
112 /* ------------------------------------------------------- cleanup.c */
115 FatCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
117 /* --------------------------------------------------------- fastio.c */
120 FatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
123 FatAcquireForLazyWrite(IN PVOID Context
,
127 FatReleaseFromLazyWrite(IN PVOID Context
);
130 FatAcquireForReadAhead(IN PVOID Context
,
134 FatReleaseFromReadAhead(IN PVOID Context
);
137 FatNoopAcquire(IN PVOID Context
,
141 FatNoopRelease(IN PVOID Context
);
143 /* --------------------------------------------------------- fastfat.c */
145 PFAT_IRP_CONTEXT NTAPI
146 FatBuildIrpContext(PIRP Irp
, BOOLEAN CanWait
);
149 FatDestroyIrpContext(PFAT_IRP_CONTEXT IrpContext
);
153 FatQueueRequest(IN PFAT_IRP_CONTEXT IrpContext
,
154 IN PFAT_OPERATION_HANDLER OperationHandler
);
157 FatCompleteRequest(PFAT_IRP_CONTEXT IrpContext OPTIONAL
,
162 FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext
,
166 FatAcquireSharedVcb(IN PFAT_IRP_CONTEXT IrpContext
,
170 FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext
,
174 FatAcquireExclusiveFcb(IN PFAT_IRP_CONTEXT IrpContext
,
178 FatAcquireSharedFcb(IN PFAT_IRP_CONTEXT IrpContext
,
182 FatReleaseFcb(IN PFAT_IRP_CONTEXT IrpContext
,
187 FatDecodeFileObject(IN PFILE_OBJECT FileObject
,
193 FatSetFileObject(PFILE_OBJECT FileObject
,
194 TYPE_OF_OPEN TypeOfOpen
,
199 FatMapUserBuffer(PIRP Irp
);
201 /* --------------------------------------------------------- fullfat.c */
204 FatWriteBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
207 FatReadBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
209 /* --------------------------------------------------------- lock.c */
212 FatLockControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
214 /* --------------------------------------------------------- fsctl.c */
217 FatFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
219 /* --------------------------------------------------------- finfo.c */
221 NTSTATUS NTAPI
FatQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
222 NTSTATUS NTAPI
FatSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
224 /* --------------------------------------------------------- iface.c */
228 DriverEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
);
230 /* ----------------------------------------------------------- fat.c */
233 PFAT_PAGE_CONTEXT Context
,
234 LONGLONG ByteOffset
);
238 PFAT_PAGE_CONTEXT Context
);
242 IN PFAT_IRP_CONTEXT IrpContext
,
244 IN PDEVICE_OBJECT TargetDeviceObject
,
254 IN LONGLONG Vbo
, OUT PLONGLONG Lbo
,
255 IN OUT PLONGLONG Length
,
259 /* ------------------------------------------------------ device.c */
262 FatDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
265 FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject
,
268 ULONG InputBufferSize
,
270 ULONG OutputBufferSize
,
273 /* ------------------------------------------------------ direntry.c */
275 FatFindDirent(IN OUT PFAT_FIND_DIRENT_CONTEXT Context
,
276 OUT PDIR_ENTRY
* Dirent
,
277 OUT PUNICODE_STRING LongFileName OPTIONAL
);
280 FatEnumerateDirents(IN OUT PFAT_ENUM_DIRENT_CONTEXT Context
,
284 FatQueryFileTimes(OUT PLARGE_INTEGER FileTimes
,
285 IN PDIR_ENTRY Dirent
);
287 /* ----------------------------------------------------------- fcb.c */
291 IN PUNICODE_STRING Name
);
305 IN PFAT_IRP_CONTEXT IrpContext
,
308 IN FF_FILE
*FileHandle
);
310 IO_STATUS_BLOCK NTAPI
311 FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext
,
312 IN PFILE_OBJECT FileObject
,
315 IN PACCESS_MASK DesiredAccess
,
316 IN USHORT ShareAccess
,
317 IN ULONG AllocationSize
,
318 IN PFILE_FULL_EA_INFORMATION EaBuffer
,
320 IN UCHAR FileAttributes
,
321 IN ULONG CreateDisposition
,
322 IN BOOLEAN NoEaKnowledge
,
323 IN BOOLEAN DeleteOnClose
,
324 IN BOOLEAN OpenedAsDos
,
325 OUT PBOOLEAN OplockPostIrp
);
328 FatFindFcb(PFAT_IRP_CONTEXT IrpContext
,
329 PRTL_SPLAY_LINKS
*RootNode
,
334 FatInsertName(IN PFAT_IRP_CONTEXT IrpContext
,
335 IN PRTL_SPLAY_LINKS
*RootNode
,
336 IN PFCB_NAME_LINK Name
);
339 FatRemoveNames(IN PFAT_IRP_CONTEXT IrpContext
,
346 FatSetFullNameInFcb(PFCB Fcb
,
347 PUNICODE_STRING Name
);
350 FatSetFullFileNameInFcb(IN PFAT_IRP_CONTEXT IrpContext
,
354 FatSetFcbNames(IN PFAT_IRP_CONTEXT IrpContext
,
358 Fati8dot3ToString(IN PCHAR FileName
,
360 OUT POEM_STRING OutString
);
362 /* ------------------------------------------------------------ rw.c */
365 FatRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
368 FatWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
370 /* ------------------------------------------------------------- flush.c */
373 FatFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);