4 #define FsRtlEnterFileSystem KeEnterCriticalRegion
5 #define FsRtlExitFileSystem KeLeaveCriticalRegion
7 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13 IN PFILE_OBJECT FileObject
,
14 IN PLARGE_INTEGER FileOffset
,
19 OUT PIO_STATUS_BLOCK IoStatus
,
20 IN PDEVICE_OBJECT DeviceObject
);
26 IN PFILE_OBJECT FileObject
,
27 IN PLARGE_INTEGER FileOffset
,
32 OUT PIO_STATUS_BLOCK IoStatus
,
33 IN PDEVICE_OBJECT DeviceObject
);
39 IN PFILE_OBJECT FileObject
,
40 IN PLARGE_INTEGER FileOffset
,
44 OUT PIO_STATUS_BLOCK IoStatus
,
45 IN PDEVICE_OBJECT DeviceObject OPTIONAL
);
50 FsRtlMdlReadCompleteDev(
51 IN PFILE_OBJECT FileObject
,
53 IN PDEVICE_OBJECT DeviceObject OPTIONAL
);
58 FsRtlPrepareMdlWriteDev(
59 IN PFILE_OBJECT FileObject
,
60 IN PLARGE_INTEGER FileOffset
,
64 OUT PIO_STATUS_BLOCK IoStatus
,
65 IN PDEVICE_OBJECT DeviceObject
);
70 FsRtlMdlWriteCompleteDev(
71 IN PFILE_OBJECT FileObject
,
72 IN PLARGE_INTEGER FileOffset
,
74 IN PDEVICE_OBJECT DeviceObject
);
79 FsRtlAcquireFileExclusive(
80 IN PFILE_OBJECT FileObject
);
86 IN PFILE_OBJECT FileObject
);
92 IN PFILE_OBJECT FileObject
,
93 OUT PLARGE_INTEGER FileSize
);
98 FsRtlIsTotalDeviceFailure(
104 FsRtlAllocateFileLock(
105 IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL
,
106 IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL
);
112 IN PFILE_LOCK FileLock
);
117 FsRtlInitializeFileLock(
118 IN PFILE_LOCK FileLock
,
119 IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL
,
120 IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL
);
125 FsRtlUninitializeFileLock(
126 IN PFILE_LOCK FileLock
);
129 FsRtlProcessFileLock:
132 -STATUS_INVALID_DEVICE_REQUEST
133 -STATUS_RANGE_NOT_LOCKED from unlock routines.
134 -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
135 (redirected IoStatus->Status).
138 -switch ( Irp->CurrentStackLocation->MinorFunction )
139 lock: return FsRtlPrivateLock;
140 unlocksingle: return FsRtlFastUnlockSingle;
141 unlockall: return FsRtlFastUnlockAll;
142 unlockallbykey: return FsRtlFastUnlockAllByKey;
143 default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
144 return STATUS_INVALID_DEVICE_REQUEST;
146 -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
147 -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
152 FsRtlProcessFileLock(
153 IN PFILE_LOCK FileLock
,
155 IN PVOID Context OPTIONAL
);
158 FsRtlCheckLockForReadAccess:
160 All this really does is pick out the lock parameters from the irp (io stack
161 location?), get IoGetRequestorProcess, and pass values on to
162 FsRtlFastCheckLockForRead.
167 FsRtlCheckLockForReadAccess(
168 IN PFILE_LOCK FileLock
,
172 FsRtlCheckLockForWriteAccess:
174 All this really does is pick out the lock parameters from the irp (io stack
175 location?), get IoGetRequestorProcess, and pass values on to
176 FsRtlFastCheckLockForWrite.
181 FsRtlCheckLockForWriteAccess(
182 IN PFILE_LOCK FileLock
,
188 FsRtlFastCheckLockForRead(
189 IN PFILE_LOCK FileLock
,
190 IN PLARGE_INTEGER FileOffset
,
191 IN PLARGE_INTEGER Length
,
193 IN PFILE_OBJECT FileObject
,
199 FsRtlFastCheckLockForWrite(
200 IN PFILE_LOCK FileLock
,
201 IN PLARGE_INTEGER FileOffset
,
202 IN PLARGE_INTEGER Length
,
204 IN PFILE_OBJECT FileObject
,
208 FsRtlGetNextFileLock:
210 ret: NULL if no more locks
213 FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
214 FileLock->LastReturnedLock as storage.
215 LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
216 list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
217 calls with Restart = FALSE.
222 FsRtlGetNextFileLock(
223 IN PFILE_LOCK FileLock
,
229 FsRtlFastUnlockSingle(
230 IN PFILE_LOCK FileLock
,
231 IN PFILE_OBJECT FileObject
,
232 IN PLARGE_INTEGER FileOffset
,
233 IN PLARGE_INTEGER Length
,
234 IN PEPROCESS Process
,
236 IN PVOID Context OPTIONAL
,
237 IN BOOLEAN AlreadySynchronized
);
243 IN PFILE_LOCK FileLock
,
244 IN PFILE_OBJECT FileObject
,
245 IN PEPROCESS Process
,
246 IN PVOID Context OPTIONAL
);
251 FsRtlFastUnlockAllByKey(
252 IN PFILE_LOCK FileLock
,
253 IN PFILE_OBJECT FileObject
,
254 IN PEPROCESS Process
,
256 IN PVOID Context OPTIONAL
);
261 ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED
264 -Calls IoCompleteRequest if Irp
265 -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
271 IN PFILE_LOCK FileLock
,
272 IN PFILE_OBJECT FileObject
,
273 IN PLARGE_INTEGER FileOffset
,
274 IN PLARGE_INTEGER Length
,
275 IN PEPROCESS Process
,
277 IN BOOLEAN FailImmediately
,
278 IN BOOLEAN ExclusiveLock
,
279 OUT PIO_STATUS_BLOCK IoStatus
,
280 IN PIRP Irp OPTIONAL
,
282 IN BOOLEAN AlreadySynchronized
);
287 FsRtlInitializeTunnelCache(
293 FsRtlAddToTunnelCache(
295 IN ULONGLONG DirectoryKey
,
296 IN PUNICODE_STRING ShortName
,
297 IN PUNICODE_STRING LongName
,
298 IN BOOLEAN KeyByShortName
,
305 FsRtlFindInTunnelCache(
307 IN ULONGLONG DirectoryKey
,
308 IN PUNICODE_STRING Name
,
309 OUT PUNICODE_STRING ShortName
,
310 OUT PUNICODE_STRING LongName
,
311 IN OUT PULONG DataLength
,
317 FsRtlDeleteKeyFromTunnelCache(
319 IN ULONGLONG DirectoryKey
);
324 FsRtlDeleteTunnelCache(
332 OUT PANSI_STRING FirstPart
,
333 OUT PANSI_STRING RemainingPart
);
338 FsRtlDoesDbcsContainWildCards(
339 IN PANSI_STRING Name
);
344 FsRtlIsDbcsInExpression(
345 IN PANSI_STRING Expression
,
346 IN PANSI_STRING Name
);
352 IN ANSI_STRING DbcsName
,
353 IN BOOLEAN WildCardsPermissible
,
354 IN BOOLEAN PathNamePermissible
,
355 IN BOOLEAN LeadingBackslashPermissible
);
360 FsRtlIsHpfsDbcsLegal(
361 IN ANSI_STRING DbcsName
,
362 IN BOOLEAN WildCardsPermissible
,
363 IN BOOLEAN PathNamePermissible
,
364 IN BOOLEAN LeadingBackslashPermissible
);
369 FsRtlNormalizeNtstatus(
370 IN NTSTATUS Exception
,
371 IN NTSTATUS GenericException
);
376 FsRtlIsNtstatusExpected(
377 IN NTSTATUS Ntstatus
);
382 FsRtlAllocateResource(
388 FsRtlInitializeLargeMcb(
390 IN POOL_TYPE PoolType
);
395 FsRtlUninitializeLargeMcb(
403 IN BOOLEAN SelfSynchronized
);
408 FsRtlTruncateLargeMcb(
415 FsRtlAddLargeMcbEntry(
419 IN LONGLONG SectorCount
);
424 FsRtlRemoveLargeMcbEntry(
427 IN LONGLONG SectorCount
);
432 FsRtlLookupLargeMcbEntry(
435 OUT PLONGLONG Lbn OPTIONAL
,
436 OUT PLONGLONG SectorCountFromLbn OPTIONAL
,
437 OUT PLONGLONG StartingLbn OPTIONAL
,
438 OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL
,
439 OUT PULONG Index OPTIONAL
);
444 FsRtlLookupLastLargeMcbEntry(
452 FsRtlLookupLastLargeMcbEntryAndIndex(
453 IN PLARGE_MCB OpaqueMcb
,
454 OUT PLONGLONG LargeVbn
,
455 OUT PLONGLONG LargeLbn
,
461 FsRtlNumberOfRunsInLargeMcb(
467 FsRtlGetNextLargeMcbEntry(
472 OUT PLONGLONG SectorCount
);
487 IN POOL_TYPE PoolType
);
492 FsRtlUninitializeMcb(
509 IN ULONG SectorCount
);
517 IN ULONG SectorCount
);
526 OUT PULONG SectorCount OPTIONAL
,
532 FsRtlLookupLastMcbEntry(
540 FsRtlNumberOfRunsInMcb(
546 FsRtlGetNextMcbEntry(
551 OUT PULONG SectorCount
);
557 IN PDEVICE_OBJECT TargetDevice
);
562 FsRtlInitializeOplock(
563 IN OUT POPLOCK Oplock
);
568 FsRtlUninitializeOplock(
569 IN OUT POPLOCK Oplock
);
586 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL
,
587 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL
);
592 FsRtlOplockIsFastIoPossible(
598 FsRtlCurrentBatchOplock(
604 FsRtlNotifyVolumeEvent(
605 IN PFILE_OBJECT FileObject
,
611 FsRtlNotifyInitializeSync(
612 IN PNOTIFY_SYNC
*NotifySync
);
617 FsRtlNotifyUninitializeSync(
618 IN PNOTIFY_SYNC
*NotifySync
);
623 FsRtlNotifyFullChangeDirectory(
624 IN PNOTIFY_SYNC NotifySync
,
625 IN PLIST_ENTRY NotifyList
,
627 IN PSTRING FullDirectoryName
,
628 IN BOOLEAN WatchTree
,
629 IN BOOLEAN IgnoreBuffer
,
630 IN ULONG CompletionFilter
,
631 IN PIRP NotifyIrp OPTIONAL
,
632 IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL
,
633 IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL
);
638 FsRtlNotifyFilterReportChange(
639 IN PNOTIFY_SYNC NotifySync
,
640 IN PLIST_ENTRY NotifyList
,
641 IN PSTRING FullTargetName
,
642 IN USHORT TargetNameOffset
,
643 IN PSTRING StreamName OPTIONAL
,
644 IN PSTRING NormalizedParentName OPTIONAL
,
645 IN ULONG FilterMatch
,
647 IN PVOID TargetContext OPTIONAL
,
648 IN PVOID FilterContext OPTIONAL
);
653 FsRtlNotifyFullReportChange(
654 IN PNOTIFY_SYNC NotifySync
,
655 IN PLIST_ENTRY NotifyList
,
656 IN PSTRING FullTargetName
,
657 IN USHORT TargetNameOffset
,
658 IN PSTRING StreamName OPTIONAL
,
659 IN PSTRING NormalizedParentName OPTIONAL
,
660 IN ULONG FilterMatch
,
662 IN PVOID TargetContext OPTIONAL
);
668 IN PNOTIFY_SYNC NotifySync
,
669 IN PLIST_ENTRY NotifyList
,
676 IN UNICODE_STRING Name
,
677 OUT PUNICODE_STRING FirstPart
,
678 OUT PUNICODE_STRING RemainingPart
);
683 FsRtlDoesNameContainWildCards(
684 IN PUNICODE_STRING Name
);
690 IN PCUNICODE_STRING Name1
,
691 IN PCUNICODE_STRING Name2
,
692 IN BOOLEAN IgnoreCase
,
693 IN PCWCH UpcaseTable OPTIONAL
);
698 FsRtlIsNameInExpression(
699 IN PUNICODE_STRING Expression
,
700 IN PUNICODE_STRING Name
,
701 IN BOOLEAN IgnoreCase
,
702 IN PWCHAR UpcaseTable OPTIONAL
);
707 FsRtlPostPagingFileStackOverflow(
710 IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine
);
715 FsRtlPostStackOverflow (
718 IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine
);
723 FsRtlRegisterUncProvider(
724 OUT PHANDLE MupHandle
,
725 IN PUNICODE_STRING RedirectorDeviceName
,
726 IN BOOLEAN MailslotsSupported
);
731 FsRtlDeregisterUncProvider(
737 FsRtlTeardownPerStreamContexts(
738 IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader
);
743 FsRtlCreateSectionForDataScan(
744 OUT PHANDLE SectionHandle
,
745 OUT PVOID
*SectionObject
,
746 OUT PLARGE_INTEGER SectionFileSize OPTIONAL
,
747 IN PFILE_OBJECT FileObject
,
748 IN ACCESS_MASK DesiredAccess
,
749 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
750 IN PLARGE_INTEGER MaximumSize OPTIONAL
,
751 IN ULONG SectionPageProtection
,
752 IN ULONG AllocationAttributes
,
755 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
757 #if (NTDDI_VERSION >= NTDDI_WINXP)
762 FsRtlNotifyFilterChangeDirectory(
763 IN PNOTIFY_SYNC NotifySync
,
764 IN PLIST_ENTRY NotifyList
,
766 IN PSTRING FullDirectoryName
,
767 IN BOOLEAN WatchTree
,
768 IN BOOLEAN IgnoreBuffer
,
769 IN ULONG CompletionFilter
,
770 IN PIRP NotifyIrp OPTIONAL
,
771 IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL
,
772 IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL
,
773 IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL
);
778 FsRtlInsertPerStreamContext(
779 IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext
,
780 IN PFSRTL_PER_STREAM_CONTEXT Ptr
);
783 PFSRTL_PER_STREAM_CONTEXT
785 FsRtlLookupPerStreamContextInternal(
786 IN PFSRTL_ADVANCED_FCB_HEADER StreamContext
,
787 IN PVOID OwnerId OPTIONAL
,
788 IN PVOID InstanceId OPTIONAL
);
791 PFSRTL_PER_STREAM_CONTEXT
793 FsRtlRemovePerStreamContext(
794 IN PFSRTL_ADVANCED_FCB_HEADER StreamContext
,
795 IN PVOID OwnerId OPTIONAL
,
796 IN PVOID InstanceId OPTIONAL
);
801 FsRtlIncrementCcFastReadNotPossible(
807 FsRtlIncrementCcFastReadWait(
813 FsRtlIncrementCcFastReadNoWait(
819 FsRtlIncrementCcFastReadResourceMiss(
826 IN PFILE_OBJECT FileObject
);
828 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
830 #if (NTDDI_VERSION >= NTDDI_WS03)
835 FsRtlInitializeBaseMcb(
837 IN POOL_TYPE PoolType
);
842 FsRtlUninitializeBaseMcb(
854 FsRtlTruncateBaseMcb(
861 FsRtlAddBaseMcbEntry(
865 IN LONGLONG SectorCount
);
870 FsRtlRemoveBaseMcbEntry(
873 IN LONGLONG SectorCount
);
878 FsRtlLookupBaseMcbEntry(
881 OUT PLONGLONG Lbn OPTIONAL
,
882 OUT PLONGLONG SectorCountFromLbn OPTIONAL
,
883 OUT PLONGLONG StartingLbn OPTIONAL
,
884 OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL
,
885 OUT PULONG Index OPTIONAL
);
890 FsRtlLookupLastBaseMcbEntry(
898 FsRtlLookupLastBaseMcbEntryAndIndex(
899 IN PBASE_MCB OpaqueMcb
,
900 IN OUT PLONGLONG LargeVbn
,
901 IN OUT PLONGLONG LargeLbn
,
902 IN OUT PULONG Index
);
907 FsRtlNumberOfRunsInBaseMcb(
913 FsRtlGetNextBaseMcbEntry(
918 OUT PLONGLONG SectorCount
);
928 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
930 #if (NTDDI_VERSION >= NTDDI_VISTA)
934 FsRtlInitializeBaseMcbEx(
936 IN POOL_TYPE PoolType
,
941 FsRtlAddBaseMcbEntryEx(
945 IN LONGLONG SectorCount
);
956 FsRtlOplockBreakToNone(
957 IN OUT POPLOCK Oplock
,
958 IN PIO_STACK_LOCATION IrpSp OPTIONAL
,
960 IN PVOID Context OPTIONAL
,
961 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL
,
962 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL
);
967 FsRtlNotifyVolumeEventEx(
968 IN PFILE_OBJECT FileObject
,
970 IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event
);
975 FsRtlNotifyCleanupAll(
976 IN PNOTIFY_SYNC NotifySync
,
977 IN PLIST_ENTRY NotifyList
);
981 FsRtlRegisterUncProviderEx(
982 OUT PHANDLE MupHandle
,
983 IN PUNICODE_STRING RedirDevName
,
984 IN PDEVICE_OBJECT DeviceObject
,
990 FsRtlCancellableWaitForSingleObject(
992 IN PLARGE_INTEGER Timeout OPTIONAL
,
993 IN PIRP Irp OPTIONAL
);
998 FsRtlCancellableWaitForMultipleObjects(
1000 IN PVOID ObjectArray
[],
1001 IN WAIT_TYPE WaitType
,
1002 IN PLARGE_INTEGER Timeout OPTIONAL
,
1003 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
,
1004 IN PIRP Irp OPTIONAL
);
1009 FsRtlMupGetProviderInfoFromFileObject(
1010 IN PFILE_OBJECT pFileObject
,
1013 IN OUT PULONG pBufferSize
);
1018 FsRtlMupGetProviderIdFromName(
1019 IN PUNICODE_STRING pProviderName
,
1020 OUT PULONG32 pProviderId
);
1025 FsRtlIncrementCcFastMdlReadWait(
1031 FsRtlValidateReparsePointBuffer(
1032 IN ULONG BufferLength
,
1033 IN PREPARSE_DATA_BUFFER ReparseBuffer
);
1038 FsRtlRemoveDotsFromPath(
1039 IN OUT PWSTR OriginalString
,
1040 IN USHORT PathLength
,
1041 OUT USHORT
*NewLength
);
1046 FsRtlAllocateExtraCreateParameterList(
1047 IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags
,
1048 OUT PECP_LIST
*EcpList
);
1053 FsRtlFreeExtraCreateParameterList(
1054 IN PECP_LIST EcpList
);
1059 FsRtlAllocateExtraCreateParameter(
1061 IN ULONG SizeOfContext
,
1062 IN FSRTL_ALLOCATE_ECP_FLAGS Flags
,
1063 IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL
,
1065 OUT PVOID
*EcpContext
);
1070 FsRtlFreeExtraCreateParameter(
1071 IN PVOID EcpContext
);
1076 FsRtlInitExtraCreateParameterLookasideList(
1077 IN OUT PVOID Lookaside
,
1078 IN FSRTL_ECP_LOOKASIDE_FLAGS Flags
,
1084 FsRtlDeleteExtraCreateParameterLookasideList(
1085 IN OUT PVOID Lookaside
,
1086 IN FSRTL_ECP_LOOKASIDE_FLAGS Flags
);
1091 FsRtlAllocateExtraCreateParameterFromLookasideList(
1093 IN ULONG SizeOfContext
,
1094 IN FSRTL_ALLOCATE_ECP_FLAGS Flags
,
1095 IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL
,
1096 IN OUT PVOID LookasideList
,
1097 OUT PVOID
*EcpContext
);
1102 FsRtlInsertExtraCreateParameter(
1103 IN OUT PECP_LIST EcpList
,
1104 IN OUT PVOID EcpContext
);
1109 FsRtlFindExtraCreateParameter(
1110 IN PECP_LIST EcpList
,
1112 OUT PVOID
*EcpContext OPTIONAL
,
1113 OUT ULONG
*EcpContextSize OPTIONAL
);
1118 FsRtlRemoveExtraCreateParameter(
1119 IN OUT PECP_LIST EcpList
,
1121 OUT PVOID
*EcpContext
,
1122 OUT ULONG
*EcpContextSize OPTIONAL
);
1127 FsRtlGetEcpListFromIrp(
1129 OUT PECP_LIST
*EcpList OPTIONAL
);
1134 FsRtlSetEcpListIntoIrp(
1136 IN PECP_LIST EcpList
);
1141 FsRtlGetNextExtraCreateParameter(
1142 IN PECP_LIST EcpList
,
1143 IN PVOID CurrentEcpContext OPTIONAL
,
1144 OUT LPGUID NextEcpType OPTIONAL
,
1145 OUT PVOID
*NextEcpContext OPTIONAL
,
1146 OUT ULONG
*NextEcpContextSize OPTIONAL
);
1151 FsRtlAcknowledgeEcp(
1152 IN PVOID EcpContext
);
1157 FsRtlIsEcpAcknowledged(
1158 IN PVOID EcpContext
);
1163 FsRtlIsEcpFromUserMode(
1164 IN PVOID EcpContext
);
1169 FsRtlChangeBackingFileObject(
1170 IN PFILE_OBJECT CurrentFileObject OPTIONAL
,
1171 IN PFILE_OBJECT NewFileObject
,
1172 IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType
,
1178 FsRtlLogCcFlushError(
1179 IN PUNICODE_STRING FileName
,
1180 IN PDEVICE_OBJECT DeviceObject
,
1181 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
1182 IN NTSTATUS FlushError
,
1188 FsRtlAreVolumeStartupApplicationsComplete(
1194 FsRtlQueryMaximumVirtualDiskNestingLevel(
1200 FsRtlGetVirtualDiskNestingLevel(
1201 IN PDEVICE_OBJECT DeviceObject
,
1202 OUT PULONG NestingLevel
,
1203 OUT PULONG NestingFlags OPTIONAL
);
1205 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1207 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1215 IN PVOID Context OPTIONAL
,
1216 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL
,
1217 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL
);
1221 #if (NTDDI_VERSION >= NTDDI_WIN7)
1226 FsRtlAreThereCurrentOrInProgressFileLocks(
1227 IN PFILE_LOCK FileLock
);
1232 FsRtlOplockIsSharedRequest(
1242 IN PVOID Context OPTIONAL
,
1243 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL
,
1244 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL
);
1249 FsRtlCurrentOplockH(
1255 FsRtlOplockBreakToNoneEx(
1256 IN OUT POPLOCK Oplock
,
1259 IN PVOID Context OPTIONAL
,
1260 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL
,
1261 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL
);
1266 FsRtlOplockFsctrlEx(
1275 FsRtlOplockKeysEqual(
1276 IN PFILE_OBJECT Fo1 OPTIONAL
,
1277 IN PFILE_OBJECT Fo2 OPTIONAL
);
1282 FsRtlInitializeExtraCreateParameterList(
1283 IN OUT PECP_LIST EcpList
);
1288 FsRtlInitializeExtraCreateParameter(
1291 IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL
,
1294 IN PVOID ListAllocatedFrom OPTIONAL
);
1296 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1301 FsRtlInsertPerFileContext(
1302 IN PVOID
* PerFileContextPointer
,
1303 IN PFSRTL_PER_FILE_CONTEXT Ptr
);
1306 PFSRTL_PER_FILE_CONTEXT
1308 FsRtlLookupPerFileContext(
1309 IN PVOID
* PerFileContextPointer
,
1310 IN PVOID OwnerId OPTIONAL
,
1311 IN PVOID InstanceId OPTIONAL
);
1314 PFSRTL_PER_FILE_CONTEXT
1316 FsRtlRemovePerFileContext(
1317 IN PVOID
* PerFileContextPointer
,
1318 IN PVOID OwnerId OPTIONAL
,
1319 IN PVOID InstanceId OPTIONAL
);
1324 FsRtlTeardownPerFileContexts(
1325 IN PVOID
* PerFileContextPointer
);
1330 FsRtlInsertPerFileObjectContext(
1331 IN PFILE_OBJECT FileObject
,
1332 IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr
);
1335 PFSRTL_PER_FILEOBJECT_CONTEXT
1337 FsRtlLookupPerFileObjectContext(
1338 IN PFILE_OBJECT FileObject
,
1339 IN PVOID OwnerId OPTIONAL
,
1340 IN PVOID InstanceId OPTIONAL
);
1343 PFSRTL_PER_FILEOBJECT_CONTEXT
1345 FsRtlRemovePerFileObjectContext(
1346 IN PFILE_OBJECT FileObject
,
1347 IN PVOID OwnerId OPTIONAL
,
1348 IN PVOID InstanceId OPTIONAL
);
1350 #define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \
1351 FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \
1354 #define FsRtlAreThereCurrentFileLocks(FL) ( \
1355 ((FL)->FastIoIsQuestionable) \
1358 #define FsRtlIncrementLockRequestsInProgress(FL) { \
1359 ASSERT( (FL)->LockRequestsInProgress >= 0 ); \
1361 (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
1364 #define FsRtlDecrementLockRequestsInProgress(FL) { \
1365 ASSERT( (FL)->LockRequestsInProgress > 0 ); \
1367 (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
1370 /* GCC compatible definition, MS one is retarded */
1371 extern NTKERNELAPI
const UCHAR
* const FsRtlLegalAnsiCharacterArray
;
1372 #define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray
1374 #define FsRtlIsAnsiCharacterWild(C) ( \
1375 FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \
1378 #define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \
1379 FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \
1380 ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \
1383 #define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \
1384 FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \
1385 ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \
1388 #define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \
1389 FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \
1390 ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \
1393 #define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \
1394 FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \
1397 #define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \
1398 FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \
1401 #define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \
1402 ((SCHAR)(C) < 0) ? DEFAULT_RET : \
1403 FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \
1405 ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \
1408 #define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \
1409 (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \
1410 (NLS_MB_CODE_PAGE_TAG && \
1411 (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \
1414 #define FsRtlIsUnicodeCharacterWild(C) ( \
1417 FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \
1420 #define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \
1421 ((_fc)->OwnerId = (_owner), \
1422 (_fc)->InstanceId = (_inst), \
1423 (_fc)->FreeCallback = (_cb))
1425 #define FsRtlGetPerFileContextPointer(_fo) \
1426 (FsRtlSupportsPerFileContexts(_fo) ? \
1427 FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \
1430 #define FsRtlSupportsPerFileContexts(_fo) \
1431 ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \
1432 (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \
1433 (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL))
1435 #define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \
1437 FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \
1438 if ((_fctxptr) != NULL) { \
1439 (_advhdr)->FileContextSupportPointer = (_fctxptr); \
1443 #define FsRtlGetPerStreamContextPointer(FO) ( \
1444 (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \
1447 #define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \
1448 (PSC)->OwnerId = (O), \
1449 (PSC)->InstanceId = (I), \
1450 (PSC)->FreeCallback = (FC) \
1453 #define FsRtlSupportsPerStreamContexts(FO) ( \
1454 (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \
1455 FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \
1456 FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \
1459 #define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \
1460 (((NULL != (_sc)) && \
1461 FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \
1462 !IsListEmpty(&(_sc)->FilterContexts)) ? \
1463 FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \
1469 FsRtlSetupAdvancedHeader(
1471 IN PFAST_MUTEX FMutex
)
1473 PFSRTL_ADVANCED_FCB_HEADER localAdvHdr
= (PFSRTL_ADVANCED_FCB_HEADER
)AdvHdr
;
1475 localAdvHdr
->Flags
|= FSRTL_FLAG_ADVANCED_HEADER
;
1476 localAdvHdr
->Flags2
|= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS
;
1477 #if (NTDDI_VERSION >= NTDDI_VISTA)
1478 localAdvHdr
->Version
= FSRTL_FCB_HEADER_V1
;
1480 localAdvHdr
->Version
= FSRTL_FCB_HEADER_V0
;
1482 InitializeListHead( &localAdvHdr
->FilterContexts
);
1483 if (FMutex
!= NULL
) {
1484 localAdvHdr
->FastMutex
= FMutex
;
1486 #if (NTDDI_VERSION >= NTDDI_VISTA)
1487 *((PULONG_PTR
)(&localAdvHdr
->PushLock
)) = 0;
1488 localAdvHdr
->FileContextSupportPointer
= NULL
;
1492 #define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \
1493 ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst))
1495 #define FsRtlCompleteRequest(IRP,STATUS) { \
1496 (IRP)->IoStatus.Status = (STATUS); \
1497 IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \