mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-07 20:42:09 -05:00
inc: fsctl: simplify FSP_FSCTL_TRANSACT_RSP Rsp.Create.Reparse
This commit is contained in:
parent
49cd11b34b
commit
46a29f663a
@ -341,10 +341,9 @@ typedef struct
|
|||||||
FSP_FSCTL_FILE_INFO FileInfo;
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
} Opened;
|
} Opened;
|
||||||
/* IoStatus.Status == STATUS_REPARSE */
|
/* IoStatus.Status == STATUS_REPARSE */
|
||||||
union
|
struct
|
||||||
{
|
{
|
||||||
FSP_FSCTL_TRANSACT_BUF FileName; /* IoStatus.Information == IO_REPARSE (== 0) */
|
FSP_FSCTL_TRANSACT_BUF Buffer;
|
||||||
FSP_FSCTL_TRANSACT_BUF Data; /* IoStatus.Information > IO_REMOUNT (== 1) */
|
|
||||||
} Reparse;
|
} Reparse;
|
||||||
} Create;
|
} Create;
|
||||||
struct
|
struct
|
||||||
|
@ -631,8 +631,8 @@ FSP_API VOID FspDebugLogResponse(FSP_FSCTL_TRANSACT_RSP *Response)
|
|||||||
FspDiagIdent(), GetCurrentThreadId(), Response->Hint,
|
FspDiagIdent(), GetCurrentThreadId(), Response->Hint,
|
||||||
Response->IoStatus.Status, Response->IoStatus.Information,
|
Response->IoStatus.Status, Response->IoStatus.Information,
|
||||||
FspDebugLogWideCharBufferString(
|
FspDebugLogWideCharBufferString(
|
||||||
Response->Buffer + Response->Rsp.Create.Reparse.FileName.Offset,
|
Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset,
|
||||||
Response->Rsp.Create.Reparse.FileName.Size,
|
Response->Rsp.Create.Reparse.Buffer.Size,
|
||||||
InfoBuf));
|
InfoBuf));
|
||||||
else if (1/*IO_REMOUNT*/ == Response->IoStatus.Information)
|
else if (1/*IO_REMOUNT*/ == Response->IoStatus.Information)
|
||||||
FspDebugLogResponseStatus(Response, "Create");
|
FspDebugLogResponseStatus(Response, "Create");
|
||||||
@ -642,7 +642,7 @@ FSP_API VOID FspDebugLogResponse(FSP_FSCTL_TRANSACT_RSP *Response)
|
|||||||
FspDiagIdent(), GetCurrentThreadId(), Response->Hint,
|
FspDiagIdent(), GetCurrentThreadId(), Response->Hint,
|
||||||
Response->IoStatus.Status, Response->IoStatus.Information,
|
Response->IoStatus.Status, Response->IoStatus.Information,
|
||||||
FspDebugLogReparseDataString(
|
FspDebugLogReparseDataString(
|
||||||
Response->Buffer + Response->Rsp.Create.Reparse.Data.Offset,
|
Response->Buffer + Response->Rsp.Create.Reparse.Buffer.Offset,
|
||||||
InfoBuf));
|
InfoBuf));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -117,16 +117,8 @@ NTSTATUS FspFileSystemCallResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Response->IoStatus.Information = (UINT32)IoStatus.Information;
|
Response->IoStatus.Information = (UINT32)IoStatus.Information;
|
||||||
|
|
||||||
Response->Size = (UINT16)(sizeof *Response + Size);
|
Response->Size = (UINT16)(sizeof *Response + Size);
|
||||||
if (0/*IO_REPARSE*/ == IoStatus.Information)
|
Response->Rsp.Create.Reparse.Buffer.Offset = 0;
|
||||||
{
|
Response->Rsp.Create.Reparse.Buffer.Size = (UINT16)Size;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,9 +528,9 @@ NTSTATUS FspFsvolCreateComplete(
|
|||||||
sizeof ReparseTargetPrefix1);
|
sizeof ReparseTargetPrefix1);
|
||||||
|
|
||||||
ReparseTargetPath.Length = ReparseTargetPath.MaximumLength =
|
ReparseTargetPath.Length = ReparseTargetPath.MaximumLength =
|
||||||
Response->Rsp.Create.Reparse.FileName.Size;
|
Response->Rsp.Create.Reparse.Buffer.Size;
|
||||||
ReparseTargetPath.Buffer =
|
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 >
|
if ((PUINT8)ReparseTargetPath.Buffer + ReparseTargetPath.Length >
|
||||||
(PUINT8)Response + Response->Size ||
|
(PUINT8)Response + Response->Size ||
|
||||||
@ -541,13 +541,13 @@ NTSTATUS FspFsvolCreateComplete(
|
|||||||
{
|
{
|
||||||
ASSERT(IO_REPARSE_TAG_SYMLINK == Response->IoStatus.Information);
|
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)
|
(PUINT8)Response + Response->Size)
|
||||||
FSP_RETURN(Result = STATUS_REPARSE_POINT_NOT_RESOLVED);
|
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);
|
ReparseData);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
FSP_RETURN(Result = STATUS_REPARSE_POINT_NOT_RESOLVED);
|
FSP_RETURN(Result = STATUS_REPARSE_POINT_NOT_RESOLVED);
|
||||||
@ -602,25 +602,25 @@ NTSTATUS FspFsvolCreateComplete(
|
|||||||
}
|
}
|
||||||
else
|
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)
|
(PUINT8)Response + Response->Size)
|
||||||
FSP_RETURN(Result = STATUS_IO_REPARSE_DATA_INVALID);
|
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);
|
ReparseData);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
FSP_RETURN();
|
FSP_RETURN();
|
||||||
|
|
||||||
ASSERT(0 == Irp->Tail.Overlay.AuxiliaryBuffer);
|
ASSERT(0 == Irp->Tail.Overlay.AuxiliaryBuffer);
|
||||||
Irp->Tail.Overlay.AuxiliaryBuffer = FspAllocNonPagedExternal(
|
Irp->Tail.Overlay.AuxiliaryBuffer = FspAllocNonPagedExternal(
|
||||||
Response->Rsp.Create.Reparse.Data.Size);
|
Response->Rsp.Create.Reparse.Buffer.Size);
|
||||||
if (0 == Irp->Tail.Overlay.AuxiliaryBuffer)
|
if (0 == Irp->Tail.Overlay.AuxiliaryBuffer)
|
||||||
FSP_RETURN(Result = STATUS_INSUFFICIENT_RESOURCES);
|
FSP_RETURN(Result = STATUS_INSUFFICIENT_RESOURCES);
|
||||||
|
|
||||||
RtlCopyMemory(Irp->Tail.Overlay.AuxiliaryBuffer, ReparseData,
|
RtlCopyMemory(Irp->Tail.Overlay.AuxiliaryBuffer, ReparseData,
|
||||||
Response->Rsp.Create.Reparse.Data.Size);
|
Response->Rsp.Create.Reparse.Buffer.Size);
|
||||||
|
|
||||||
Irp->IoStatus.Information = ReparseData->ReparseTag;
|
Irp->IoStatus.Information = ReparseData->ReparseTag;
|
||||||
FSP_RETURN(Result = STATUS_REPARSE);
|
FSP_RETURN(Result = STATUS_REPARSE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user