From f32db0ed2e753dff1a06aff36f14af140d6e4c92 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 7 Dec 2015 12:07:00 -0800 Subject: [PATCH] sys: IRP_MJ_CREATE --- src/sys/create.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/sys/create.c b/src/sys/create.c index 6c691cee..7df70c54 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -116,7 +116,7 @@ static NTSTATUS FspFsvolCreate( goto exit; } - /* impossible create options set? */ + /* impossible create options sent? */ if (FlagOn(CreateOptions, FILE_NON_DIRECTORY_FILE) && FlagOn(CreateOptions, FILE_DIRECTORY_FILE)) { @@ -247,6 +247,10 @@ static NTSTATUS FspFsvolCreate( goto exit; } + /* + * The new request is associated with our IRP and will be deleted during its completion. + */ + /* populate the Create request */ Request->Kind = FspFsctlTransactCreateKind; Request->Req.Create.CreateDisposition = CreateDisposition; @@ -372,6 +376,8 @@ VOID FspFsvolCreateComplete( FspFsvrtDeviceExtension(FsvolDeviceExtension->FsvrtDeviceObject); PFILE_OBJECT FileObject = IrpSp->FileObject; PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState; + ULONG CreateOptions = IrpSp->Parameters.Create.Options & 0xffffff; + UINT32 ResponseFileAttributes = Response->Rsp.Create.Opened.FileAttributes; PSECURITY_DESCRIPTOR SecurityDescriptor; ULONG SecurityDescriptorSize; UNICODE_STRING ReparseFileName; @@ -492,6 +498,20 @@ VOID FspFsvolCreateComplete( ClearFlag(AccessState->RemainingDesiredAccess, GrantedAccess); } + /* were we asked to open a directory or non-directory? */ + if (FlagOn(CreateOptions, FILE_DIRECTORY_FILE) && + !FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) + { + FspFsvolCreateClose(Irp, Response); + FSP_RETURN(Result = STATUS_NOT_A_DIRECTORY); + } + if (FlagOn(CreateOptions, FILE_NON_DIRECTORY_FILE) && + FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) + { + FspFsvolCreateClose(Irp, Response); + FSP_RETURN(Result = STATUS_FILE_IS_A_DIRECTORY); + } + /* record the user-mode file system contexts */ FsContext->UserContext = Response->Rsp.Create.Opened.UserContext; FileObject->FsContext2 = (PVOID)(UINT_PTR)Response->Rsp.Create.Opened.UserContext2;