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'
21 /* Global resource acquire/release */
22 #define FatAcquireExclusiveGlobal(IrpContext) \
24 ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \
25 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
28 #define FatAcquireSharedGlobal(IrpContext) \
30 ExAcquireResourceSharedLite(&FatGlobalData.Resource, \
31 (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
34 #define FatReleaseGlobal(IrpContext) \
36 ExReleaseResourceLite(&(FatGlobalData.Resource)); \
42 RtlUpcaseUnicodeStringToCountedOemString(
43 IN OUT POEM_STRING DestinationString
,
44 IN PCUNICODE_STRING SourceString
,
45 IN BOOLEAN AllocateDestinationString
49 /* ------------------------------------------------------ shutdown.c */
51 DRIVER_DISPATCH FatShutdown
;
53 FatShutdown(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
55 /* -------------------------------------------------------- volume.c */
58 FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
61 FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
64 FatReadStreamFile(PVCB Vcb
,
70 /* ----------------------------------------------------------- dir.c */
73 FatDirectoryControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
76 FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext
,
80 FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext
,
83 IN FF_FILE
*FileHandle
);
86 FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext
,
87 IN PFILE_OBJECT FileObject
,
90 IN PACCESS_MASK DesiredAccess
,
91 IN USHORT ShareAccess
,
92 IN ULONG CreateDisposition
,
93 IN BOOLEAN NoEaKnowledge
,
94 IN BOOLEAN DeleteOnClose
);
96 /* -------------------------------------------------------- create.c */
100 FatiOverwriteFile(PFAT_IRP_CONTEXT IrpContext
,
101 PFILE_OBJECT FileObject
,
103 ULONG AllocationSize
,
104 PFILE_FULL_EA_INFORMATION EaBuffer
,
106 UCHAR FileAttributes
,
107 ULONG CreateDisposition
,
108 BOOLEAN NoEaKnowledge
);
111 FatCreate(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
114 /* --------------------------------------------------------- close.c */
117 FatClose(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
119 /* ------------------------------------------------------- cleanup.c */
122 FatCleanup(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
124 /* --------------------------------------------------------- fastio.c */
127 FatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
130 FatAcquireForLazyWrite(IN PVOID Context
,
134 FatReleaseFromLazyWrite(IN PVOID Context
);
137 FatAcquireForReadAhead(IN PVOID Context
,
141 FatReleaseFromReadAhead(IN PVOID Context
);
144 FatNoopAcquire(IN PVOID Context
,
148 FatNoopRelease(IN PVOID Context
);
150 /* --------------------------------------------------------- fastfat.c */
152 PFAT_IRP_CONTEXT NTAPI
153 FatBuildIrpContext(PIRP Irp
, BOOLEAN CanWait
);
156 FatDestroyIrpContext(PFAT_IRP_CONTEXT IrpContext
);
160 FatQueueRequest(IN PFAT_IRP_CONTEXT IrpContext
,
161 IN PFAT_OPERATION_HANDLER OperationHandler
);
164 FatCompleteRequest(PFAT_IRP_CONTEXT IrpContext OPTIONAL
,
169 FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext
,
173 FatAcquireSharedVcb(IN PFAT_IRP_CONTEXT IrpContext
,
177 FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext
,
181 FatAcquireExclusiveFcb(IN PFAT_IRP_CONTEXT IrpContext
,
185 FatAcquireSharedFcb(IN PFAT_IRP_CONTEXT IrpContext
,
189 FatReleaseFcb(IN PFAT_IRP_CONTEXT IrpContext
,
194 FatDecodeFileObject(IN PFILE_OBJECT FileObject
,
200 FatSetFileObject(PFILE_OBJECT FileObject
,
201 TYPE_OF_OPEN TypeOfOpen
,
206 FatMapUserBuffer(PIRP Irp
);
208 /* --------------------------------------------------------- fullfat.c */
211 FatWriteBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
214 FatReadBlocks(FF_T_UINT8
*pBuffer
, FF_T_UINT32 SectorAddress
, FF_T_UINT32 Count
, void *pParam
);
217 FatQueryFileTimes(OUT PLARGE_INTEGER FileTimes
,
218 IN PDIR_ENTRY Dirent
);
220 /* --------------------------------------------------------- lock.c */
223 FatLockControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
226 FatOplockComplete(IN PVOID Context
,
230 FatPrePostIrp(IN PVOID Context
,
233 /* --------------------------------------------------------- fsctl.c */
236 FatFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
238 /* --------------------------------------------------------- finfo.c */
240 NTSTATUS NTAPI
FatQueryInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
241 NTSTATUS NTAPI
FatSetInformation(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
243 /* --------------------------------------------------------- fullfat.c */
245 FF_FILE
*FF_OpenW(FF_IOMAN
*pIoman
, PUNICODE_STRING pathW
, FF_T_UINT8 Mode
, FF_ERROR
*pError
);
247 /* --------------------------------------------------------- iface.c */
251 DriverEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
);
253 /* ----------------------------------------------------------- fat.c */
256 IN PFAT_IRP_CONTEXT IrpContext
,
258 IN PDEVICE_OBJECT TargetDeviceObject
,
265 /* ------------------------------------------------------ device.c */
268 FatDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
271 FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject
,
274 ULONG InputBufferSize
,
276 ULONG OutputBufferSize
,
279 /* ----------------------------------------------------------- fcb.c */
282 IN PFAT_IRP_CONTEXT IrpContext
,
285 IN FF_FILE
*FileHandle
);
287 IO_STATUS_BLOCK NTAPI
288 FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext
,
289 IN PFILE_OBJECT FileObject
,
292 IN PACCESS_MASK DesiredAccess
,
293 IN USHORT ShareAccess
,
294 IN ULONG AllocationSize
,
295 IN PFILE_FULL_EA_INFORMATION EaBuffer
,
297 IN UCHAR FileAttributes
,
298 IN ULONG CreateDisposition
,
299 IN BOOLEAN NoEaKnowledge
,
300 IN BOOLEAN DeleteOnClose
,
301 IN BOOLEAN OpenedAsDos
,
302 OUT PBOOLEAN OplockPostIrp
);
305 FatFindFcb(PFAT_IRP_CONTEXT IrpContext
,
306 PRTL_SPLAY_LINKS
*RootNode
,
311 FatInsertName(IN PFAT_IRP_CONTEXT IrpContext
,
312 IN PRTL_SPLAY_LINKS
*RootNode
,
313 IN PFCB_NAME_LINK Name
);
316 FatRemoveNames(IN PFAT_IRP_CONTEXT IrpContext
,
323 FatSetFullNameInFcb(PFCB Fcb
,
324 PUNICODE_STRING Name
);
327 FatSetFullFileNameInFcb(IN PFAT_IRP_CONTEXT IrpContext
,
331 FatSetFcbNames(IN PFAT_IRP_CONTEXT IrpContext
,
335 Fati8dot3ToString(IN PCHAR FileName
,
337 OUT POEM_STRING OutString
);
339 /* ------------------------------------------------------------ rw.c */
342 FatRead(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
345 FatWrite(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
347 /* ------------------------------------------------------------- flush.c */
350 FatFlushBuffers(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);