reactos/sdk/include/xdk/fsrtlfuncs.h
Joachim Henze 688875e411 [0.4.7][CDFS_NEW/NTOSKRNL/NDK] Switch from our old CDFS to MS-PL CDFS_NEW
The main motivation to switch to that newer driver is, that our old one
simply can not read all isos. Especially complex ones made trouble and were
only shown as empty in explorer.
It is still possible to build and use the old driver when needed, only thing
that needs to be done for that is to revert 0.4.8-dev-164-g ec6b3ecbe4

Porting back the state up to 0.4.8-release-100-g8f947b5 implies:

Fixing the following JIRA-IDs (or avoid introducing them):
CORE-18029 "Mute noisy DPRINT 'SectionObject has ImageSection'"
CORE-17405 "Fix a macro-copy-paste and shrink the binary size"
CORE-15659 "Unable to build the gcc Release version in Windows using RosBE 2.1.6 (module cdfs fails)"
CORE-14315 "CDFS_NEW assertion during first stage setup due to new CcPerformReadAhead"
CORE-14128 "Avast! Free Antivirus 7.0 hangs the system when trying to detect a newly created virus"
CORE-14067 "CDFS_NEW assertions and exceptions"
CORE-14003 "Shutting down LiveCD asserts since introduction of MS PL CDFS_NEW"
CORE-13184 "Restore ability to install from disk-image"

by picking the following commits:
0.4.8-release-100-g 8f947b5322 [NTOSKRNL] Mute noisy DPRINT 'SectionObject has ImageSection' CORE-18029
0.4.8-release-80-g eb1ea19588 [CDFS_NEW] == 0.4.15-dev-1456-g 889eab7 CORE-17405
0.4.8-release-62-g 8c07aad4a8 [CDFS_NEW/XDK] == 0.4.11-dev-39-g a2f9762 + 0.4.11-dev-40-g 6d7ec8c CORE-14067
0.4.8-release-3-g 5d976d04e8 [CDFS_NEW] == 0.4.12-dev-431-g bccad87f3c + 0.4.12-dev-432-g 3463b2db9f CORE-15659
0.4.8-RC-3-g 51f9494d48 [CDFS_NEW] superseded later by the proper fix 0.4.8-release-62-g 8c07aad4a8 CORE-14067
0.4.8-dev-1069-g a5e89014dc [CDFS_NEW] CORE-14315
0.4.8-dev-475-g a59d4674de [NTOSKRNL] io/iomgr/device.c (forgotten assert) CORE-14128
0.4.8-dev-221-g 9d67a24799 [CDFS_NEW]
0.4.8-dev-220-g 67a7e45e35 [CDFS_NEW/DOC]
0.4.8-dev-219-g 6a3bbf24e0 [CDFS_NEW]
0.4.8-dev-218-g ec26cde4a1 [CDFS_NEW]
0.4.8-dev-217-g bc2378a356 [CDFS_NEW]
0.4.8-dev-216-g 5429771b99 [CDFS_NEW]
0.4.8-dev-215-g fd34548263 [CDFS_NEW] Sync with MS-PL driver
0.4.8-dev-164-g ec6b3ecbe4 [FILESYSTEMS] switch from CDFS to CDFS_NEW in CMakeLists.txt
0.4.8-dev-160-g 2b217e4ecf [NTOSKRNL] Mute spam CcSetReadAheadGranularity()
0.4.8-dev-159-g 64cb138a67 [NTOSKRNL] Mute spam CcPurgeCacheSection()
0.4.8-dev-150-g f723d230a0 [CDFS_NEW]
0.4.8-dev-133-g faee3753ea [CDFS_NEW] CORE-14003
0.4.8-dev-132-g 1d777ffab5 [NTOSKRNL] iofunc.c CORE-14003
0.4.8-dev-131-g c3d5a3f2bd [NTOSKRNL] iofunc.c CORE-14003
0.4.8-dev-130-g 3b64f7f8fb [NTOSKRNL] ob/obref.c & co CORE-14003
0.4.8-dev-129-g 7eefe70294 [NTOSKRNL] io/iomgr.c & co CORE-14003
0.4.8-dev-127-g 5f255827d3 [CDFS_NEW]
0.4.8-dev-126-g 1bef48796e [NTOSKRNL] just a comment, superseded later
0.4.8-dev-125-g cbf0430b56 [CDFS_NEW]
0.4.8-dev-123-g f88fe43abd [NTOSKRNL] io/iomgr/device.c (forbidden DPRINT)
0.4.8-dev-122-g 6c73385625 [CDFS_NEW] CORE-13184
0.4.8-dev-97-g 94298313c0 [CDFS_NEW]
0.4.8-dev-95-g e88eeb21af [CDFS_NEW/NTOSKRNL] CcWaitForCurrentLazyWriterActivity() stub return Success
0.4.8-dev-94-g 03d5be6437 [CDFS_NEW]
0.4.8-dev-93-g fa1c60db50 [CDFS_NEW]
0.4.8-dev-92-g 8b2fd60829 [CDFS_NEW]
0.4.8-dev-91-g e4da7ecc50 [CDFS_NEW]
0.4.8-dev-90-g 7b19676e2b [CDFS_NEW]
0.4.8-dev-89-g 3d4b8783fd [CDFS_NEW]
0.4.8-dev-88-g 818025ecc8 [CDFS_NEW]
0.4.8-dev-87-g 2639dd6736 [CDFS_NEW]
0.4.8-dev-86-g 755bdb5d0b [CDFS_NEW]
0.4.8-dev-85-g 3cbcb1bade [CDFS_NEW]

and mute spam in opcode INSTEAD of picking:
0.4.8-dev-165-g 2284a457a3 [NTOSKRNL] oplock.c Fixup
0.4.8-dev-163-g d3d5853956 [NTOSKRNL] oplock.c Implement oplock-support
0.4.12-dev-232-g f488102c86 [CDFS] was also left out for now

I am aware, that the backport introduces white-space-glitches within CDFS_NEW.
I decided to live with them in favor of better sync to master and newer releases.
2022-01-27 21:11:23 +01:00

1716 lines
39 KiB
C

$if (_NTIFS_)
/* FSRTL Functions */
#define FsRtlEnterFileSystem KeEnterCriticalRegion
#define FsRtlExitFileSystem KeLeaveCriticalRegion
#if (NTDDI_VERSION >= NTDDI_WIN2K)
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCopyRead(
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ ULONG Length,
_In_ BOOLEAN Wait,
_In_ ULONG LockKey,
_Out_writes_bytes_(Length) PVOID Buffer,
_Out_ PIO_STATUS_BLOCK IoStatus,
_In_ PDEVICE_OBJECT DeviceObject);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCopyWrite(
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ ULONG Length,
_In_ BOOLEAN Wait,
_In_ ULONG LockKey,
_In_reads_bytes_(Length) PVOID Buffer,
_Out_ PIO_STATUS_BLOCK IoStatus,
_In_ PDEVICE_OBJECT DeviceObject);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlReadDev(
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ ULONG Length,
_In_ ULONG LockKey,
_Outptr_ PMDL *MdlChain,
_Out_ PIO_STATUS_BLOCK IoStatus,
_In_opt_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlReadCompleteDev(
_In_ PFILE_OBJECT FileObject,
_In_ PMDL MdlChain,
_In_opt_ PDEVICE_OBJECT DeviceObject);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlPrepareMdlWriteDev(
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ ULONG Length,
_In_ ULONG LockKey,
_Outptr_ PMDL *MdlChain,
_Out_ PIO_STATUS_BLOCK IoStatus,
_In_ PDEVICE_OBJECT DeviceObject);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlWriteCompleteDev(
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ PMDL MdlChain,
_In_opt_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlAcquireFileExclusive(
_In_ PFILE_OBJECT FileObject);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlReleaseFile(
_In_ PFILE_OBJECT FileObject);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlGetFileSize(
_In_ PFILE_OBJECT FileObject,
_Out_ PLARGE_INTEGER FileSize);
_Must_inspect_result_
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsTotalDeviceFailure(
_In_ NTSTATUS Status);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFILE_LOCK
NTAPI
FsRtlAllocateFileLock(
_In_opt_ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine,
_In_opt_ PUNLOCK_ROUTINE UnlockRoutine);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlFreeFileLock(
_In_ PFILE_LOCK FileLock);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeFileLock(
_Out_ PFILE_LOCK FileLock,
_In_opt_ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine,
_In_opt_ PUNLOCK_ROUTINE UnlockRoutine);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeFileLock(
_Inout_ PFILE_LOCK FileLock);
/*
FsRtlProcessFileLock:
ret:
-STATUS_INVALID_DEVICE_REQUEST
-STATUS_RANGE_NOT_LOCKED from unlock routines.
-STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
(redirected IoStatus->Status).
Internals:
-switch ( Irp->CurrentStackLocation->MinorFunction )
lock: return FsRtlPrivateLock;
unlocksingle: return FsRtlFastUnlockSingle;
unlockall: return FsRtlFastUnlockAll;
unlockallbykey: return FsRtlFastUnlockAllByKey;
default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
return STATUS_INVALID_DEVICE_REQUEST;
-'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
-'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
*/
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlProcessFileLock(
_In_ PFILE_LOCK FileLock,
_In_ PIRP Irp,
_In_opt_ PVOID Context);
/*
FsRtlCheckLockForReadAccess:
All this really does is pick out the lock parameters from the irp (io stack
location?), get IoGetRequestorProcess, and pass values on to
FsRtlFastCheckLockForRead.
*/
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCheckLockForReadAccess(
_In_ PFILE_LOCK FileLock,
_In_ PIRP Irp);
/*
FsRtlCheckLockForWriteAccess:
All this really does is pick out the lock parameters from the irp (io stack
location?), get IoGetRequestorProcess, and pass values on to
FsRtlFastCheckLockForWrite.
*/
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCheckLockForWriteAccess(
_In_ PFILE_LOCK FileLock,
_In_ PIRP Irp);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlFastCheckLockForRead(
_In_ PFILE_LOCK FileLock,
_In_ PLARGE_INTEGER FileOffset,
_In_ PLARGE_INTEGER Length,
_In_ ULONG Key,
_In_ PFILE_OBJECT FileObject,
_In_ PVOID Process);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlFastCheckLockForWrite(
_In_ PFILE_LOCK FileLock,
_In_ PLARGE_INTEGER FileOffset,
_In_ PLARGE_INTEGER Length,
_In_ ULONG Key,
_In_ PFILE_OBJECT FileObject,
_In_ PVOID Process);
/*
FsRtlGetNextFileLock:
ret: NULL if no more locks
Internals:
FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
FileLock->LastReturnedLock as storage.
LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
calls with Restart = FALSE.
*/
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFILE_LOCK_INFO
NTAPI
FsRtlGetNextFileLock(
_In_ PFILE_LOCK FileLock,
_In_ BOOLEAN Restart);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFastUnlockSingle(
_In_ PFILE_LOCK FileLock,
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ PLARGE_INTEGER Length,
_In_ PEPROCESS Process,
_In_ ULONG Key,
_In_opt_ PVOID Context,
_In_ BOOLEAN AlreadySynchronized);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFastUnlockAll(
_In_ PFILE_LOCK FileLock,
_In_ PFILE_OBJECT FileObject,
_In_ PEPROCESS Process,
_In_opt_ PVOID Context);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFastUnlockAllByKey(
_In_ PFILE_LOCK FileLock,
_In_ PFILE_OBJECT FileObject,
_In_ PEPROCESS Process,
_In_ ULONG Key,
_In_opt_ PVOID Context);
/*
FsRtlPrivateLock:
ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED
Internals:
-Calls IoCompleteRequest if Irp
-Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
*/
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
__drv_preferredFunction(FsRtlFastLock, "Obsolete")
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlPrivateLock(
_In_ PFILE_LOCK FileLock,
_In_ PFILE_OBJECT FileObject,
_In_ PLARGE_INTEGER FileOffset,
_In_ PLARGE_INTEGER Length,
_In_ PEPROCESS Process,
_In_ ULONG Key,
_In_ BOOLEAN FailImmediately,
_In_ BOOLEAN ExclusiveLock,
_Out_ PIO_STATUS_BLOCK IoStatus,
_In_opt_ PIRP Irp,
_In_opt_ __drv_aliasesMem PVOID Context,
_In_ BOOLEAN AlreadySynchronized);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeTunnelCache(
_In_ PTUNNEL Cache);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlAddToTunnelCache(
_In_ PTUNNEL Cache,
_In_ ULONGLONG DirectoryKey,
_In_ PUNICODE_STRING ShortName,
_In_ PUNICODE_STRING LongName,
_In_ BOOLEAN KeyByShortName,
_In_ ULONG DataLength,
_In_reads_bytes_(DataLength) PVOID Data);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlFindInTunnelCache(
_In_ PTUNNEL Cache,
_In_ ULONGLONG DirectoryKey,
_In_ PUNICODE_STRING Name,
_Out_ PUNICODE_STRING ShortName,
_Out_ PUNICODE_STRING LongName,
_Inout_ PULONG DataLength,
_Out_writes_bytes_to_(*DataLength, *DataLength) PVOID Data);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlDeleteKeyFromTunnelCache(
_In_ PTUNNEL Cache,
_In_ ULONGLONG DirectoryKey);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlDeleteTunnelCache(
_In_ PTUNNEL Cache);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlDissectDbcs(
_In_ ANSI_STRING Name,
_Out_ PANSI_STRING FirstPart,
_Out_ PANSI_STRING RemainingPart);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlDoesDbcsContainWildCards(
_In_ PANSI_STRING Name);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsDbcsInExpression(
_In_ PANSI_STRING Expression,
_In_ PANSI_STRING Name);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsFatDbcsLegal(
_In_ ANSI_STRING DbcsName,
_In_ BOOLEAN WildCardsPermissible,
_In_ BOOLEAN PathNamePermissible,
_In_ BOOLEAN LeadingBackslashPermissible);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsHpfsDbcsLegal(
_In_ ANSI_STRING DbcsName,
_In_ BOOLEAN WildCardsPermissible,
_In_ BOOLEAN PathNamePermissible,
_In_ BOOLEAN LeadingBackslashPermissible);
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNormalizeNtstatus(
_In_ NTSTATUS Exception,
_In_ NTSTATUS GenericException);
_Must_inspect_result_
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsNtstatusExpected(
_In_ NTSTATUS Ntstatus);
_IRQL_requires_max_(APC_LEVEL)
__drv_preferredFunction(ExAllocateFromNPagedLookasideList, "The FsRtlAllocateResource routine is obsolete, but is exported to support existing driver binaries. Use ExAllocateFromNPagedLookasideList and ExInitializeResourceLite instead.")
NTKERNELAPI
PERESOURCE
NTAPI
FsRtlAllocateResource(VOID);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeLargeMcb(
_Out_ PLARGE_MCB Mcb,
_In_ POOL_TYPE PoolType);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeLargeMcb(
_Inout_ PLARGE_MCB Mcb);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlResetLargeMcb(
_Inout_ PLARGE_MCB Mcb,
_In_ BOOLEAN SelfSynchronized);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlTruncateLargeMcb(
_Inout_ PLARGE_MCB Mcb,
_In_ LONGLONG Vbn);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAddLargeMcbEntry(
_Inout_ PLARGE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG Lbn,
_In_ LONGLONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlRemoveLargeMcbEntry(
_Inout_ PLARGE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupLargeMcbEntry(
_In_ PLARGE_MCB Mcb,
_In_ LONGLONG Vbn,
_Out_opt_ PLONGLONG Lbn,
_Out_opt_ PLONGLONG SectorCountFromLbn,
_Out_opt_ PLONGLONG StartingLbn,
_Out_opt_ PLONGLONG SectorCountFromStartingLbn,
_Out_opt_ PULONG Index);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupLastLargeMcbEntry(
_In_ PLARGE_MCB Mcb,
_Out_ PLONGLONG Vbn,
_Out_ PLONGLONG Lbn);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupLastLargeMcbEntryAndIndex(
_In_ PLARGE_MCB OpaqueMcb,
_Out_ PLONGLONG LargeVbn,
_Out_ PLONGLONG LargeLbn,
_Out_ PULONG Index);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
ULONG
NTAPI
FsRtlNumberOfRunsInLargeMcb(
_In_ PLARGE_MCB Mcb);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlGetNextLargeMcbEntry(
_In_ PLARGE_MCB Mcb,
_In_ ULONG RunIndex,
_Out_ PLONGLONG Vbn,
_Out_ PLONGLONG Lbn,
_Out_ PLONGLONG SectorCount);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlSplitLargeMcb(
_Inout_ PLARGE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG Amount);
_IRQL_requires_max_(APC_LEVEL)
__drv_preferredFunction(FsRtlInitializeLargeMcb, "Obsolete")
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeMcb(
_Out_ PMCB Mcb,
_In_ POOL_TYPE PoolType);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeMcb(
_Inout_ PMCB Mcb);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlTruncateMcb(
_Inout_ PMCB Mcb,
_In_ VBN Vbn);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAddMcbEntry(
_Inout_ PMCB Mcb,
_In_ VBN Vbn,
_In_ LBN Lbn,
_In_ ULONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlRemoveMcbEntry(
_Inout_ PMCB Mcb,
_In_ VBN Vbn,
_In_ ULONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupMcbEntry(
_In_ PMCB Mcb,
_In_ VBN Vbn,
_Out_ PLBN Lbn,
_Out_opt_ PULONG SectorCount,
_Out_ PULONG Index);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupLastMcbEntry(
_In_ PMCB Mcb,
_Out_ PVBN Vbn,
_Out_ PLBN Lbn);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
ULONG
NTAPI
FsRtlNumberOfRunsInMcb(
_In_ PMCB Mcb);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlGetNextMcbEntry(
_In_ PMCB Mcb,
_In_ ULONG RunIndex,
_Out_ PVBN Vbn,
_Out_ PLBN Lbn,
_Out_ PULONG SectorCount);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlBalanceReads(
_In_ PDEVICE_OBJECT TargetDevice);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeOplock(
_Inout_ POPLOCK Oplock);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeOplock(
_Inout_ POPLOCK Oplock);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlOplockFsctrl(
_In_ POPLOCK Oplock,
_In_ PIRP Irp,
_In_ ULONG OpenCount);
_When_(CompletionRoutine != NULL, _Must_inspect_result_)
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlCheckOplock(
_In_ POPLOCK Oplock,
_In_ PIRP Irp,
_In_opt_ PVOID Context,
_In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
_In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlOplockIsFastIoPossible(
_In_ POPLOCK Oplock);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCurrentBatchOplock(
_In_ POPLOCK Oplock);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNotifyVolumeEvent(
_In_ PFILE_OBJECT FileObject,
_In_ ULONG EventCode);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyInitializeSync(
_In_ PNOTIFY_SYNC *NotifySync);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyUninitializeSync(
_In_ PNOTIFY_SYNC *NotifySync);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyFullChangeDirectory(
_In_ PNOTIFY_SYNC NotifySync,
_In_ PLIST_ENTRY NotifyList,
_In_ PVOID FsContext,
_In_ PSTRING FullDirectoryName,
_In_ BOOLEAN WatchTree,
_In_ BOOLEAN IgnoreBuffer,
_In_ ULONG CompletionFilter,
_In_opt_ PIRP NotifyIrp,
_In_opt_ PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
_In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyFilterReportChange(
_In_ PNOTIFY_SYNC NotifySync,
_In_ PLIST_ENTRY NotifyList,
_In_ PSTRING FullTargetName,
_In_ USHORT TargetNameOffset,
_In_opt_ PSTRING StreamName,
_In_opt_ PSTRING NormalizedParentName,
_In_ ULONG FilterMatch,
_In_ ULONG Action,
_In_opt_ PVOID TargetContext,
_In_opt_ PVOID FilterContext);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyFullReportChange(
_In_ PNOTIFY_SYNC NotifySync,
_In_ PLIST_ENTRY NotifyList,
_In_ PSTRING FullTargetName,
_In_ USHORT TargetNameOffset,
_In_opt_ PSTRING StreamName,
_In_opt_ PSTRING NormalizedParentName,
_In_ ULONG FilterMatch,
_In_ ULONG Action,
_In_opt_ PVOID TargetContext);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyCleanup(
_In_ PNOTIFY_SYNC NotifySync,
_In_ PLIST_ENTRY NotifyList,
_In_ PVOID FsContext);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlDissectName(
_In_ UNICODE_STRING Name,
_Out_ PUNICODE_STRING FirstPart,
_Out_ PUNICODE_STRING RemainingPart);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlDoesNameContainWildCards(
_In_ PUNICODE_STRING Name);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAreNamesEqual(
_In_ PCUNICODE_STRING Name1,
_In_ PCUNICODE_STRING Name2,
_In_ BOOLEAN IgnoreCase,
_In_reads_opt_(0x10000) PCWCH UpcaseTable);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsNameInExpression(
_In_ PUNICODE_STRING Expression,
_In_ PUNICODE_STRING Name,
_In_ BOOLEAN IgnoreCase,
_In_opt_ PWCHAR UpcaseTable);
_IRQL_requires_max_(DISPATCH_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlPostPagingFileStackOverflow(
_In_ PVOID Context,
_In_ PKEVENT Event,
_In_ PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine);
_IRQL_requires_max_(DISPATCH_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlPostStackOverflow (
_In_ PVOID Context,
_In_ PKEVENT Event,
_In_ PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlRegisterUncProvider(
_Out_ PHANDLE MupHandle,
_In_ PCUNICODE_STRING RedirectorDeviceName,
_In_ BOOLEAN MailslotsSupported);
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlDeregisterUncProvider(
_In_ HANDLE Handle);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlTeardownPerStreamContexts(
_In_ PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlCreateSectionForDataScan(
_Out_ PHANDLE SectionHandle,
_Outptr_ PVOID *SectionObject,
_Out_opt_ PLARGE_INTEGER SectionFileSize,
_In_ PFILE_OBJECT FileObject,
_In_ ACCESS_MASK DesiredAccess,
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_opt_ PLARGE_INTEGER MaximumSize,
_In_ ULONG SectionPageProtection,
_In_ ULONG AllocationAttributes,
_In_ ULONG Flags);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_WINXP)
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyFilterChangeDirectory(
_In_ PNOTIFY_SYNC NotifySync,
_In_ PLIST_ENTRY NotifyList,
_In_ PVOID FsContext,
_In_ PSTRING FullDirectoryName,
_In_ BOOLEAN WatchTree,
_In_ BOOLEAN IgnoreBuffer,
_In_ ULONG CompletionFilter,
_In_opt_ PIRP NotifyIrp,
_In_opt_ PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
_In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
_In_opt_ PFILTER_REPORT_CHANGE FilterCallback);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlInsertPerStreamContext(
_In_ PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
_In_ PFSRTL_PER_STREAM_CONTEXT Ptr);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFSRTL_PER_STREAM_CONTEXT
NTAPI
FsRtlLookupPerStreamContextInternal(
_In_ PFSRTL_ADVANCED_FCB_HEADER StreamContext,
_In_opt_ PVOID OwnerId,
_In_opt_ PVOID InstanceId);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFSRTL_PER_STREAM_CONTEXT
NTAPI
FsRtlRemovePerStreamContext(
_In_ PFSRTL_ADVANCED_FCB_HEADER StreamContext,
_In_opt_ PVOID OwnerId,
_In_opt_ PVOID InstanceId);
NTKERNELAPI
VOID
NTAPI
FsRtlIncrementCcFastReadNotPossible(
VOID);
NTKERNELAPI
VOID
NTAPI
FsRtlIncrementCcFastReadWait(VOID);
NTKERNELAPI
VOID
NTAPI
FsRtlIncrementCcFastReadNoWait(VOID);
NTKERNELAPI
VOID
NTAPI
FsRtlIncrementCcFastReadResourceMiss(VOID);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
LOGICAL
NTAPI
FsRtlIsPagingFile(
_In_ PFILE_OBJECT FileObject);
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
#if (NTDDI_VERSION >= NTDDI_WS03)
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeBaseMcb(
_Out_ PBASE_MCB Mcb,
_In_ POOL_TYPE PoolType);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeBaseMcb(
_In_ PBASE_MCB Mcb);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlResetBaseMcb(
_Out_ PBASE_MCB Mcb);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlTruncateBaseMcb(
_Inout_ PBASE_MCB Mcb,
_In_ LONGLONG Vbn);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAddBaseMcbEntry(
_Inout_ PBASE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG Lbn,
_In_ LONGLONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlRemoveBaseMcbEntry(
_Inout_ PBASE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupBaseMcbEntry(
_In_ PBASE_MCB Mcb,
_In_ LONGLONG Vbn,
_Out_opt_ PLONGLONG Lbn,
_Out_opt_ PLONGLONG SectorCountFromLbn,
_Out_opt_ PLONGLONG StartingLbn,
_Out_opt_ PLONGLONG SectorCountFromStartingLbn,
_Out_opt_ PULONG Index);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupLastBaseMcbEntry(
_In_ PBASE_MCB Mcb,
_Out_ PLONGLONG Vbn,
_Out_ PLONGLONG Lbn);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlLookupLastBaseMcbEntryAndIndex(
_In_ PBASE_MCB OpaqueMcb,
_Inout_ PLONGLONG LargeVbn,
_Inout_ PLONGLONG LargeLbn,
_Inout_ PULONG Index);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
ULONG
NTAPI
FsRtlNumberOfRunsInBaseMcb(
_In_ PBASE_MCB Mcb);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlGetNextBaseMcbEntry(
_In_ PBASE_MCB Mcb,
_In_ ULONG RunIndex,
_Out_ PLONGLONG Vbn,
_Out_ PLONGLONG Lbn,
_Out_ PLONGLONG SectorCount);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlSplitBaseMcb(
_Inout_ PBASE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG Amount);
#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
_When_(!Flags & MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE, _Must_inspect_result_)
_IRQL_requires_max_(APC_LEVEL)
BOOLEAN
NTAPI
FsRtlInitializeBaseMcbEx(
_Out_ PBASE_MCB Mcb,
_In_ POOL_TYPE PoolType,
_In_ USHORT Flags);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTSTATUS
NTAPI
FsRtlAddBaseMcbEntryEx(
_Inout_ PBASE_MCB Mcb,
_In_ LONGLONG Vbn,
_In_ LONGLONG Lbn,
_In_ LONGLONG SectorCount);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCurrentOplock(
_In_ POPLOCK Oplock);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlOplockBreakToNone(
_Inout_ POPLOCK Oplock,
_In_opt_ PIO_STACK_LOCATION IrpSp,
_In_ PIRP Irp,
_In_opt_ PVOID Context,
_In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
_In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine);
_IRQL_requires_max_(DISPATCH_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNotifyVolumeEventEx(
_In_ PFILE_OBJECT FileObject,
_In_ ULONG EventCode,
_In_ PTARGET_DEVICE_CUSTOM_NOTIFICATION Event);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlNotifyCleanupAll(
_In_ PNOTIFY_SYNC NotifySync,
_In_ PLIST_ENTRY NotifyList);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
NTAPI
FsRtlRegisterUncProviderEx(
_Out_ PHANDLE MupHandle,
_In_ PUNICODE_STRING RedirDevName,
_In_ PDEVICE_OBJECT DeviceObject,
_In_ ULONG Flags);
_Must_inspect_result_
_When_(Irp!=NULL, _IRQL_requires_max_(PASSIVE_LEVEL))
_When_(Irp==NULL, _IRQL_requires_max_(APC_LEVEL))
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlCancellableWaitForSingleObject(
_In_ PVOID Object,
_In_opt_ PLARGE_INTEGER Timeout,
_In_opt_ PIRP Irp);
_Must_inspect_result_
_When_(Irp != NULL, _IRQL_requires_max_(PASSIVE_LEVEL))
_When_(Irp == NULL, _IRQL_requires_max_(APC_LEVEL))
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlCancellableWaitForMultipleObjects(
_In_ ULONG Count,
_In_reads_(Count) PVOID ObjectArray[],
_In_ WAIT_TYPE WaitType,
_In_opt_ PLARGE_INTEGER Timeout,
_In_opt_ PKWAIT_BLOCK WaitBlockArray,
_In_opt_ PIRP Irp);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlMupGetProviderInfoFromFileObject(
_In_ PFILE_OBJECT pFileObject,
_In_ ULONG Level,
_Out_writes_bytes_(*pBufferSize) PVOID pBuffer,
_Inout_ PULONG pBufferSize);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlMupGetProviderIdFromName(
_In_ PUNICODE_STRING pProviderName,
_Out_ PULONG32 pProviderId);
NTKERNELAPI
VOID
NTAPI
FsRtlIncrementCcFastMdlReadWait(VOID);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlValidateReparsePointBuffer(
_In_ ULONG BufferLength,
_In_reads_bytes_(BufferLength) PREPARSE_DATA_BUFFER ReparseBuffer);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlRemoveDotsFromPath(
_Inout_updates_bytes_(PathLength) PWSTR OriginalString,
_In_ USHORT PathLength,
_Out_ USHORT *NewLength);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlAllocateExtraCreateParameterList(
_In_ FSRTL_ALLOCATE_ECPLIST_FLAGS Flags,
_Outptr_ PECP_LIST *EcpList);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlFreeExtraCreateParameterList(
_In_ PECP_LIST EcpList);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlAllocateExtraCreateParameter(
_In_ LPCGUID EcpType,
_In_ ULONG SizeOfContext,
_In_ FSRTL_ALLOCATE_ECP_FLAGS Flags,
_In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback,
_In_ ULONG PoolTag,
_Outptr_result_bytebuffer_(SizeOfContext) PVOID *EcpContext);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlFreeExtraCreateParameter(
_In_ PVOID EcpContext);
_When_(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL, _IRQL_requires_max_(DISPATCH_LEVEL))
_When_(!(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL), _IRQL_requires_max_(APC_LEVEL))
NTKERNELAPI
VOID
NTAPI
FsRtlInitExtraCreateParameterLookasideList(
_Inout_ PVOID Lookaside,
_In_ FSRTL_ECP_LOOKASIDE_FLAGS Flags,
_In_ SIZE_T Size,
_In_ ULONG Tag);
_When_(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL, _IRQL_requires_max_(DISPATCH_LEVEL))
_When_(!(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL), _IRQL_requires_max_(APC_LEVEL))
VOID
NTAPI
FsRtlDeleteExtraCreateParameterLookasideList(
_Inout_ PVOID Lookaside,
_In_ FSRTL_ECP_LOOKASIDE_FLAGS Flags);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlAllocateExtraCreateParameterFromLookasideList(
_In_ LPCGUID EcpType,
ULONG SizeOfContext,
_In_ FSRTL_ALLOCATE_ECP_FLAGS Flags,
_In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback,
_Inout_ PVOID LookasideList,
_Outptr_ PVOID *EcpContext);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlInsertExtraCreateParameter(
_Inout_ PECP_LIST EcpList,
_Inout_ PVOID EcpContext);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFindExtraCreateParameter(
_In_ PECP_LIST EcpList,
_In_ LPCGUID EcpType,
_Outptr_opt_ PVOID *EcpContext,
_Out_opt_ ULONG *EcpContextSize);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlRemoveExtraCreateParameter(
_Inout_ PECP_LIST EcpList,
_In_ LPCGUID EcpType,
_Outptr_ PVOID *EcpContext,
_Out_opt_ ULONG *EcpContextSize);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlGetEcpListFromIrp(
_In_ PIRP Irp,
_Outptr_result_maybenull_ PECP_LIST *EcpList);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlSetEcpListIntoIrp(
_Inout_ PIRP Irp,
_In_ PECP_LIST EcpList);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlGetNextExtraCreateParameter(
_In_ PECP_LIST EcpList,
_In_opt_ PVOID CurrentEcpContext,
_Out_opt_ LPGUID NextEcpType,
_Outptr_opt_ PVOID *NextEcpContext,
_Out_opt_ ULONG *NextEcpContextSize);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlAcknowledgeEcp(
_In_ PVOID EcpContext);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsEcpAcknowledged(
_In_ PVOID EcpContext);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsEcpFromUserMode(
_In_ PVOID EcpContext);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlChangeBackingFileObject(
_In_opt_ PFILE_OBJECT CurrentFileObject,
_In_ PFILE_OBJECT NewFileObject,
_In_ FSRTL_CHANGE_BACKING_TYPE ChangeBackingType,
_In_ ULONG Flags);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlLogCcFlushError(
_In_ PUNICODE_STRING FileName,
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer,
_In_ NTSTATUS FlushError,
_In_ ULONG Flags);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAreVolumeStartupApplicationsComplete(VOID);
NTKERNELAPI
ULONG
NTAPI
FsRtlQueryMaximumVirtualDiskNestingLevel(VOID);
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlGetVirtualDiskNestingLevel(
_In_ PDEVICE_OBJECT DeviceObject,
_Out_ PULONG NestingLevel,
_Out_opt_ PULONG NestingFlags);
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
#if (NTDDI_VERSION >= NTDDI_VISTASP1)
_When_(Flags | OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, _Must_inspect_result_)
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlCheckOplockEx(
_In_ POPLOCK Oplock,
_In_ PIRP Irp,
_In_ ULONG Flags,
_In_opt_ PVOID Context,
_In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
_In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine);
#endif
#if (NTDDI_VERSION >= NTDDI_WIN7)
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAreThereCurrentOrInProgressFileLocks(
_In_ PFILE_LOCK FileLock);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlOplockIsSharedRequest(
_In_ PIRP Irp);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlOplockBreakH(
_In_ POPLOCK Oplock,
_In_ PIRP Irp,
_In_ ULONG Flags,
_In_opt_ PVOID Context,
_In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
_In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCurrentOplockH(
_In_ POPLOCK Oplock);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlOplockBreakToNoneEx(
_Inout_ POPLOCK Oplock,
_In_ PIRP Irp,
_In_ ULONG Flags,
_In_opt_ PVOID Context,
_In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
_In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlOplockFsctrlEx(
_In_ POPLOCK Oplock,
_In_ PIRP Irp,
_In_ ULONG OpenCount,
_In_ ULONG Flags);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlOplockKeysEqual(
_In_opt_ PFILE_OBJECT Fo1,
_In_opt_ PFILE_OBJECT Fo2);
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlInitializeExtraCreateParameterList(
_Inout_ PECP_LIST EcpList);
NTKERNELAPI
VOID
NTAPI
FsRtlInitializeExtraCreateParameter(
_Out_ PECP_HEADER Ecp,
_In_ ULONG EcpFlags,
_In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback,
_In_ ULONG TotalSize,
_In_ LPCGUID EcpType,
_In_opt_ PVOID ListAllocatedFrom);
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlInsertPerFileContext(
_In_ PVOID* PerFileContextPointer,
_In_ PFSRTL_PER_FILE_CONTEXT Ptr);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFSRTL_PER_FILE_CONTEXT
NTAPI
FsRtlLookupPerFileContext(
_In_ PVOID* PerFileContextPointer,
_In_opt_ PVOID OwnerId,
_In_opt_ PVOID InstanceId);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFSRTL_PER_FILE_CONTEXT
NTAPI
FsRtlRemovePerFileContext(
_In_ PVOID* PerFileContextPointer,
_In_opt_ PVOID OwnerId,
_In_opt_ PVOID InstanceId);
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
VOID
NTAPI
FsRtlTeardownPerFileContexts(
_In_ PVOID* PerFileContextPointer);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlInsertPerFileObjectContext(
_In_ PFILE_OBJECT FileObject,
_In_ PFSRTL_PER_FILEOBJECT_CONTEXT Ptr);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFSRTL_PER_FILEOBJECT_CONTEXT
NTAPI
FsRtlLookupPerFileObjectContext(
_In_ PFILE_OBJECT FileObject,
_In_opt_ PVOID OwnerId,
_In_opt_ PVOID InstanceId);
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
PFSRTL_PER_FILEOBJECT_CONTEXT
NTAPI
FsRtlRemovePerFileObjectContext(
_In_ PFILE_OBJECT FileObject,
_In_opt_ PVOID OwnerId,
_In_opt_ PVOID InstanceId);
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlRegisterFileSystemFilterCallbacks(
_In_ struct _DRIVER_OBJECT *FilterDriverObject,
_In_ PFS_FILTER_CALLBACKS Callbacks);
#if (NTDDI_VERSION >= NTDDI_VISTA)
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNotifyStreamFileObject(
_In_ struct _FILE_OBJECT * StreamFileObject,
_In_opt_ struct _DEVICE_OBJECT *DeviceObjectHint,
_In_ FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
_In_ BOOLEAN SafeToRecurse);
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) \
FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11)
#define FsRtlAreThereCurrentFileLocks(FL) \
((FL)->FastIoIsQuestionable)
#define FsRtlIncrementLockRequestsInProgress(FL) { \
ASSERT((FL)->LockRequestsInProgress >= 0); \
(void) \
(InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress))); \
}
#define FsRtlDecrementLockRequestsInProgress(FL) { \
ASSERT((FL)->LockRequestsInProgress > 0); \
(void) \
(InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress))); \
}
#ifdef _NTSYSTEM_
extern const UCHAR * const FsRtlLegalAnsiCharacterArray;
#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray
#else
__CREATE_NTOS_DATA_IMPORT_ALIAS(FsRtlLegalAnsiCharacterArray)
extern const UCHAR * const *FsRtlLegalAnsiCharacterArray;
#define LEGAL_ANSI_CHARACTER_ARRAY (*FsRtlLegalAnsiCharacterArray)
#endif
#define FsRtlIsAnsiCharacterWild(C) \
FsRtlTestAnsiCharacter((C), FALSE, FALSE, FSRTL_WILD_CHARACTER)
#define FsRtlIsAnsiCharacterLegalFat(C, WILD) \
FsRtlTestAnsiCharacter((C), TRUE, (WILD), FSRTL_FAT_LEGAL)
#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) \
FsRtlTestAnsiCharacter((C), TRUE, (WILD), FSRTL_HPFS_LEGAL)
#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) \
FsRtlTestAnsiCharacter((C), TRUE, (WILD), FSRTL_NTFS_LEGAL)
#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) \
FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL)
#define FsRtlIsAnsiCharacterLegal(C,FLAGS) \
FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS))
#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) \
(((SCHAR)(C) < 0) ? DEFAULT_RET : \
FlagOn(LEGAL_ANSI_CHARACTER_ARRAY[(C)], \
(FLAGS) | ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0)))
#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) \
((BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \
(NLS_MB_CODE_PAGE_TAG && \
(NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))))
#define FsRtlIsUnicodeCharacterWild(C) \
((((C) >= 0x40) ? FALSE : \
FlagOn(LEGAL_ANSI_CHARACTER_ARRAY[(C)], FSRTL_WILD_CHARACTER )))
#define FsRtlInitPerFileContext(_fc, _owner, _inst, _cb) \
((_fc)->OwnerId = (_owner), \
(_fc)->InstanceId = (_inst), \
(_fc)->FreeCallback = (_cb))
#define FsRtlGetPerFileContextPointer(_fo) \
(FsRtlSupportsPerFileContexts(_fo) ? \
FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : NULL)
#define FsRtlSupportsPerFileContexts(_fo) \
((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \
(FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \
(FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL))
#define FsRtlSetupAdvancedHeaderEx(_advhdr, _fmutx, _fctxptr) \
{ \
FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \
if ((_fctxptr) != NULL) { \
(_advhdr)->FileContextSupportPointer = (_fctxptr); \
} \
}
#define FsRtlGetPerStreamContextPointer(FO) \
((PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext)
#define FsRtlInitPerStreamContext(PSC, O, I, FC) \
((PSC)->OwnerId = (O), \
(PSC)->InstanceId = (I), \
(PSC)->FreeCallback = (FC))
#define FsRtlSupportsPerStreamContexts(FO) \
((BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \
FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \
FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)))
#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \
(((NULL != (_sc)) && \
FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \
!IsListEmpty(&(_sc)->FilterContexts)) ? \
FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : NULL)
_IRQL_requires_max_(APC_LEVEL)
FORCEINLINE
VOID
NTAPI
FsRtlSetupAdvancedHeader(
_In_ PVOID AdvHdr,
_In_ PFAST_MUTEX FMutex )
{
PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr;
localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER;
localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS;
#if (NTDDI_VERSION >= NTDDI_VISTA)
localAdvHdr->Version = FSRTL_FCB_HEADER_V1;
#else
localAdvHdr->Version = FSRTL_FCB_HEADER_V0;
#endif
InitializeListHead( &localAdvHdr->FilterContexts );
if (FMutex != NULL) {
localAdvHdr->FastMutex = FMutex;
}
#if (NTDDI_VERSION >= NTDDI_VISTA)
*((PULONG_PTR)(&localAdvHdr->PushLock)) = 0;
localAdvHdr->FileContextSupportPointer = NULL;
#endif
}
#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \
((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst))
#define FsRtlCompleteRequest(IRP, STATUS) { \
(IRP)->IoStatus.Status = (STATUS); \
IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
}
$endif (_NTIFS_)