sys: IRP_MJ_CREATE

This commit is contained in:
Bill Zissimopoulos 2015-12-07 16:54:49 -08:00
parent 264da71f7c
commit 2a84229da3
2 changed files with 10 additions and 10 deletions

View File

@ -106,8 +106,8 @@ typedef struct
UINT32 UserMode:1; /* request originated in user mode */ UINT32 UserMode:1; /* request originated in user mode */
UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */ UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */
UINT32 OpenTargetDirectory:1; /* open target dir and report FILE_{EXISTS,DOES_NOT_EXIST} */ UINT32 OpenTargetDirectory:1; /* open target dir and report FILE_{EXISTS,DOES_NOT_EXIST} */
UINT32 HasTrailingBackslash:1; /* original FileName (sent by CreateFile) has trailing backslash */
UINT32 CaseSensitive:1; /* FileName comparisons should be case-sensitive */ UINT32 CaseSensitive:1; /* FileName comparisons should be case-sensitive */
UINT32 HasTrailingBackslash:1; /* reserved: do not use */
} Create; } Create;
struct struct
{ {

View File

@ -378,6 +378,7 @@ VOID FspFsvolCreateComplete(
PFILE_OBJECT FileObject = IrpSp->FileObject; PFILE_OBJECT FileObject = IrpSp->FileObject;
PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState; PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState;
ULONG CreateOptions = IrpSp->Parameters.Create.Options & 0xffffff; ULONG CreateOptions = IrpSp->Parameters.Create.Options & 0xffffff;
BOOLEAN FileCreated = FILE_CREATED == Response->IoStatus.Information;
UINT32 ResponseFileAttributes = Response->Rsp.Create.Opened.FileAttributes; UINT32 ResponseFileAttributes = Response->Rsp.Create.Opened.FileAttributes;
PSECURITY_DESCRIPTOR SecurityDescriptor; PSECURITY_DESCRIPTOR SecurityDescriptor;
ULONG SecurityDescriptorSize; ULONG SecurityDescriptorSize;
@ -454,9 +455,13 @@ VOID FspFsvolCreateComplete(
FSP_RETURN(); FSP_RETURN();
} }
/* record the user-mode file system contexts */
FsContext->UserContext = Response->Rsp.Create.Opened.UserContext;
FileObject->FsContext2 = (PVOID)(UINT_PTR)Response->Rsp.Create.Opened.UserContext2;
/* check for trailing backslash */ /* check for trailing backslash */
if (HasTrailingBackslash && if (HasTrailingBackslash &&
!FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) !FileCreated && !FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY))
{ {
FspFsvolCreateClose(Irp, Response); FspFsvolCreateClose(Irp, Response);
FSP_RETURN(Result = STATUS_OBJECT_NAME_INVALID); FSP_RETURN(Result = STATUS_OBJECT_NAME_INVALID);
@ -466,8 +471,7 @@ VOID FspFsvolCreateComplete(
if (!FsvrtDeviceExtension->VolumeParams.NoSystemAccessCheck) if (!FsvrtDeviceExtension->VolumeParams.NoSystemAccessCheck)
{ {
/* read-only attribute check */ /* read-only attribute check */
if (FILE_CREATED != Response->IoStatus.Information && if (!FileCreated && FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_READONLY))
FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_READONLY))
{ {
/* from fastfat: allowed accesses when read-only */ /* from fastfat: allowed accesses when read-only */
ACCESS_MASK Allowed = ACCESS_MASK Allowed =
@ -539,22 +543,18 @@ VOID FspFsvolCreateComplete(
/* were we asked to open a directory or non-directory? */ /* were we asked to open a directory or non-directory? */
if (FlagOn(CreateOptions, FILE_DIRECTORY_FILE) && if (FlagOn(CreateOptions, FILE_DIRECTORY_FILE) &&
!FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) !FileCreated && !FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY))
{ {
FspFsvolCreateClose(Irp, Response); FspFsvolCreateClose(Irp, Response);
FSP_RETURN(Result = STATUS_NOT_A_DIRECTORY); FSP_RETURN(Result = STATUS_NOT_A_DIRECTORY);
} }
if (FlagOn(CreateOptions, FILE_NON_DIRECTORY_FILE) && if (FlagOn(CreateOptions, FILE_NON_DIRECTORY_FILE) &&
FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) !FileCreated && FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY))
{ {
FspFsvolCreateClose(Irp, Response); FspFsvolCreateClose(Irp, Response);
FSP_RETURN(Result = STATUS_FILE_IS_A_DIRECTORY); 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;
/* /*
* The following must be done under the file system volume device Resource, * The following must be done under the file system volume device Resource,
* because we are manipulating its GenericTable and accessing foreign FsContext's. * because we are manipulating its GenericTable and accessing foreign FsContext's.