24 #pragma alloc_text(PAGE, NcPreCreate) 28 FLT_PREOP_CALLBACK_STATUS
30 _Inout_ PFLT_CALLBACK_DATA Data,
31 _In_ PCFLT_RELATED_OBJECTS FltObjects,
32 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
78 FLT_PREOP_CALLBACK_STATUS ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
80 PFLT_FILE_NAME_INFORMATION FullFileNameInformation =
NULL;
83 UNICODE_STRING Remainder;
85 BOOLEAN IgnoreCase = !BooleanFlagOn( Data->Iopb->OperationFlags, SL_CASE_SENSITIVE );
86 UCHAR CreateDisposition = (UCHAR)(Data->Iopb->Parameters.Create.Options >> 24);
99 if (
FlagOn( Data->Iopb->OperationFlags, SL_OPEN_PAGING_FILE )) {
101 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
102 goto NcPreCreateCleanup;
110 if (
FlagOn( Data->Iopb->TargetFileObject->Flags, FO_VOLUME_OPEN )) {
112 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
113 goto NcPreCreateCleanup;
121 if (
FlagOn( Data->Iopb->Parameters.Create.Options, FILE_OPEN_BY_FILE_ID )) {
123 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
124 goto NcPreCreateCleanup;
138 Status = NcGetFileNameInformation( Data,
141 FLT_FILE_NAME_OPENED |
142 FLT_FILE_NAME_QUERY_DEFAULT |
143 FLT_FILE_NAME_DO_NOT_CACHE,
144 &FileNameInformation );
146 if (!NT_SUCCESS( Status )) {
148 ReturnValue = FLT_PREOP_COMPLETE;
149 goto NcPreCreateCleanup;
152 Status = FltParseFileNameInformation( FileNameInformation );
154 if (!NT_SUCCESS( Status )) {
156 ReturnValue = FLT_PREOP_COMPLETE;
157 goto NcPreCreateCleanup;
164 Status = FltGetInstanceContext( FltObjects->Instance,
167 if (!NT_SUCCESS( Status )) {
169 ReturnValue = FLT_PREOP_COMPLETE;
170 goto NcPreCreateCleanup;
200 if (RealOverlap.
Match) {
210 ReturnValue = FLT_PREOP_COMPLETE;
211 switch (CreateDisposition) {
214 Status = STATUS_OBJECT_NAME_NOT_FOUND;
215 goto NcPreCreateCleanup;
218 case FILE_OVERWRITE_IF:
220 Status = STATUS_ACCESS_DENIED;
221 goto NcPreCreateCleanup;
225 Status = STATUS_ACCESS_DENIED;
226 goto NcPreCreateCleanup;
230 Status = STATUS_OBJECT_PATH_NOT_FOUND;
231 ReturnValue = FLT_PREOP_COMPLETE;
232 goto NcPreCreateCleanup;
249 if (
FlagOn( Data->Iopb->Parameters.Create.Options, FILE_DELETE_ON_CLOSE )) {
253 Status = STATUS_ACCESS_DENIED;
254 ReturnValue = FLT_PREOP_COMPLETE;
255 goto NcPreCreateCleanup;
291 if (
FlagOn( Data->Iopb->OperationFlags, SL_OPEN_TARGET_DIRECTORY )) {
297 ClearFlag( Data->Iopb->OperationFlags, SL_OPEN_TARGET_DIRECTORY );
303 Status = NcGetFileNameInformation( Data,
306 FLT_FILE_NAME_OPENED | FLT_FILE_NAME_QUERY_FILESYSTEM_ONLY,
307 &FullFileNameInformation );
309 if (!NT_SUCCESS( Status )) {
311 ReturnValue = FLT_PREOP_COMPLETE;
312 goto NcPreCreateCleanup;
315 Status = FltParseFileNameInformation( FullFileNameInformation );
317 if (!NT_SUCCESS( Status )) {
319 ReturnValue = FLT_PREOP_COMPLETE;
320 goto NcPreCreateCleanup;
330 SetFlag( Data->Iopb->OperationFlags, SL_OPEN_TARGET_DIRECTORY );
363 if (!NT_SUCCESS( Status )) {
365 ReturnValue = FLT_PREOP_COMPLETE;
366 goto NcPreCreateCleanup;
377 if (!NT_SUCCESS(Status)) {
379 ReturnValue = FLT_PREOP_COMPLETE;
380 goto NcPreCreateCleanup;
389 FltObjects->FileObject->RelatedFileObject =
NULL;
395 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
396 goto NcPreCreateCleanup;
405 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
406 goto NcPreCreateCleanup;
414 if (ReturnValue == FLT_PREOP_COMPLETE) {
422 Data->IoStatus.Status =
Status;
429 if (FileNameInformation !=
NULL) {
431 FltReleaseFileNameInformation( FileNameInformation );
434 if (FullFileNameInformation !=
NULL) {
436 FltReleaseFileNameInformation( FullFileNameInformation );
439 if (MungedName.Buffer !=
NULL) {
441 ExFreePoolWithTag( MungedName.Buffer,
NC_TAG );
444 if (InstanceContext !=
NULL) {
446 FltReleaseContext( InstanceContext );
#define EMPTY_UNICODE_STRING
NC_MAPPING_ENTRY RealMapping
NC_REPLACE_FILEOBJECT_NAME_TYPE NcReplaceFileObjectName
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
NC_MAPPING_ENTRY UserMapping
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE _In_ FLT_FILE_NAME_OPTIONS _Outptr_ PFLT_FILE_NAME_INFORMATION * FileNameInformation
UNREFERENCED_PARAMETER(FileObject)
NcLoadRegistryStringRetry NULL
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)
NcLoadRegistryStringCleanup NC_TAG
FLT_PREOP_CALLBACK_STATUS NcPreCreate(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)