inc: fsctl: simplify FSP_FSCTL_TRANSACT_RSP Rsp.Create.Reparse

This commit is contained in:
Bill Zissimopoulos 2016-09-14 17:18:59 -07:00
parent 49cd11b34b
commit 46a29f663a
4 changed files with 17 additions and 26 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}
} }
} }

View File

@ -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);