sys: IRP_MJ_CREATE

This commit is contained in:
Bill Zissimopoulos 2015-12-07 13:01:40 -08:00
parent f32db0ed2e
commit 6fcab43120
2 changed files with 13 additions and 3 deletions

View File

@ -104,9 +104,10 @@ typedef struct
UINT16 Ea; /* reserved; not currently implemented */
UINT16 EaSize; /* reserved; not currently implemented */
UINT32 UserMode:1; /* request originated in user mode */
UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */
UINT32 OpenTargetDirectory:1; /* open target dir and report FILE_{EXISTS,DOES_NOT_EXIST} */
UINT32 CaseSensitive:1; /* filename comparisons should be case-sensitive */
UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */
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 */
} Create;
struct
{

View File

@ -268,6 +268,7 @@ static NTSTATUS FspFsvolCreate(
Request->Req.Create.UserMode = UserMode == RequestorMode;
Request->Req.Create.HasTraversePrivilege = HasTraversePrivilege;
Request->Req.Create.OpenTargetDirectory = BooleanFlagOn(Flags, SL_OPEN_TARGET_DIRECTORY);
Request->Req.Create.HasTrailingBackslash = HasTrailingBackslash;
Request->Req.Create.CaseSensitive = BooleanFlagOn(Flags, SL_CASE_SENSITIVE);
/* copy the security descriptor into the request */
@ -387,6 +388,8 @@ VOID FspFsvolCreateComplete(
ULONG Flags = IrpSp->Flags;
KPROCESSOR_MODE RequestorMode =
FlagOn(Flags, SL_FORCE_ACCESS_CHECK) ? UserMode : Irp->RequestorMode;
BOOLEAN HasTrailingBackslash =
0 != ((FSP_FSCTL_TRANSACT_REQ *)Irp->Tail.Overlay.DriverContext[0])->Req.Create.HasTrailingBackslash;
FSP_FILE_CONTEXT *FsContext = FileObject->FsContext;
ACCESS_MASK GrantedAccess;
BOOLEAN Inserted = FALSE;
@ -511,6 +514,12 @@ VOID FspFsvolCreateComplete(
FspFsvolCreateClose(Irp, Response);
FSP_RETURN(Result = STATUS_FILE_IS_A_DIRECTORY);
}
if (HasTrailingBackslash &&
!FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY))
{
FspFsvolCreateClose(Irp, Response);
FSP_RETURN(Result = STATUS_OBJECT_NAME_INVALID);
}
/* record the user-mode file system contexts */
FsContext->UserContext = Response->Rsp.Create.Opened.UserContext;