diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 95f9efd1..c3c9d344 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -341,10 +341,9 @@ typedef struct FSP_FSCTL_FILE_INFO FileInfo; } Opened; /* IoStatus.Status == STATUS_REPARSE */ - union + struct { - FSP_FSCTL_TRANSACT_BUF FileName; /* IoStatus.Information == IO_REPARSE (== 0) */ - FSP_FSCTL_TRANSACT_BUF Data; /* IoStatus.Information > IO_REMOUNT (== 1) */ + FSP_FSCTL_TRANSACT_BUF Buffer; } Reparse; } Create; struct diff --git a/src/dll/debug.c b/src/dll/debug.c index c9fbb64d..93fa2914 100644 --- a/src/dll/debug.c +++ b/src/dll/debug.c @@ -631,8 +631,8 @@ FSP_API VOID FspDebugLogResponse(FSP_FSCTL_TRANSACT_RSP *Response) FspDiagIdent(), GetCurrentThreadId(), Response->Hint, Response->IoStatus.Status, Response->IoStatus.Information, FspDebugLogWideCharBufferString( - Response->Buffer + Response->Rsp.Create.Reparse.FileName.Offset, - Response->Rsp.Create.Reparse.FileName.Size, + Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset, + Response->Rsp.Create.Reparse.Buffer.Size, InfoBuf)); else if (1/*IO_REMOUNT*/ == Response->IoStatus.Information) FspDebugLogResponseStatus(Response, "Create"); @@ -642,7 +642,7 @@ FSP_API VOID FspDebugLogResponse(FSP_FSCTL_TRANSACT_RSP *Response) FspDiagIdent(), GetCurrentThreadId(), Response->Hint, Response->IoStatus.Status, Response->IoStatus.Information, FspDebugLogReparseDataString( - Response->Buffer + Response->Rsp.Create.Reparse.Data.Offset, + Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset, InfoBuf)); } else diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 66d5b787..6a923a7b 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -117,16 +117,8 @@ NTSTATUS FspFileSystemCallResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem, Response->IoStatus.Information = (UINT32)IoStatus.Information; Response->Size = (UINT16)(sizeof *Response + Size); - if (0/*IO_REPARSE*/ == IoStatus.Information) - { - Response->Rsp.Create.Reparse.FileName.Offset = 0; - Response->Rsp.Create.Reparse.FileName.Size = (UINT16)Size; - } - else - { - Response->Rsp.Create.Reparse.Data.Offset = 0; - Response->Rsp.Create.Reparse.Data.Size = (UINT16)Size; - } + Response->Rsp.Create.Reparse.Buffer.Offset = 0; + Response->Rsp.Create.Reparse.Buffer.Size = (UINT16)Size; } } diff --git a/src/sys/create.c b/src/sys/create.c index 4ecb8aab..30ad03ab 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -528,9 +528,9 @@ NTSTATUS FspFsvolCreateComplete( sizeof ReparseTargetPrefix1); ReparseTargetPath.Length = ReparseTargetPath.MaximumLength = - Response->Rsp.Create.Reparse.FileName.Size; + Response->Rsp.Create.Reparse.Buffer.Size; ReparseTargetPath.Buffer = - (PVOID)(Response->Buffer + Response->Rsp.Create.Reparse.FileName.Offset); + (PVOID)(Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset); if ((PUINT8)ReparseTargetPath.Buffer + ReparseTargetPath.Length > (PUINT8)Response + Response->Size || @@ -541,13 +541,13 @@ NTSTATUS FspFsvolCreateComplete( { ASSERT(IO_REPARSE_TAG_SYMLINK == Response->IoStatus.Information); - ReparseData = (PVOID)(Response->Buffer + Response->Rsp.Create.Reparse.Data.Offset); + ReparseData = (PVOID)(Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset); - if ((PUINT8)ReparseData + Response->Rsp.Create.Reparse.Data.Size > + if ((PUINT8)ReparseData + Response->Rsp.Create.Reparse.Buffer.Size > (PUINT8)Response + Response->Size) FSP_RETURN(Result = STATUS_REPARSE_POINT_NOT_RESOLVED); - Result = FsRtlValidateReparsePointBuffer(Response->Rsp.Create.Reparse.Data.Size, + Result = FsRtlValidateReparsePointBuffer(Response->Rsp.Create.Reparse.Buffer.Size, ReparseData); if (!NT_SUCCESS(Result)) FSP_RETURN(Result = STATUS_REPARSE_POINT_NOT_RESOLVED); @@ -602,25 +602,25 @@ NTSTATUS FspFsvolCreateComplete( } else { - ReparseData = (PVOID)(Response->Buffer + Response->Rsp.Create.Reparse.Data.Offset); + ReparseData = (PVOID)(Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset); - if ((PUINT8)ReparseData + Response->Rsp.Create.Reparse.Data.Size > + if ((PUINT8)ReparseData + Response->Rsp.Create.Reparse.Buffer.Size > (PUINT8)Response + Response->Size) FSP_RETURN(Result = STATUS_IO_REPARSE_DATA_INVALID); - Result = FsRtlValidateReparsePointBuffer(Response->Rsp.Create.Reparse.Data.Size, + Result = FsRtlValidateReparsePointBuffer(Response->Rsp.Create.Reparse.Buffer.Size, ReparseData); if (!NT_SUCCESS(Result)) FSP_RETURN(); ASSERT(0 == Irp->Tail.Overlay.AuxiliaryBuffer); Irp->Tail.Overlay.AuxiliaryBuffer = FspAllocNonPagedExternal( - Response->Rsp.Create.Reparse.Data.Size); + Response->Rsp.Create.Reparse.Buffer.Size); if (0 == Irp->Tail.Overlay.AuxiliaryBuffer) FSP_RETURN(Result = STATUS_INSUFFICIENT_RESOURCES); RtlCopyMemory(Irp->Tail.Overlay.AuxiliaryBuffer, ReparseData, - Response->Rsp.Create.Reparse.Data.Size); + Response->Rsp.Create.Reparse.Buffer.Size); Irp->IoStatus.Information = ReparseData->ReparseTag; FSP_RETURN(Result = STATUS_REPARSE);