49 _In_ PFLT_CALLBACK_DATA
Request,
50 _Out_ PNC_NOTIFY_REQUEST_CONTEXT * NotifyRequestContext
55 _In_ PNC_NOTIFY_REQUEST_CONTEXT NotifyRequestContext
58 FLT_POSTOP_CALLBACK_STATUS
60 _Inout_ PFLT_CALLBACK_DATA Data,
61 _In_ PCFLT_RELATED_OBJECTS FltObjects,
62 _In_ PVOID CompletionContext,
63 _In_ FLT_POST_OPERATION_FLAGS Flags
68 _Inout_ PFLT_CALLBACK_DATA Data,
69 _In_ PVOID CompletionContext
75 _In_ BOOLEAN IgnoreCase,
76 _In_ PUNICODE_STRING UserRequestName,
77 _In_ PUNICODE_STRING OpenedName,
78 _In_reads_bytes_(InputBufferLength) PFILE_NOTIFY_INFORMATION InputSystemBuffer,
79 _Out_writes_bytes_to_(OutputBufferLength, *OutputBufferWritten) PFILE_NOTIFY_INFORMATION OutputUserBuffer,
80 _In_ ULONG InputBufferLength,
81 _In_ ULONG OutputBufferLength,
82 _Out_ PULONG InputBufferConsumed,
83 _Out_ PULONG OutputBufferWritten,
84 _In_ BOOLEAN ReturnRealMappingPaths,
85 _In_ BOOLEAN ReturnInMappingOnly
92 _In_ PFLT_CALLBACK_DATA PrimaryRequest,
97 _Out_ PFLT_CALLBACK_DATA * SubRequest,
98 _Out_ PNC_NOTIFY_REQUEST_CONTEXT * NotifyRequestContext
103 _In_ PFLT_CALLBACK_DATA SubRequest
108 _Inout_ PFLT_CALLBACK_DATA Data,
109 _Outptr_result_bytebuffer_maybenull_(*BufferSize) PVOID * DestBuffer,
110 _Out_ PULONG BufferSize
122 _Inout_ PBOOLEAN LockHeld
127 _In_ PFLT_CALLBACK_DATA Data
132 _In_ PFLT_GENERIC_WORKITEM WorkItem,
133 _In_ PFLT_FILTER Filter,
139 _In_ PFLT_GENERIC_WORKITEM WorkItem,
140 _In_ PFLT_FILTER Filter,
141 _In_ PVOID RequestPtr
145 #pragma alloc_text(PAGE, NcAllocateNotifyRequestContext) 146 #pragma alloc_text(PAGE, NcBuildSubNotifyRequest) 147 #pragma alloc_text(PAGE, NcCleanupSubNotifyRequest) 148 #pragma alloc_text(PAGE, NcCloseHandleWorkerRoutine) 149 #pragma alloc_text(PAGE, NcDirNotifyTranslateBuffers) 150 #pragma alloc_text(PAGE, NcFreeNotifyRequestContext) 151 #pragma alloc_text(PAGE, NcGetDestinationNotifyBuffer) 152 #pragma alloc_text(PAGE, NcNotifyAbort) 153 #pragma alloc_text(PAGE, NcNotifyCancelCallback) 154 #pragma alloc_text(PAGE, NcPreNotifyDirectory) 155 #pragma alloc_text(PAGE, NcPostNotifyDirectorySafe) 156 #pragma alloc_text(PAGE, NcPostNotifyDirectoryReal) 157 #pragma alloc_text(PAGE, NcReissueNotifyRequestWorkerRoutine) 158 #pragma alloc_text(PAGE, NcStreamHandleContextNotCleanup) 159 #pragma alloc_text(PAGE, NcStreamHandleContextNotCreate) 160 #pragma alloc_text(PAGE, NcStreamHandleContextNotClose) 163 #define NcRemoveTrailingSlashIfPresent( US ) \ 164 FLT_ASSERT( (US)->Length > 0 ); \ 165 if ( (US)->Buffer[(US)->Length/sizeof(WCHAR) - 1] == NC_SEPARATOR) { \ 166 (US)->Length -= sizeof(WCHAR); \ 173 _In_ BOOLEAN IgnoreCase,
174 _In_ PUNICODE_STRING UserRequestName,
175 _In_ PUNICODE_STRING OpenedName,
176 _In_reads_bytes_(InputBufferLength) PFILE_NOTIFY_INFORMATION InputSystemBuffer,
177 _Out_writes_bytes_to_(OutputBufferLength, *OutputBufferWritten) PFILE_NOTIFY_INFORMATION OutputUserBuffer,
178 _In_ ULONG InputBufferLength,
179 _In_ ULONG OutputBufferLength,
180 _Out_ PULONG InputBufferConsumed,
181 _Out_ PULONG OutputBufferWritten,
182 _In_ BOOLEAN ReturnRealMappingPaths,
183 _In_ BOOLEAN ReturnInMappingOnly
253 NTSTATUS Status = STATUS_SUCCESS;
263 PFILE_NOTIFY_INFORMATION SourceEntry =
NULL;
264 PFILE_NOTIFY_INFORMATION DestEntry =
NULL;
265 PFILE_NOTIFY_INFORMATION PrevDestEntry =
NULL;
274 UNICODE_STRING Remainder;
283 PUNICODE_STRING ReturnName;
291 SourceEntry = InputSystemBuffer;
292 DestEntry = OutputUserBuffer;
293 *InputBufferConsumed = 0;
294 *OutputBufferWritten = 0;
300 FLT_ASSERT( InputBufferLength && OutputBufferLength );
304 while (SourceEntry) {
314 EntryLength = OpenedName->Length +
317 if (EntryLength >= MAXUSHORT) {
319 Status = STATUS_OBJECT_PATH_INVALID;
320 goto NcDirNotifyTranslateBuffersCleanup;
323 Status = RtlULongAdd( EntryLength,
324 SourceEntry->FileNameLength,
327 if (!NT_SUCCESS( Status ) ||
328 (EntryLength >= MAXUSHORT)) {
330 Status = STATUS_OBJECT_PATH_INVALID;
331 goto NcDirNotifyTranslateBuffersCleanup;
338 Status = RtlULongAdd( *InputBufferConsumed,
339 FIELD_OFFSET(FILE_NOTIFY_INFORMATION, FileName),
342 if (NT_SUCCESS( Status )) {
344 Status = RtlULongAdd( UlongResult,
345 SourceEntry->FileNameLength,
349 if (!NT_SUCCESS( Status ) ||
350 (UlongResult > InputBufferLength)) {
362 Status = STATUS_INVALID_USER_BUFFER;
363 goto NcDirNotifyTranslateBuffersCleanup;
366 if (EntryLength > NameString.MaximumLength) {
368 if (NameString.Buffer !=
NULL) {
372 NameString.Buffer = ExAllocatePoolWithTag( PagedPool,
376 if (NameString.Buffer ==
NULL) {
378 Status = STATUS_INSUFFICIENT_RESOURCES;
379 goto NcDirNotifyTranslateBuffersCleanup;
382 NameString.MaximumLength = (USHORT)EntryLength;
385 _Analysis_assume_(NameString.Buffer !=
NULL);
388 OpenedName->Length );
390 NameString.Buffer[OpenedName->Length /
sizeof(WCHAR)] =
NC_SEPARATOR;
393 SourceEntry->FileName,
394 SourceEntry->FileNameLength );
396 NameString.Length = (USHORT)EntryLength;
403 &InstanceContext->Mapping.RealMapping,
409 if (RealOverlap.
InMapping && ReturnRealMappingPaths) {
419 Status = NcConstructPath( &InstanceContext->Mapping.UserMapping,
424 if (!NT_SUCCESS( Status )) {
425 goto NcDirNotifyTranslateBuffersCleanup;
428 ReturnName = &MungedName;
430 }
else if (ReturnInMappingOnly || RealOverlap.
InMapping) {
445 ReturnName = &NameString;
449 if (ReturnName !=
NULL) {
451 ULONG EntryLengthExact;
460 FLT_ASSERT( ReturnName->Length > UserRequestName->Length );
461 _Analysis_assume_( ReturnName->Length > UserRequestName->Length );
470 if (ReturnName->Length - UserRequestName->Length >
sizeof(WCHAR) &&
471 ReturnName->Buffer[ReturnName->Length/
sizeof(WCHAR) - 1] ==
NC_SEPARATOR) {
473 ReturnName->Length -=
sizeof(WCHAR);
476 EntryLengthExact = FIELD_OFFSET( FILE_NOTIFY_INFORMATION, FileName );
477 EntryLengthExact += (ReturnName->Length - UserRequestName->Length -
sizeof(WCHAR));
486 Status = RtlULongAdd( EntryLength,
487 *OutputBufferWritten,
490 if (!NT_SUCCESS( Status ) ||
491 (UlongResult > OutputBufferLength)) {
493 if (PrevDestEntry !=
NULL) {
494 PrevDestEntry->NextEntryOffset = 0;
507 DestEntry->FileNameLength = ReturnName->Length -
508 UserRequestName->Length -
512 Add2Ptr( ReturnName->Buffer, UserRequestName->Length +
sizeof(WCHAR)),
513 ReturnName->Length - UserRequestName->Length -
sizeof(WCHAR));
514 DestEntry->Action = SourceEntry->Action;
515 DestEntry->NextEntryOffset = EntryLength;
522 PrevDestEntry = DestEntry;
523 *OutputBufferWritten += EntryLength;
524 DestEntry =
Add2Ptr( DestEntry, EntryLength );
526 if (MungedName.Buffer !=
NULL) {
528 MungedName.Buffer =
NULL;
529 MungedName.MaximumLength = MungedName.Length = 0;
544 EntryLength = SourceEntry->NextEntryOffset;
546 PointerResult =
Add2Ptr( SourceEntry, EntryLength );
548 Status = RtlULongAdd( *InputBufferConsumed,
550 InputBufferConsumed );
560 if (!NT_SUCCESS( Status ) ||
561 (PointerResult < (PVOID)SourceEntry) ||
562 (PointerResult <
Add2Ptr( InputSystemBuffer,
sizeof(FILE_NOTIFY_INFORMATION) ))) {
566 Status = STATUS_INVALID_USER_BUFFER;
567 goto NcDirNotifyTranslateBuffersCleanup;
570 SourceEntry = (PFILE_NOTIFY_INFORMATION)PointerResult;
572 if ((EntryLength == 0)) {
574 if (PrevDestEntry !=
NULL) {
575 PrevDestEntry->NextEntryOffset = 0;
578 *InputBufferConsumed = InputBufferLength;
589 FLT_ASSERT( *InputBufferConsumed <= InputBufferLength );
591 if ((SourceEntry !=
NULL) &&
592 ((*InputBufferConsumed >= InputBufferLength) ||
593 (*InputBufferConsumed + FIELD_OFFSET( FILE_NOTIFY_INFORMATION, FileName ) > InputBufferLength))) {
602 *InputBufferConsumed = InputBufferLength;
609 Status = STATUS_INVALID_USER_BUFFER;
617 !NT_SUCCESS( Status ) ||
618 PrevDestEntry->NextEntryOffset == 0);
620 NcDirNotifyTranslateBuffersCleanup:
622 if (MungedName.Buffer !=
NULL) {
625 MungedName.Buffer =
NULL;
626 MungedName.MaximumLength = MungedName.Length = 0;
630 if (NameString.Buffer !=
NULL) {
643 _In_ PFLT_CALLBACK_DATA
Request,
644 _Out_ PNC_NOTIFY_REQUEST_CONTEXT * NotifyRequestContext
677 PNC_NOTIFY_REQUEST_CONTEXT RequestContext;
681 RequestContext = ExAllocatePoolWithTag( PagedPool,
685 if (RequestContext ==
NULL) {
686 return STATUS_INSUFFICIENT_RESOURCES;
689 FltReferenceContext( HandleContext );
692 if (ARGUMENT_PRESENT( FileObject )) {
694 ObReferenceObject( FileObject );
701 *NotifyRequestContext = RequestContext;
703 return STATUS_SUCCESS;
708 _In_ PNC_NOTIFY_REQUEST_CONTEXT NotifyRequestContext
731 FLT_ASSERT( ExIsResourceAcquiredSharedLite( NotifyRequestContext->UserHandleContext->Lock ) == 0 );
733 if (NotifyRequestContext->FileObjectToDereference) {
734 ObDereferenceObject( NotifyRequestContext->FileObjectToDereference );
737 FltReleaseContext( NotifyRequestContext->UserHandleContext );
739 ExFreePoolWithTag( NotifyRequestContext,
NC_TAG );
745 _In_ PFLT_CALLBACK_DATA PrimaryRequest,
750 _Out_ PFLT_CALLBACK_DATA * SubRequest,
751 _Out_ PNC_NOTIFY_REQUEST_CONTEXT * NotifyRequestContext
794 ULONG BufferLength = PrimaryRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.Length;
796 PFLT_CALLBACK_DATA NewRequest;
800 if (BufferLength > 0) {
809 Status = FltLockUserBuffer( PrimaryRequest );
811 if (!NT_SUCCESS( Status )) {
825 #pragma warning(suppress: 6014) 826 MyBuffer = ExAllocatePoolWithTag( PagedPool,
830 if (MyBuffer ==
NULL) {
832 Status = STATUS_INSUFFICIENT_RESOURCES;
841 Status = FltAllocateCallbackData( Instance,
845 if (!NT_SUCCESS( Status )) {
847 if (MyBuffer !=
NULL) {
848 ExFreePoolWithTag( MyBuffer,
NC_TAG );
856 NewRequest->Iopb->OperationFlags = PrimaryRequest->Iopb->OperationFlags;
857 NewRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.Length = BufferLength;
858 NewRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.DirectoryBuffer = MyBuffer;
859 NewRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.CompletionFilter =
860 PrimaryRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.CompletionFilter;
861 NewRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.Spare1 = 0;
862 NewRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.Spare2 = 0;
863 NewRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.MdlAddress =
NULL;
865 if (BufferLength > 0) {
867 NewRequest->Flags |= FLTFL_CALLBACK_DATA_SYSTEM_BUFFER;
879 NotifyRequestContext );
881 if (!NT_SUCCESS( Status )) {
887 *SubRequest = NewRequest;
888 return STATUS_SUCCESS;
893 _In_ PFLT_CALLBACK_DATA SubRequest
913 if (SubRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.DirectoryBuffer !=
NULL) {
915 ExFreePoolWithTag( SubRequest->Iopb->Parameters.DirectoryControl.NotifyDirectory.DirectoryBuffer,
919 FltFreeCallbackData( SubRequest );
924 _Inout_ PFLT_CALLBACK_DATA Data,
925 _Outptr_result_bytebuffer_maybenull_(*BufferSize) PVOID * DestBuffer,
926 _Out_ PULONG BufferSize
954 NTSTATUS Status = STATUS_SUCCESS;
957 *BufferSize = Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.Length;
966 if (Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.Length == 0) {
968 Status = STATUS_SUCCESS;
969 goto NcGetDestinationNotifyBufferCleanup;
983 if (Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.MdlAddress) {
985 Status = FltLockUserBuffer( Data );
987 if (!NT_SUCCESS( Status )) {
989 goto NcGetDestinationNotifyBufferCleanup;
992 *DestBuffer = MmGetSystemAddressForMdlSafe( Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.MdlAddress,
993 NormalPagePriority | MdlMappingNoExecute );
994 if (*DestBuffer ==
NULL) {
1002 Status = STATUS_NO_MEMORY;
1003 goto NcGetDestinationNotifyBufferCleanup;
1025 if (*DestBuffer ==
NULL) {
1027 *DestBuffer = Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.DirectoryBuffer;
1040 FLT_ASSERT( *DestBuffer > (PVOID)0x80000000 );
1046 if (Data->RequestorMode != KernelMode) {
1047 ProbeForWrite( *DestBuffer, *BufferSize,
sizeof( UCHAR ));
1052 Status = STATUS_INVALID_USER_BUFFER;
1060 NcGetDestinationNotifyBufferCleanup:
1066 FLT_PREOP_CALLBACK_STATUS
1068 _Inout_ PFLT_CALLBACK_DATA Data,
1069 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1070 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1116 FLT_PREOP_CALLBACK_STATUS ReturnValue;
1128 BOOLEAN WatchTree = BooleanFlagOn( Data->Iopb->OperationFlags, SL_WATCH_TREE );
1129 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
1130 FO_OPENED_CASE_SENSITIVE );
1131 BOOLEAN UnlockContext = FALSE;
1132 ULONG SizeWeReturn = 0;
1133 PNC_NOTIFY_REQUEST_CONTEXT ShadowRequestContext =
NULL;
1134 PNC_NOTIFY_REQUEST_CONTEXT MappingParentRequestContext =
NULL;
1135 PFLT_CALLBACK_DATA NewShadowRequest =
NULL;
1136 PFLT_CALLBACK_DATA NewMappingParentRequest =
NULL;
1149 if (
FlagOn( FltObjects->FileObject->Flags, FO_CLEANUP_COMPLETE )) {
1151 ReturnValue = FLT_PREOP_COMPLETE;
1152 Status = STATUS_NOTIFY_CLEANUP;
1155 goto NcPreNotifyDirectoryCleanup;
1162 Status = FltGetInstanceContext( FltObjects->Instance,
1165 if (!NT_SUCCESS( Status )) {
1167 ReturnValue = FLT_PREOP_COMPLETE;
1168 goto NcPreNotifyDirectoryCleanup;
1175 Status = NcGetFileNameInformation( Data,
1178 FLT_FILE_NAME_OPENED | FLT_FILE_NAME_QUERY_DEFAULT,
1179 &FileNameInformation );
1181 if (!NT_SUCCESS( Status )) {
1183 ReturnValue = FLT_PREOP_COMPLETE;
1184 goto NcPreNotifyDirectoryCleanup;
1187 Status = FltParseFileNameInformation( FileNameInformation );
1189 if (!NT_SUCCESS( Status )) {
1191 ReturnValue = FLT_PREOP_COMPLETE;
1192 goto NcPreNotifyDirectoryCleanup;
1221 Status = STATUS_SUCCESS;
1222 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1223 goto NcPreNotifyDirectoryCleanup;
1233 Status = STATUS_SUCCESS;
1234 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1235 goto NcPreNotifyDirectoryCleanup;
1246 Status = STATUS_SUCCESS;
1247 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1248 goto NcPreNotifyDirectoryCleanup;
1258 FltObjects->Instance,
1259 FltObjects->FileObject,
1262 if (!NT_SUCCESS( Status )) {
1264 ReturnValue = FLT_PREOP_COMPLETE;
1265 goto NcPreNotifyDirectoryCleanup;
1277 UnlockContext =
TRUE;
1287 FlagOn( FltObjects->FileObject->Flags, FO_CLEANUP_COMPLETE )) {
1289 ReturnValue = FLT_PREOP_COMPLETE;
1290 Status = STATUS_NOTIFY_CLEANUP;
1293 goto NcPreNotifyDirectoryCleanup;
1310 FileNameInformation->Name.Length,
1315 ReturnValue = FLT_PREOP_COMPLETE;
1316 Status = STATUS_INSUFFICIENT_RESOURCES;
1317 goto NcPreNotifyDirectoryCleanup;
1322 FileNameInformation->Name.Buffer,
1323 FileNameInformation->Name.Length );
1327 FileNameInformation->Name.Length;
1333 FltReferenceContext( InstanceContext );
1335 NotCtx->
CompletionFilter = Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.CompletionFilter;
1366 Status = STATUS_UNSUCCESSFUL;
1367 ReturnValue = FLT_PREOP_COMPLETE;
1368 goto NcPreNotifyDirectoryCleanup;
1380 Status = STATUS_NOTIFY_ENUM_DIR;
1381 ReturnValue = FLT_PREOP_COMPLETE;
1382 goto NcPreNotifyDirectoryCleanup;
1405 if (!NT_SUCCESS( Status )) {
1407 ReturnValue = FLT_PREOP_COMPLETE;
1408 goto NcPreNotifyDirectoryCleanup;
1416 if (BufferSize < NotCtx->BufferLength) {
1422 ReturnValue = FLT_PREOP_COMPLETE;
1423 Status = STATUS_NOTIFY_ENUM_DIR;
1424 goto NcPreNotifyDirectoryCleanup;
1436 Status = STATUS_INVALID_USER_BUFFER;
1437 goto NcPreNotifyDirectoryCleanup;
1446 ReturnValue = FLT_PREOP_COMPLETE;
1447 Status = STATUS_SUCCESS;
1449 goto NcPreNotifyDirectoryCleanup;
1463 (!WatchTree && RealOverlap.
Parent && !UserOverlap.
Parent)) {
1465 NotCtx->
Mode = Filter;
1480 FltObjects->Instance,
1481 FltObjects->FileObject,
1485 &ShadowRequestContext );
1487 if (!NT_SUCCESS( Status )) {
1489 ReturnValue = FLT_PREOP_COMPLETE;
1490 goto NcPreNotifyDirectoryCleanup;
1502 if (NewShadowRequest) {
1523 if (!NT_SUCCESS( Status )) {
1527 ReturnValue = FLT_PREOP_COMPLETE;
1528 goto NcPreNotifyDirectoryCleanup;
1533 UnlockContext = FALSE;
1545 ShadowRequestContext );
1554 ShadowRequestContext =
NULL;
1555 NewShadowRequest =
NULL;
1568 ReturnValue = FLT_PREOP_PENDING;
1592 Status = FltLockUserBuffer( Data );
1593 if (!NT_SUCCESS( Status )) {
1595 ReturnValue = FLT_PREOP_COMPLETE;
1596 goto NcPreNotifyDirectoryCleanup;
1599 if (MmGetSystemAddressForMdlSafe( Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.MdlAddress,
1600 NormalPagePriority | MdlMappingNoExecute ) ==
NULL) {
1602 Status = STATUS_NO_MEMORY;
1603 ReturnValue = FLT_PREOP_COMPLETE;
1604 goto NcPreNotifyDirectoryCleanup;
1613 FltObjects->FileObject,
1616 &ShadowRequestContext );
1618 if (!NT_SUCCESS( Status )) {
1620 ReturnValue = FLT_PREOP_COMPLETE;
1621 goto NcPreNotifyDirectoryCleanup;
1624 *CompletionContext = ShadowRequestContext;
1625 ShadowRequestContext =
NULL;
1632 ReturnValue = FLT_PREOP_SUCCESS_WITH_CALLBACK;
1634 NotCtx->
Mode = Munge;
1647 (!WatchTree && UserOverlap.
Parent && !RealOverlap.
Parent)) {
1656 OBJECT_ATTRIBUTES MappingParentAttributes;
1657 HANDLE MappingParentHandle =
NULL;
1658 PFILE_OBJECT MappingParentFileObject =
NULL;
1659 PWSTR MappingParentName;
1660 IO_STATUS_BLOCK MappingParentStatusBlock;
1661 PFLT_FILE_NAME_INFORMATION FileInfoInternalHandle =
NULL;
1662 PFLT_GENERIC_WORKITEM MappingParentWorkItem =
NULL;
1678 UnlockContext = FALSE;
1687 InitializeObjectAttributes( &MappingParentAttributes,
1689 OBJ_KERNEL_HANDLE | (IgnoreCase?OBJ_CASE_INSENSITIVE:0),
1694 FltObjects->Instance,
1695 &MappingParentHandle,
1696 &MappingParentFileObject,
1697 FILE_READ_ATTRIBUTES|FILE_TRAVERSE,
1698 &MappingParentAttributes,
1699 &MappingParentStatusBlock,
1701 FILE_ATTRIBUTE_NORMAL,
1704 FILE_DIRECTORY_FILE,
1707 IO_IGNORE_SHARE_ACCESS_CHECK,
1708 FltObjects->FileObject );
1710 if (!NT_SUCCESS( Status )) {
1718 FLT_ASSERT( Status != STATUS_OBJECT_PATH_NOT_FOUND &&
1719 Status != STATUS_OBJECT_NAME_NOT_FOUND );
1721 ReturnValue = FLT_PREOP_COMPLETE;
1722 goto NcPreNotifyDirectoryCleanup;
1726 Status = NcGetFileNameInformation(
NULL,
1727 MappingParentFileObject,
1728 FltObjects->Instance,
1729 FLT_FILE_NAME_OPENED |
1730 FLT_FILE_NAME_QUERY_DEFAULT |
1731 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
1732 &FileInfoInternalHandle );
1733 if (!NT_SUCCESS( Status )) {
1735 FltClose( MappingParentHandle );
1736 ObDereferenceObject( MappingParentFileObject );
1738 ReturnValue = FLT_PREOP_COMPLETE;
1739 goto NcPreNotifyDirectoryCleanup;
1742 Status = FltParseFileNameInformation( FileInfoInternalHandle );
1743 if (!NT_SUCCESS( Status )) {
1745 FltClose( MappingParentHandle );
1746 ObDereferenceObject( MappingParentFileObject );
1747 FltReleaseFileNameInformation( FileInfoInternalHandle );
1749 ReturnValue = FLT_PREOP_COMPLETE;
1750 goto NcPreNotifyDirectoryCleanup;
1753 MappingParentName = ExAllocatePoolWithTag( PagedPool,
1754 FileInfoInternalHandle->Name.Length,
1757 if (MappingParentName ==
NULL) {
1759 Status = STATUS_INSUFFICIENT_RESOURCES;
1761 FltClose( MappingParentHandle );
1762 ObDereferenceObject( MappingParentFileObject );
1763 FltReleaseFileNameInformation( FileInfoInternalHandle );
1765 ReturnValue = FLT_PREOP_COMPLETE;
1766 goto NcPreNotifyDirectoryCleanup;
1769 MappingParentWorkItem = FltAllocateGenericWorkItem();
1770 if (MappingParentWorkItem ==
NULL) {
1772 Status = STATUS_INSUFFICIENT_RESOURCES;
1774 FltClose( MappingParentHandle );
1775 ObDereferenceObject( MappingParentFileObject );
1776 FltReleaseFileNameInformation( FileInfoInternalHandle );
1777 ExFreePoolWithTag( MappingParentName,
NC_TAG );
1779 ReturnValue = FLT_PREOP_COMPLETE;
1780 goto NcPreNotifyDirectoryCleanup;
1785 UnlockContext =
TRUE;
1813 FileInfoInternalHandle->Name.Buffer,
1814 FileInfoInternalHandle->Name.Length );
1820 FltReleaseFileNameInformation( FileInfoInternalHandle );
1846 UnlockContext = FALSE;
1848 FltClose( MappingParentHandle );
1849 ObDereferenceObject( MappingParentFileObject );
1850 ExFreePoolWithTag( MappingParentName,
NC_TAG );
1851 FltReleaseFileNameInformation( FileInfoInternalHandle );
1852 FltFreeGenericWorkItem( MappingParentWorkItem );
1855 UnlockContext =
TRUE;
1870 ReturnValue = FLT_PREOP_PENDING;
1871 goto NcPreNotifyDirectoryCleanup;
1875 MappingParentHandle =
NULL;
1876 MappingParentFileObject =
NULL;
1877 MappingParentName =
NULL;
1915 NotCtx->
Mode = Merge;
1934 FltObjects->Instance,
1935 FltObjects->FileObject,
1939 &ShadowRequestContext );
1941 if (!NT_SUCCESS( Status )) {
1943 ReturnValue = FLT_PREOP_COMPLETE;
1944 goto NcPreNotifyDirectoryCleanup;
1952 FltObjects->Instance,
1956 &NewMappingParentRequest,
1957 &MappingParentRequestContext );
1959 if (!NT_SUCCESS( Status )) {
1961 ReturnValue = FLT_PREOP_COMPLETE;
1962 goto NcPreNotifyDirectoryCleanup;
1973 if (NewShadowRequest || NewMappingParentRequest) {
1977 if (NewShadowRequest) {
1981 if (NewMappingParentRequest) {
1992 if (!NT_SUCCESS( Status )) {
1994 ReturnValue = FLT_PREOP_COMPLETE;
1995 goto NcPreNotifyDirectoryCleanup;
2000 UnlockContext = FALSE;
2008 if (NewShadowRequest) {
2012 ShadowRequestContext );
2014 ShadowRequestContext =
NULL;
2015 NewShadowRequest =
NULL;
2023 if (!NT_SUCCESS( Status ) && NewMappingParentRequest) {
2026 UnlockContext =
TRUE;
2028 ReturnValue = FLT_PREOP_PENDING;
2029 goto NcPreNotifyDirectoryCleanup;
2034 if (NewMappingParentRequest) {
2038 MappingParentRequestContext );
2040 MappingParentRequestContext =
NULL;
2041 NewMappingParentRequest =
NULL;
2045 ReturnValue = FLT_PREOP_PENDING;
2054 NcPreNotifyDirectoryCleanup:
2056 if (ReturnValue == FLT_PREOP_COMPLETE) {
2062 Data->IoStatus.Status =
Status;
2064 if (NT_SUCCESS( Status )) {
2067 Data->IoStatus.Information = SizeWeReturn;
2072 Data->IoStatus.Information = 0;
2083 if (HandleContext !=
NULL) {
2085 if (!UnlockContext) {
2087 UnlockContext =
TRUE;
2096 if (NewShadowRequest) {
2118 if (NewMappingParentRequest) {
2140 if (InstanceContext !=
NULL) {
2142 FltReleaseContext( InstanceContext );
2145 if (UnlockContext) {
2156 if (ShadowRequestContext) {
2160 if (MappingParentRequestContext) {
2164 if (HandleContext !=
NULL) {
2166 FltReleaseContext( HandleContext );
2169 if (FileNameInformation !=
NULL) {
2171 FltReleaseFileNameInformation( FileNameInformation );
2180 _Inout_ PFLT_CALLBACK_DATA Data,
2181 _In_ PVOID CompletionContext
2216 PFILE_NOTIFY_INFORMATION SourceBuffer =
NULL;
2217 PFILE_NOTIFY_INFORMATION DestBuffer;
2224 ULONG SizeActuallyReturned = (ULONG)Data->IoStatus.Information;
2226 ULONG InputConsumed;
2229 BOOLEAN UnlockContext = FALSE;
2230 BOOLEAN CompleteUserRequest =
TRUE;
2231 BOOLEAN ReissuedRequest = FALSE;
2242 UnlockContext =
TRUE;
2260 CompleteUserRequest = FALSE;
2262 Status = STATUS_NOTIFY_CLEANUP;
2265 goto NcPostNotifyDirectoryRealCleanup;
2277 Data->IoStatus.Status = STATUS_CANCELLED;
2284 if (!NT_SUCCESS( Data->IoStatus.Status ) ||
2285 Data->IoStatus.Status == STATUS_NOTIFY_CLEANUP ||
2286 Data->IoStatus.Status == STATUS_NOTIFY_ENUM_DIR ) {
2288 Status = Data->IoStatus.Status;
2293 CompleteUserRequest = FALSE;
2295 if (Data->IoStatus.Status == STATUS_NOTIFY_ENUM_DIR) {
2307 goto NcPostNotifyDirectoryRealCleanup;
2321 if (!NT_SUCCESS( Status )) {
2338 goto NcPostNotifyDirectoryRealCleanup;
2341 FLT_ASSERT( SizeActuallyReturned <= BufferSize );
2355 if (SizeActuallyReturned > (ULONG)FIELD_OFFSET( FILE_NOTIFY_INFORMATION, FileName )) {
2366 SourceBuffer = ExAllocatePoolWithTag( PagedPool,
2367 SizeActuallyReturned,
2370 if (SourceBuffer ==
NULL) {
2372 Status = STATUS_INSUFFICIENT_RESOURCES;
2373 goto NcPostNotifyDirectoryRealCleanup;
2383 #pragma warning(suppress:6385) 2384 RtlCopyMemory( SourceBuffer, DestBuffer, SizeActuallyReturned );
2388 Status = STATUS_INVALID_USER_BUFFER;
2389 goto NcPostNotifyDirectoryRealCleanup;
2415 if (!NT_SUCCESS( Status )) {
2416 goto NcPostNotifyDirectoryRealCleanup;
2451 CompleteUserRequest = FALSE;
2453 if (BufferSize > 0) {
2461 NotCtx->
BufferToFree = ExAllocatePoolWithTag( PagedPool,
2467 Status = STATUS_INSUFFICIENT_RESOURCES;
2468 goto NcPostNotifyDirectoryRealCleanup;
2483 if (BufferSize > 0) {
2493 SizeActuallyReturned,
2497 (BOOLEAN)(NotCtx->
Mode == Munge || NotCtx->
Mode == Merge),
2506 if (!NT_SUCCESS( Status )) {
2518 goto NcPostNotifyDirectoryRealCleanup;
2532 if ((BufferSize == 0) ||
2533 (InputConsumed < SizeActuallyReturned)) {
2535 if (!CompleteUserRequest) {
2544 Status = STATUS_NOTIFY_ENUM_DIR;
2545 goto NcPostNotifyDirectoryRealCleanup;
2549 Status = STATUS_SUCCESS;
2563 if (SizeWeReturn == 0) {
2565 PMDL OldMdl = Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.MdlAddress;
2566 PFLT_GENERIC_WORKITEM WorkItem;
2581 if (!NT_SUCCESS( Status )) {
2582 goto NcPostNotifyDirectoryRealCleanup;
2585 WorkItem = FltAllocateGenericWorkItem();
2586 if (WorkItem ==
NULL) {
2587 Status = STATUS_INSUFFICIENT_RESOURCES;
2588 goto NcPostNotifyDirectoryRealCleanup;
2600 FltReuseCallbackData( Data );
2605 Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.Length =
2607 Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.DirectoryBuffer =
2609 Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.CompletionFilter =
2611 Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.Spare1 = 0;
2612 Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.Spare2 = 0;
2613 Data->Iopb->Parameters.DirectoryControl.NotifyDirectory.MdlAddress =
2616 if (BufferSize > 0) {
2618 Data->Flags |= FLTFL_CALLBACK_DATA_SYSTEM_BUFFER;
2626 Status = FltQueueGenericWorkItem( WorkItem,
2632 if (NT_SUCCESS( Status )) {
2633 ReissuedRequest =
TRUE;
2634 CompleteUserRequest = FALSE;
2636 goto NcPostNotifyDirectoryRealCleanup;
2661 CompleteUserRequest = FALSE;
2665 NcPostNotifyDirectoryRealCleanup:
2675 if (!ReissuedRequest) {
2700 if (CompleteUserRequest) {
2710 if (NT_SUCCESS( Status )) {
2713 NotCtx->
UserRequest->IoStatus.Information = SizeWeReturn;
2723 PFLT_CALLBACK_DATA RequestToComplete = NotCtx->
UserRequest;
2724 NTSTATUS CancelStatus;
2735 CancelStatus = FltClearCancelCompletion( RequestToComplete );
2737 if (CancelStatus != STATUS_CANCELLED) {
2742 UnlockContext = FALSE;
2744 FltCompletePendedPreOperation( RequestToComplete,
2755 if (SourceBuffer !=
NULL) {
2757 ExFreePoolWithTag( SourceBuffer,
NC_TAG );
2760 if (UnlockContext) {
2770 if (!ReissuedRequest) {
2776 FLT_POSTOP_CALLBACK_STATUS
2778 _Inout_ PFLT_CALLBACK_DATA Data,
2779 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2780 _In_ PVOID CompletionContext,
2781 _In_ FLT_POST_OPERATION_FLAGS Flags
2819 return FLT_POSTOP_FINISHED_PROCESSING;
2823 FLT_POSTOP_CALLBACK_STATUS
2825 _Inout_ PFLT_CALLBACK_DATA Data,
2826 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2827 _In_ PVOID CompletionContext,
2828 _In_ FLT_POST_OPERATION_FLAGS Flags
2859 FLT_POSTOP_CALLBACK_STATUS
Status;
2862 if (
FlagOn( Flags, FLTFL_POST_OPERATION_DRAINING )) {
2876 Status = FLT_POSTOP_FINISHED_PROCESSING;
2885 Success = FltDoCompletionProcessingWhenSafe( Data,
2899 Data->IoStatus.Status = STATUS_UNSUCCESSFUL;
2900 Data->IoStatus.Information = 0;
2901 Status = FLT_POSTOP_FINISHED_PROCESSING;
2910 _In_ PFLT_GENERIC_WORKITEM WorkItem,
2911 _In_ PFLT_FILTER Filter,
2912 _In_ PVOID RequestPtr
2962 (VOID) FltPerformAsynchronousIo( RequestContext->
Request,
2966 FltFreeGenericWorkItem( WorkItem );
2971 _In_ PFLT_GENERIC_WORKITEM WorkItem,
2972 _In_ PFLT_FILTER Filter,
2973 _In_ PVOID HandlePtr
2999 HANDLE Handle = (HANDLE)HandlePtr;
3000 NTSTATUS DummyStatus;
3006 DummyStatus = FltClose( Handle );
3009 FltFreeGenericWorkItem( WorkItem );
3020 _In_ NTSTATUS Status,
3021 _Inout_ PBOOLEAN LockHeld
3065 if ((NotCtx->
Mode == Filter) ||
3066 (NotCtx->
Mode == Merge)) {
3068 PFLT_CALLBACK_DATA RequestToComplete = NotCtx->
UserRequest;
3069 PFLT_CALLBACK_DATA RequestToCancel1 = NotCtx->
ShadowRequest;
3088 if (RequestToComplete) {
3089 NTSTATUS CancelStatus;
3091 CancelStatus = FltClearCancelCompletion( RequestToComplete );
3093 if (CancelStatus == STATUS_CANCELLED && Status != STATUS_CANCELLED) {
3094 RequestToComplete =
NULL;
3103 if (RequestToComplete) {
3104 RequestToComplete->IoStatus.Status =
Status;
3105 RequestToComplete->IoStatus.Information = 0;
3107 FltCompletePendedPreOperation( RequestToComplete, FLT_PREOP_COMPLETE,
NULL );
3127 if (RequestToCancel1) {
3129 (VOID)FltCancelIo( RequestToCancel1 );
3132 if (RequestToCancel2) {
3134 (VOID)FltCancelIo( RequestToCancel2 );
3137 if (HandleToClose) {
3139 NTSTATUS WorkItemStatus;
3143 WorkItemStatus = FltQueueGenericWorkItem( WorkItem,
3156 if (!NT_SUCCESS( WorkItemStatus )) {
3158 FltFreeGenericWorkItem( WorkItem );
3162 if (FileObjectToDereference) {
3163 ObDereferenceObject( FileObjectToDereference );
3170 _In_ PFLT_CALLBACK_DATA Data
3192 BOOLEAN UnlockContext;
3202 Status = FltGetStreamHandleContext( Data->Iopb->TargetInstance,
3203 Data->Iopb->TargetFileObject,
3207 if (!NT_SUCCESS( Status )) {
3220 UnlockContext =
TRUE;
3265 NcNotifyAbort( HandleContext, STATUS_CANCELLED, &UnlockContext );
3267 if (UnlockContext) {
3269 UnlockContext = FALSE;
3272 FltReleaseContext( HandleContext );
3297 NTSTATUS Status = STATUS_SUCCESS;
3301 Context->Mode = Uninitialized;
3302 Context->CleanupSeen = FALSE;
3303 Context->InsufficientBufferSeen = FALSE;
3304 Context->UserRequestName.Buffer =
NULL;
3305 Context->UserRequestName.Length = Context->UserRequestName.MaximumLength = 0;
3307 Context->MappingParentName.Buffer =
NULL;
3308 Context->MappingParentName.Length = Context->MappingParentName.MaximumLength = 0;
3310 Context->UserRequest =
NULL;
3311 Context->ShadowRequest =
NULL;
3312 Context->MappingRequest =
NULL;
3314 Context->InstanceContext =
NULL;
3315 Context->RealParentHandle =
NULL;
3316 Context->RealParentFileObject =
NULL;
3318 Context->BufferToFree =
NULL;
3319 Context->BufferLength = 0;
3349 BOOLEAN UnlockContext;
3354 UnlockContext =
TRUE;
3369 NcNotifyAbort( HandleContext, STATUS_NOTIFY_CLEANUP, &UnlockContext );
3377 if (!UnlockContext) {
3379 UnlockContext =
TRUE;
3389 NotCtx->
Mode == Munge);
3416 NotCtx->
Mode = Uninitialized;
3419 UnlockContext = FALSE;
3466 Context->ShadowRequest ==
NULL );
3475 if (Context->RealParentHandle !=
NULL) {
3477 FltClose( Context->RealParentHandle );
3489 if (Context->RealParentFileObject !=
NULL) {
3491 ObDereferenceObject( Context->RealParentFileObject );
3494 Context->RealParentFileObject =
NULL;
3495 Context->RealParentHandle =
NULL;
3497 if (Context->RealParentCloseWorkItem !=
NULL) {
3498 FltFreeGenericWorkItem( Context->RealParentCloseWorkItem );
3499 Context->RealParentCloseWorkItem =
NULL;
3502 if (Context->UserRequestName.Buffer !=
NULL) {
3506 if (Context->MappingParentName.Buffer !=
NULL) {
3510 if (Context->BufferToFree !=
NULL) {
3512 ExFreePoolWithTag( Context->BufferToFree,
NC_TAG );
3513 Context->BufferToFree =
NULL;
3514 Context->BufferLength = 0;
3517 Context->Mode = Uninitialized;
3519 if (Context->InstanceContext !=
NULL) {
3520 FltReleaseContext( Context->InstanceContext );
3521 Context->InstanceContext =
NULL;
NC_NOTIFY_REQUEST_TYPE RequestType
NTSTATUS NcSetCancelCompletion(_In_ PFLT_CALLBACK_DATA Data, _In_ PFLT_COMPLETE_CANCELED_CALLBACK CanceledCallback)
#define EMPTY_UNICODE_STRING
PNC_INSTANCE_CONTEXT InstanceContext
NTSTATUS NcStreamHandleContextAllocAndAttach(_In_ PFLT_FILTER Filter, _In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Out_ PNC_STREAM_HANDLE_CONTEXT *Context)
PFLT_GENERIC_WORKITEM RealParentCloseWorkItem
#define NcRemoveTrailingSlashIfPresent(US)
NTSTATUS NcAllocateNotifyRequestContext(_In_ PNC_STREAM_HANDLE_CONTEXT HandleContext, _In_ PFILE_OBJECT FileObject, _In_ NC_NOTIFY_REQUEST_TYPE RequestType, _In_ PFLT_CALLBACK_DATA Request, _Out_ PNC_NOTIFY_REQUEST_CONTEXT *NotifyRequestContext)
UNICODE_STRING MappingParentName
PFILE_OBJECT FileObjectToDereference
NTSTATUS NcGetDestinationNotifyBuffer(_Inout_ PFLT_CALLBACK_DATA Data, _Outptr_result_bytebuffer_maybenull_(*BufferSize) PVOID *DestBuffer, _Out_ PULONG BufferSize)
NC_MAPPING_ENTRY RealMapping
NC_GET_NEW_SYSTEM_BUFFER_ADDRESS NcGetNewSystemBufferAddress
struct _NC_NOTIFY_REQUEST_CONTEXT NC_NOTIFY_REQUEST_CONTEXT
VOID NcCleanupSubNotifyRequest(_In_ PFLT_CALLBACK_DATA SubRequest)
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
FLT_PREOP_CALLBACK_STATUS NcPreNotifyDirectory(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE Instance
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY
BOOLEAN InsufficientBufferSeen
NC_MAPPING_PATH LongNamePath
PFILE_NOTIFY_INFORMATION BufferToFree
_When_(Data==NULL, _Pre_satisfies_(FileObject !=NULL &&Instance !=NULL)) _When_(FileObject
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
FLT_POSTOP_CALLBACK_STATUS NcPostNotifyDirectory(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
#define NcFreeUnicodeString(UCS)
#define NcLockStreamHandleContext(C)
PFLT_CALLBACK_DATA UserRequest
VOID NcPostNotifyDirectoryReal(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PVOID CompletionContext)
_Pre_satisfies_(Data !=NULL)) NTSTATUS NcGetFileNameInformation(_In_opt_ PFLT_CALLBACK_DATA Data
enum _NC_DIR_NOT_CONTEXT::@12 Mode
NTSTATUS NcStreamHandleContextNotCreate(_Out_ PNC_DIR_NOT_CONTEXT Context)
NC_MAPPING_ENTRY UserMapping
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE _In_ FLT_FILE_NAME_OPTIONS _Outptr_ PFLT_FILE_NAME_INFORMATION * FileNameInformation
VOID NcStreamHandleContextNotCleanup(_In_ PNC_STREAM_HANDLE_CONTEXT HandleContext)
VOID NcReissueNotifyRequestWorkerRoutine(_In_ PFLT_GENERIC_WORKITEM WorkItem, _In_ PFLT_FILTER Filter, _In_ PVOID RequestPtr)
_In_ BOOLEAN _Out_ PFILE_BASIC_INFORMATION Buffer
_In_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _In_reads_bytes_(Length)
UNREFERENCED_PARAMETER(FileObject)
NC_DIR_NOT_CONTEXT DirectoryNotificationContext
PNC_STREAM_HANDLE_CONTEXT UserHandleContext
NcLoadRegistryStringRetry NULL
PFLT_CALLBACK_DATA MappingRequest
UNICODE_STRING ParentPath
BOOLEAN NcComparePath(_In_ PCUNICODE_STRING Name, _In_ PNC_MAPPING_ENTRY Mapping, _Out_opt_ PUNICODE_STRING Remainder, _In_ BOOLEAN IgnoreCase, _In_ BOOLEAN ContainsDevice, _Out_ PNC_PATH_OVERLAP Overlap)
VOID NcNotifyCancelCallback(_In_ PFLT_CALLBACK_DATA Data)
#define IRP_MJ_DIRECTORY_CONTROL
LONG NcExceptionFilter(_In_ PEXCEPTION_POINTERS ExceptionPointer, _In_ BOOLEAN AccessingUserBuffer)
PFLT_CALLBACK_DATA Request
PFILE_OBJECT RealParentFileObject
FORCEINLINE VOID _Releases_lock_(_Global_critical_region_) _Requires_lock_held_(_Global_critical_region_) AvReleaseResource(_Inout_ _Requires_lock_held_(*Resource) _Releases_lock_(*Resource) PERESOURCE Resource)
NC_GLOBAL_DATA NcGlobalData
#define NcUnlockStreamHandleContext(C)
NTSTATUS NcDirNotifyTranslateBuffers(_In_ PNC_INSTANCE_CONTEXT InstanceContext, _In_ BOOLEAN IgnoreCase, _In_ PUNICODE_STRING UserRequestName, _In_ PUNICODE_STRING OpenedName, _In_reads_bytes_(InputBufferLength) PFILE_NOTIFY_INFORMATION InputSystemBuffer, _Out_writes_bytes_to_(OutputBufferLength, *OutputBufferWritten) PFILE_NOTIFY_INFORMATION OutputUserBuffer, _In_ ULONG InputBufferLength, _In_ ULONG OutputBufferLength, _Out_ PULONG InputBufferConsumed, _Out_ PULONG OutputBufferWritten, _In_ BOOLEAN ReturnRealMappingPaths, _In_ BOOLEAN ReturnInMappingOnly)
VOID NcFreeNotifyRequestContext(_In_ PNC_NOTIFY_REQUEST_CONTEXT NotifyRequestContext)
#define AlignToSize(_length, _alignment)
NTSTATUS NcBuildSubNotifyRequest(_In_ PFLT_CALLBACK_DATA PrimaryRequest, _In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _In_ PNC_STREAM_HANDLE_CONTEXT HandleContext, _In_ NC_NOTIFY_REQUEST_TYPE RequestType, _Out_ PFLT_CALLBACK_DATA *SubRequest, _Out_ PNC_NOTIFY_REQUEST_CONTEXT *NotifyRequestContext)
NTSTATUS NcCreateFileHelper(_In_ PFLT_FILTER Filter, _In_opt_ PFLT_INSTANCE Instance, _Out_ PHANDLE FileHandle, _Outptr_opt_ PFILE_OBJECT *FileObject, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_opt_ PLARGE_INTEGER AllocationSize, _In_ ULONG FileAttributes, _In_ ULONG ShareAccess, _In_ ULONG CreateDisposition, _In_ ULONG CreateOptions, _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, _In_ ULONG EaLength, _In_ ULONG Flags, _In_opt_ PFILE_OBJECT ParentFileObject)
NcLoadRegistryStringCleanup NC_TAG
#define NC_GENERATE_NAME_TAG
enum _NC_NOTIFY_REQUEST_TYPE NC_NOTIFY_REQUEST_TYPE
_Pre_satisfies_ LockHeld _Requires_lock_held_(_Global_critical_region_)
UNICODE_STRING UserRequestName
PFLT_CALLBACK_DATA ShadowRequest
struct _NC_NOTIFY_REQUEST_CONTEXT * PNC_NOTIFY_REQUEST_CONTEXT
_In_opt_ PFILE_OBJECT FileObject
VOID NcStreamHandleContextNotClose(_In_ PNC_DIR_NOT_CONTEXT Context)
FLT_POSTOP_CALLBACK_STATUS NcPostNotifyDirectorySafe(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
VOID NcCloseHandleWorkerRoutine(_In_ PFLT_GENERIC_WORKITEM WorkItem, _In_ PFLT_FILTER Filter, _In_ PVOID HandlePtr)