5 #include <pseh/pseh2.h>
12 #define Add2Ptr(P,I,T) ((T)((PUCHAR)(P) + (I)))
13 #define PtrOffset(B,O) ((ULONG)((ULONG_PTR)(O) - (ULONG_PTR)(B)))
15 #define TAG_CCB 'BCCV'
16 #define TAG_FCB 'BCFV'
17 #define TAG_IRP 'PRIV'
18 #define TAG_VFAT 'TAFV'
19 #define TAG_FSD_CLOSE_CONTEXT 'CLCV'
22 /* Global resource acquire/release */
23 #define FatAcquireExclusiveGlobal(IrpContext) \
25 ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \
26 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
29 #define FatAcquireSharedGlobal(IrpContext) \
31 ExAcquireResourceSharedLite(&FatGlobalData.Resource, \
32 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
35 #define FatReleaseGlobal(IrpContext) \
37 ExReleaseResourceLite(&(FatGlobalData.Resource)); \
40 #define FatIsFastIoPossible(FCB) ((BOOLEAN) \
41 (((FCB)->Condition != FcbGood || !FsRtlOplockIsFastIoPossible(&(FCB)->Fcb.Oplock)) ? \
44 (!FsRtlAreThereCurrentFileLocks(&(FCB)->Fcb.Lock) && \
45 ((FCB)->OutstandingAsyncWrites == 0) && \
46 !FlagOn((FCB)->Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED) ? \
49 FastIoIsQuestionable \
54 #define IsFileObjectReadOnly(FO) (!((FO)->WriteAccess | (FO)->DeleteAccess))
55 #define IsFileDeleted(FCB) (FlagOn((FCB)->State, FCB_STATE_DELETE_ON_CLOSE) && ((FCB)->UncleanCount == 0))
59 FatIsIoRangeValid(IN LARGE_INTEGER Start
, IN ULONG Length
)
61 /* Check if it's more than 32bits, or if the length causes 32bit overflow.
64 return !(Start
.HighPart
|| Start
.LowPart
+ Length
< Start
.LowPart
);
71 RtlUpcaseUnicodeStringToCountedOemString(
72 IN OUT POEM_STRING DestinationString
,
73 IN PCUNICODE_STRING SourceString
,
74 IN BOOLEAN AllocateDestinationString
78 /* ------------------------------------------------------ shutdown.c */
80 DRIVER_DISPATCH FatShutdown
;
82 FatShutdown(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
84 /* -------------------------------------------------------- volume.c */
87 FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
90 FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
93 FatReadStreamFile(PVCB Vcb
,
101 FatCheckForDismount(IN PFAT_IRP_CONTEXT IrpContext
,
105 /* ----------------------------------------------------------- dir.c */
108 FatDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
111 FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext
,
115 FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext
,
118 IN FF_FILE
*FileHandle
);
120 IO_STATUS_BLOCK NTAPI
121 FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext
,
122 IN PFILE_OBJECT FileObject
,
125 IN PACCESS_MASK DesiredAccess
,
126 IN USHORT ShareAccess
,
127 IN ULONG CreateDisposition
,
128 IN BOOLEAN NoEaKnowledge
,
129 IN BOOLEAN DeleteOnClose
);
131 /* -------------------------------------------------------- create.c */
135 FatiOverwriteFile(PFAT_IRP_CONTEXT IrpContext
,
136 PFILE_OBJECT FileObject
,
138 ULONG AllocationSize
,
139 PFILE_FULL_EA_INFORMATION EaBuffer
,
141 UCHAR FileAttributes
,
142 ULONG CreateDisposition
,
143 BOOLEAN NoEaKnowledge
);
146 FatCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
149 /* --------------------------------------------------------- close.c */
152 FatClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
154 /* ------------------------------------------------------- cleanup.c */
157 FatCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
159 /* --------------------------------------------------------- fastio.c */
162 FatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
165 FatAcquireForLazyWrite(IN PVOID Context
,
169 FatReleaseFromLazyWrite(IN PVOID Context
);
172 FatAcquireForReadAhead(IN PVOID Context
,
176 FatReleaseFromReadAhead(IN PVOID Context
);
179 FatNoopAcquire(IN PVOID Context
,
183 FatNoopRelease(IN PVOID Context
);
185 /* --------------------------------------------------------- fastfat.c */
187 extern FAST_MUTEX FatCloseQueueMutex
;
189 PFAT_IRP_CONTEXT NTAPI
190 FatBuildIrpContext(PIRP Irp
, BOOLEAN CanWait
);
193 FatDestroyIrpContext(PFAT_IRP_CONTEXT IrpContext
);
197 FatQueueRequest(IN PFAT_IRP_CONTEXT IrpContext
,
198 IN PFAT_OPERATION_HANDLER OperationHandler
);
201 FatCompleteRequest(PFAT_IRP_CONTEXT IrpContext OPTIONAL
,
206 FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext
,
210 FatAcquireSharedVcb(IN PFAT_IRP_CONTEXT IrpContext
,
214 FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext
,
218 FatAcquireExclusiveFcb(IN PFAT_IRP_CONTEXT IrpContext
,
222 FatAcquireSharedFcb(IN PFAT_IRP_CONTEXT IrpContext
,
226 FatReleaseFcb(IN PFAT_IRP_CONTEXT IrpContext
,
231 FatDecodeFileObject(IN PFILE_OBJECT FileObject
,
237 FatSetFileObject(PFILE_OBJECT FileObject
,
238 TYPE_OF_OPEN TypeOfOpen
,
243 FatMapUserBuffer(PIRP Irp
);
246 FatIsTopLevelIrp(IN PIRP Irp
);
249 FatNotifyReportChange(IN PFAT_IRP_CONTEXT IrpContext
,
255 /* --------------------------------------------------------- fullfat.c */
258 FatWriteBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
261 FatReadBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
264 FatQueryFileTimes(OUT PLARGE_INTEGER FileTimes
,
265 IN PDIR_ENTRY Dirent
);
267 /* --------------------------------------------------------- lock.c */
270 FatLockControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
273 FatOplockComplete(IN PVOID Context
,
277 FatPrePostIrp(IN PVOID Context
,
280 /* --------------------------------------------------------- fsctl.c */
283 FatFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
285 /* --------------------------------------------------------- finfo.c */
287 NTSTATUS NTAPI
FatQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
288 NTSTATUS NTAPI
FatSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
290 /* --------------------------------------------------------- fullfat.c */
292 FF_FILE
*FF_OpenW(FF_IOMAN
*pIoman
, PUNICODE_STRING pathW
, FF_T_UINT8 Mode
, FF_ERROR
*pError
);
294 /* --------------------------------------------------------- iface.c */
298 DriverEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
);
300 /* ----------------------------------------------------------- fat.c */
303 IN PFAT_IRP_CONTEXT IrpContext
,
305 IN PDEVICE_OBJECT TargetDeviceObject
,
312 /* ------------------------------------------------------ device.c */
315 FatDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
318 FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject
,
321 ULONG InputBufferSize
,
323 ULONG OutputBufferSize
,
326 /* ----------------------------------------------------------- fcb.c */
329 IN PFAT_IRP_CONTEXT IrpContext
,
332 IN FF_FILE
*FileHandle
);
335 FatDeleteFcb(IN PFAT_IRP_CONTEXT IrpContext
,
338 IO_STATUS_BLOCK NTAPI
339 FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext
,
340 IN PFILE_OBJECT FileObject
,
343 IN PACCESS_MASK DesiredAccess
,
344 IN USHORT ShareAccess
,
345 IN ULONG AllocationSize
,
346 IN PFILE_FULL_EA_INFORMATION EaBuffer
,
348 IN UCHAR FileAttributes
,
349 IN ULONG CreateDisposition
,
350 IN BOOLEAN NoEaKnowledge
,
351 IN BOOLEAN DeleteOnClose
,
352 IN BOOLEAN OpenedAsDos
,
353 OUT PBOOLEAN OplockPostIrp
);
356 FatFindFcb(PFAT_IRP_CONTEXT IrpContext
,
357 PRTL_SPLAY_LINKS
*RootNode
,
362 FatInsertName(IN PFAT_IRP_CONTEXT IrpContext
,
363 IN PRTL_SPLAY_LINKS
*RootNode
,
364 IN PFCB_NAME_LINK Name
);
367 FatRemoveNames(IN PFAT_IRP_CONTEXT IrpContext
,
374 FatDeleteCcb(IN PFAT_IRP_CONTEXT IrpContext
,
378 FatSetFullNameInFcb(PFCB Fcb
,
379 PUNICODE_STRING Name
);
382 FatSetFullFileNameInFcb(IN PFAT_IRP_CONTEXT IrpContext
,
386 FatSetFcbNames(IN PFAT_IRP_CONTEXT IrpContext
,
390 Fati8dot3ToString(IN PCHAR FileName
,
392 OUT POEM_STRING OutString
);
394 /* ------------------------------------------------------------ rw.c */
397 FatRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
400 FatWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
402 /* ------------------------------------------------------------- flush.c */
405 FatFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);