1 #ifndef __INCLUDE_DDK_FSFUNCS_H
2 #define __INCLUDE_DDK_FSFUNCS_H
4 #define FlagOn(x,f) ((x) & (f))
6 #include <ntos/fstypes.h>
8 /* Some comments on the Prototypes that aren't in the IFS:
10 FsRtlMdlReadCompleteDev (FsRtlMdlReadComplete is on GNU IFS. The Dev Suffix simply means an extra PDEVICE_OBJECT param)
11 FsRtlMdlReadDev (FsRtlMdlReadDev is on GNU IFS. The Dev Suffix simply means an extra PDEVICE_OBJECT param)
12 FsRtlMdlWriteCompleteDev FsRtlMdlWriteCompleteDev is on GNU IFS. The Dev Suffix simply means an extra PDEVICE_OBJECT param)
13 FsRtlPrepareMdlWrite (Compared with CcMdlWrite, which is already documented)
14 FsRtlPrepareMdlWriteDev (Same as above, and add a pointer to device object (Dev suffix)
19 extern PUCHAR EXPORTED FsRtlLegalAnsiCharacterArray
;
21 extern PUCHAR IMPORTED FsRtlLegalAnsiCharacterArray
;
24 #define FSRTL_WILD_CHARACTER 0x08
26 typedef signed char SCHAR
;
31 IN PFILE_LOCK FileLock
36 FsRtlAcquireFileExclusive (
37 IN PFILE_OBJECT FileObject
42 FsRtlAllocateFileLock (
43 IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL
,
44 IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL
47 #define FsRtlAreThereCurrentFileLocks(FL) (((FL)->FastIoIsQuestionable))
50 FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb
,
53 IN LONGLONG SectorCount
);
56 FsRtlAddMcbEntry (IN PMCB Mcb
,
59 IN ULONG SectorCount
);
62 FsRtlAddToTunnelCache (
64 IN ULONGLONG DirectoryKey
,
65 IN PUNICODE_STRING ShortName
,
66 IN PUNICODE_STRING LongName
,
67 IN BOOLEAN KeyByShortName
,
74 IN POOL_TYPE PoolType
,
75 IN ULONG NumberOfBytes
79 FsRtlAllocatePoolWithQuota (
80 IN POOL_TYPE PoolType
,
81 IN ULONG NumberOfBytes
85 FsRtlAllocatePoolWithQuotaTag (
86 IN POOL_TYPE PoolType
,
87 IN ULONG NumberOfBytes
,
92 FsRtlAllocatePoolWithTag (
93 IN POOL_TYPE PoolType
,
94 IN ULONG NumberOfBytes
,
99 FsRtlAllocateResource (
105 IN PUNICODE_STRING Name1
,
106 IN PUNICODE_STRING Name2
,
107 IN BOOLEAN IgnoreCase
,
108 IN PWCHAR UpcaseTable OPTIONAL
113 PDEVICE_OBJECT TargetDevice
117 FsRtlCheckLockForReadAccess (
118 IN PFILE_LOCK FileLock
,
123 FsRtlCheckLockForWriteAccess (
124 IN PFILE_LOCK FileLock
,
129 FsRtlCheckOplock(IN POPLOCK Oplock
,
132 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL
,
133 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL
);
138 IN PFILE_OBJECT FileObject
,
139 IN PLARGE_INTEGER FileOffset
,
144 OUT PIO_STATUS_BLOCK IoStatus
,
145 IN PDEVICE_OBJECT DeviceObject
150 IN PFILE_OBJECT FileObject
,
151 IN PLARGE_INTEGER FileOffset
,
156 OUT PIO_STATUS_BLOCK IoStatus
,
157 IN PDEVICE_OBJECT DeviceObject
161 FsRtlCurrentBatchOplock(IN POPLOCK Oplock
);
164 FsRtlDeleteKeyFromTunnelCache(IN PTUNNEL Cache
,
165 IN ULONGLONG DirectoryKey
);
168 FsRtlDeleteTunnelCache(IN PTUNNEL Cache
);
171 FsRtlDeregisterUncProvider(IN HANDLE Handle
);
174 FsRtlDissectDbcs(IN ANSI_STRING Name
,
175 OUT PANSI_STRING FirstPart
,
176 OUT PANSI_STRING RemainingPart
);
179 FsRtlDissectName(IN UNICODE_STRING Name
,
180 OUT PUNICODE_STRING FirstPart
,
181 OUT PUNICODE_STRING RemainingPart
);
184 FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name
);
187 FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name
);
191 FsRtlFastCheckLockForRead (
192 IN PFILE_LOCK FileLock
,
193 IN PLARGE_INTEGER FileOffset
,
194 IN PLARGE_INTEGER Length
,
196 IN PFILE_OBJECT FileObject
,
201 FsRtlFastCheckLockForWrite (
202 IN PFILE_LOCK FileLock
,
203 IN PLARGE_INTEGER FileOffset
,
204 IN PLARGE_INTEGER Length
,
206 IN PFILE_OBJECT FileObject
,
212 IN PFILE_LOCK FileLock
,
213 IN PFILE_OBJECT FileObject
,
214 IN PEPROCESS Process
,
215 IN PVOID Context OPTIONAL
219 FsRtlFastUnlockAllByKey (
220 IN PFILE_LOCK FileLock
,
221 IN PFILE_OBJECT FileObject
,
222 IN PEPROCESS Process
,
224 IN PVOID Context OPTIONAL
228 FsRtlFastUnlockSingle (
229 IN PFILE_LOCK FileLock
,
230 IN PFILE_OBJECT FileObject
,
231 IN PLARGE_INTEGER FileOffset
,
232 IN PLARGE_INTEGER Length
,
233 IN PEPROCESS Process
,
235 IN PVOID Context OPTIONAL
,
236 IN BOOLEAN AlreadySynchronized
240 FsRtlFindInTunnelCache (
242 IN ULONGLONG DirectoryKey
,
243 IN PUNICODE_STRING Name
,
244 OUT PUNICODE_STRING ShortName
,
245 OUT PUNICODE_STRING LongName
,
246 IN OUT PULONG DataLength
,
252 IN PFILE_OBJECT FileObject
,
253 IN OUT PLARGE_INTEGER FileSize
257 FsRtlGetNextFileLock (
258 IN PFILE_LOCK FileLock
,
263 FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb
,
267 OUT PLONGLONG SectorCount
);
270 FsRtlGetNextMcbEntry (IN PMCB Mcb
,
274 OUT PULONG SectorCount
);
275 #define FsRtlEnterFileSystem KeEnterCriticalRegion
276 #define FsRtlExitFileSystem KeLeaveCriticalRegion
280 FsRtlIncrementCcFastReadNotPossible( VOID
);
284 FsRtlIncrementCcFastReadWait( VOID
);
288 FsRtlIncrementCcFastReadNoWait( VOID
);
292 FsRtlIncrementCcFastReadResourceMiss( VOID
);
296 FsRtlInitializeFileLock (
297 IN PFILE_LOCK FileLock
,
298 IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL
,
299 IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL
303 FsRtlInitializeLargeMcb(IN PLARGE_MCB Mcb
,
304 IN POOL_TYPE PoolType
);
307 FsRtlInitializeMcb (IN PMCB Mcb
,
308 IN POOL_TYPE PoolType
);
311 FsRtlInitializeOplock(IN OUT POPLOCK Oplock
);
316 FsRtlInitializeTunnelCache (
322 FsRtlInsertPerFileObjectContext (
323 IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext
,
324 IN PVOID
/* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr
329 FsRtlInsertPerStreamContext (
330 IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext
,
331 IN PFSRTL_PER_STREAM_CONTEXT Ptr
335 FsRtlIsDbcsInExpression(IN PANSI_STRING Expression
,
336 IN PANSI_STRING Name
);
340 FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName
,
341 IN BOOLEAN WildCardsPermissible
,
342 IN BOOLEAN PathNamePermissible
,
343 IN BOOLEAN LeadingBackslashPermissible
);
347 FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName
,
348 IN BOOLEAN WildCardsPermissible
,
349 IN BOOLEAN PathNamePermissible
,
350 IN BOOLEAN LeadingBackslashPermissible
);
354 FsRtlIsNameInExpression (
355 IN PUNICODE_STRING Expression
,
356 IN PUNICODE_STRING Name
,
357 IN BOOLEAN IgnoreCase
,
358 IN PWCHAR UpcaseTable OPTIONAL
362 FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus
);
366 IN PFILE_OBJECT FileObject
370 FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus
);
372 #define FsRtlIsUnicodeCharacterWild(C) ( \
375 FlagOn((FsRtlLegalAnsiCharacterArray)[(C)], FSRTL_WILD_CHARACTER )) \
378 #define FSRTL_FAT_LEGAL 0x01
379 #define FSRTL_HPFS_LEGAL 0x02
380 #define FSRTL_NTFS_LEGAL 0x04
381 #define FSRTL_WILD_CHARACTER 0x08
382 #define FSRTL_OLE_LEGAL 0x10
383 #define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL)
385 #define FsRtlIsAnsiCharacterWild(C) ( \
386 FsRtlTestAnsiCharacter((C), FALSE, FALSE, FSRTL_WILD_CHARACTER) \
389 #define FsRtlIsAnsiCharacterLegalFat(C,WILD_OK) ( \
390 FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_FAT_LEGAL) \
393 #define FsRtlIsAnsiCharacterLegalHpfs(C,WILD_OK) ( \
394 FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_HPFS_LEGAL) \
397 #define FsRtlIsAnsiCharacterLegalNtfs(C,WILD_OK) ( \
398 FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_LEGAL) \
401 #define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \
402 FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \
405 #define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \
406 FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \
409 #define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \
410 ((SCHAR)(C) < 0) ? DEFAULT_RET : \
411 FlagOn(FsRtlLegalAnsiCharacterArray[(int)(C)], \
413 ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \
416 #define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \
417 (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \
418 (NLS_MB_CODE_PAGE_TAG && \
419 (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \
424 FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb
,
426 OUT PLONGLONG Lbn OPTIONAL
,
427 OUT PLONGLONG SectorCountFromLbn OPTIONAL
,
428 OUT PLONGLONG StartingLbn OPTIONAL
,
429 OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL
,
430 OUT PULONG Index OPTIONAL
);
433 FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb
,
438 FsRtlLookupLastLargeMcbEntryAndIndex (
439 IN PLARGE_MCB OpaqueMcb
,
440 OUT PLONGLONG LargeVbn
,
441 OUT PLONGLONG LargeLbn
,
446 FsRtlLookupLastMcbEntry (IN PMCB Mcb
,
450 FsRtlLookupMcbEntry (IN PMCB Mcb
,
453 OUT PULONG SectorCount OPTIONAL
,
456 PFSRTL_PER_STREAM_CONTEXT
458 FsRtlLookupPerStreamContextInternal (
459 IN PFSRTL_ADVANCED_FCB_HEADER StreamContext
,
460 IN PVOID OwnerId OPTIONAL
,
461 IN PVOID InstanceId OPTIONAL
464 PVOID
/* PFSRTL_PER_FILE_OBJECT_CONTEXT*/
466 FsRtlLookupPerFileObjectContext (
467 IN PFSRTL_ADVANCED_FCB_HEADER StreamContext
,
468 IN PVOID OwnerId OPTIONAL
,
469 IN PVOID InstanceId OPTIONAL
475 IN PFILE_OBJECT FileObject
,
476 IN PLARGE_INTEGER FileOffset
,
480 OUT PIO_STATUS_BLOCK IoStatus
485 FsRtlMdlReadComplete (
486 IN PFILE_OBJECT FileObject
,
491 FsRtlMdlReadCompleteDev (
492 IN PFILE_OBJECT FileObject
,
494 IN PDEVICE_OBJECT DeviceObject
499 IN PFILE_OBJECT FileObject
,
500 IN PLARGE_INTEGER FileOffset
,
504 OUT PIO_STATUS_BLOCK IoStatus
,
505 IN PDEVICE_OBJECT DeviceObject
509 FsRtlMdlWriteComplete (
510 IN PFILE_OBJECT FileObject
,
511 IN PLARGE_INTEGER FileOffset
,
516 FsRtlMdlWriteCompleteDev (
517 IN PFILE_OBJECT FileObject
,
518 IN PLARGE_INTEGER FileOffset
,
520 IN PDEVICE_OBJECT DeviceObject
524 FsRtlNotifyChangeDirectory (
525 IN PNOTIFY_SYNC NotifySync
,
527 IN PSTRING FullDirectoryName
,
528 IN PLIST_ENTRY NotifyList
,
529 IN BOOLEAN WatchTree
,
530 IN ULONG CompletionFilter
,
536 IN PNOTIFY_SYNC NotifySync
,
537 IN PLIST_ENTRY NotifyList
,
541 BOOLEAN (*PCHECK_FOR_TRAVERSE_ACCESS
) (
542 IN PVOID NotifyContext
,
543 IN PVOID TargetContext
,
544 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
549 FsRtlNotifyFilterChangeDirectory (
550 IN PNOTIFY_SYNC NotifySync
,
551 IN PLIST_ENTRY NotifyList
,
553 IN PSTRING FullDirectoryName
,
554 IN BOOLEAN WatchTree
,
555 IN BOOLEAN IgnoreBuffer
,
556 IN ULONG CompletionFilter
,
558 IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL
,
559 IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL
,
560 IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL
565 FsRtlNotifyFilterReportChange (
566 IN PNOTIFY_SYNC NotifySync
,
567 IN PLIST_ENTRY NotifyList
,
568 IN PSTRING FullTargetName
,
569 IN USHORT TargetNameOffset
,
570 IN PSTRING StreamName OPTIONAL
,
571 IN PSTRING NormalizedParentName OPTIONAL
,
572 IN ULONG FilterMatch
,
574 IN PVOID TargetContext
,
575 IN PVOID FilterContext
579 FsRtlNotifyFullChangeDirectory (
580 IN PNOTIFY_SYNC NotifySync
,
581 IN PLIST_ENTRY NotifyList
,
583 IN PSTRING FullDirectoryName
,
584 IN BOOLEAN WatchTree
,
585 IN BOOLEAN IgnoreBuffer
,
586 IN ULONG CompletionFilter
,
588 IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL
,
589 IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL
593 FsRtlNotifyFullReportChange (
594 IN PNOTIFY_SYNC NotifySync
,
595 IN PLIST_ENTRY NotifyList
,
596 IN PSTRING FullTargetName
,
597 IN USHORT TargetNameOffset
,
598 IN PSTRING StreamName OPTIONAL
,
599 IN PSTRING NormalizedParentName OPTIONAL
,
600 IN ULONG FilterMatch
,
602 IN PVOID TargetContext
606 FsRtlNotifyUninitializeSync (
607 IN OUT PNOTIFY_SYNC NotifySync
611 FsRtlNotifyReportChange (
612 IN PNOTIFY_SYNC NotifySync
,
613 IN PLIST_ENTRY NotifyList
,
614 IN PSTRING FullTargetName
,
615 IN PUSHORT FileNamePartLength
,
620 FsRtlNotifyInitializeSync(IN OUT PNOTIFY_SYNC
*NotifySync
);
623 FsRtlNotifyVolumeEvent(IN PFILE_OBJECT FileObject
,
627 FsRtlOplockFsctrl(IN POPLOCK Oplock
,
632 FsRtlOplockIsFastIoPossible(IN POPLOCK Oplock
);
636 FsRtlPrepareMdlWrite (
637 IN PFILE_OBJECT FileObject
,
638 IN PLARGE_INTEGER FileOffset
,
642 OUT PIO_STATUS_BLOCK IoStatus
647 FsRtlPrepareMdlWriteDev (
648 IN PFILE_OBJECT FileObject
,
649 IN PLARGE_INTEGER FileOffset
,
653 OUT PIO_STATUS_BLOCK IoStatus
,
654 IN PDEVICE_OBJECT DeviceObject
658 FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize
,
659 IN NTSTATUS NormalizedNtStatus
);
662 FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb
);
665 FsRtlNumberOfRunsInMcb (IN PMCB Mcb
);
669 FsRtlPostPagingFileStackOverflow(IN PVOID Context
,
671 IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine
) ;
675 FsRtlPostStackOverflow (IN PVOID Context
,
677 IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine
) ;
682 IN PFILE_LOCK FileLock
,
683 IN PFILE_OBJECT FileObject
,
684 IN PLARGE_INTEGER FileOffset
,
685 IN PLARGE_INTEGER Length
,
686 IN PEPROCESS Process
,
688 IN BOOLEAN FailImmediately
,
689 IN BOOLEAN ExclusiveLock
,
690 OUT PIO_STATUS_BLOCK IoStatus
,
691 IN PIRP Irp OPTIONAL
,
693 IN BOOLEAN AlreadySynchronized
698 FsRtlProcessFileLock (
699 IN PFILE_LOCK FileLock
,
701 IN PVOID Context OPTIONAL
706 FsRtlRegisterFileSystemFilterCallbacks(IN PDRIVER_OBJECT FilterDriverObject
,
707 IN PFS_FILTER_CALLBACKS Callbacks
);
710 FsRtlRegisterUncProvider(IN OUT PHANDLE Handle
,
711 IN PUNICODE_STRING RedirectorDeviceName
,
712 IN BOOLEAN MailslotsSupported
);
717 IN PFILE_OBJECT FileObject
721 FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb
,
723 IN LONGLONG SectorCount
);
726 FsRtlRemoveMcbEntry (IN PMCB Mcb
,
728 IN ULONG SectorCount
);
730 PFSRTL_PER_STREAM_CONTEXT
732 FsRtlRemovePerStreamContext (
733 IN PFSRTL_ADVANCED_FCB_HEADER StreamContext
,
734 IN PVOID OwnerId OPTIONAL
,
735 IN PVOID InstanceId OPTIONAL
738 PVOID
/* PFSRTL_PER_FILE_OBJECT_CONTEXT*/
740 FsRtlRemovePerFileObjectContext (
741 IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext
,
742 IN PVOID OwnerId OPTIONAL
,
743 IN PVOID InstanceId OPTIONAL
750 IN BOOLEAN SelfSynchronized
754 FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb
,
768 FsRtlTeardownPerStreamContexts (
769 IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader
773 FsRtlTruncateLargeMcb(IN PLARGE_MCB Mcb
,
777 FsRtlTruncateMcb (IN PMCB Mcb
,
781 FsRtlUninitializeFileLock (IN PFILE_LOCK FileLock
);
784 FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb
);
787 FsRtlUninitializeMcb (IN PMCB Mcb
);
790 FsRtlUninitializeOplock(IN POPLOCK Oplock
);
792 #endif /* __INCLUDE_DDK_FSFUNCS_H */