sys,dll: reparse point testing

This commit is contained in:
Bill Zissimopoulos 2016-09-09 17:21:56 -07:00
parent 5dcbbaa4e7
commit 0c07be9628
2 changed files with 21 additions and 22 deletions

View File

@ -906,7 +906,11 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
(PVOID)Request->Req.FileSystemControl.UserContext, (PVOID)Request->Req.FileSystemControl.UserContext,
(PWSTR)Request->Buffer, ReparseData, &Size); (PWSTR)Request->Buffer, ReparseData, &Size);
if (NT_SUCCESS(Result)) if (NT_SUCCESS(Result))
{
Response->Size = (UINT16)(sizeof *Response + Size);
Response->Rsp.FileSystemControl.Buffer.Offset = 0;
Response->Rsp.FileSystemControl.Buffer.Size = (UINT16)Size; Response->Rsp.FileSystemControl.Buffer.Size = (UINT16)Size;
}
} }
break; break;
case FSCTL_SET_REPARSE_POINT: case FSCTL_SET_REPARSE_POINT:
@ -937,7 +941,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
break; break;
} }
return STATUS_SUCCESS; return Result;
} }
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem, FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem,

View File

@ -174,24 +174,24 @@ static NTSTATUS FspFsvolFileSystemControlReparsePoint(
; ;
} }
} }
FspFileNodeAcquireExclusive(FileNode, Full);
} }
else else
{ {
if (0 != InputBuffer || 0 != InputBufferLength || if (0 == OutputBuffer || 0 == OutputBufferLength)
0 == OutputBuffer || 0 == OutputBufferLength)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
Result = FspBufferUserBuffer(Irp, OutputBufferLength, IoWriteAccess); /*
if (!NT_SUCCESS(Result)) * NtFsControlFile (IopXxxControlFile) will setup Irp->AssociatedIrp.SystemBuffer
return Result; * with enough space for either InputBufferLength or OutputBufferLength. There is
* no need to call FspBufferUserBuffer ourselves.
*/
FspFileNodeAcquireShared(FileNode, Full);
} }
if (IsWrite) Result = FspIopCreateRequestEx(Irp, &FileNode->FileName, IsWrite ? InputBufferLength : 0,
FspFileNodeAcquireExclusive(FileNode, Full);
else
FspFileNodeAcquireShared(FileNode, Full);
Result = FspIopCreateRequestEx(Irp, &FileNode->FileName, InputBufferLength,
FspFsvolFileSystemControlRequestFini, &Request); FspFsvolFileSystemControlRequestFini, &Request);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
{ {
@ -225,12 +225,12 @@ static NTSTATUS FspFsvolFileSystemControlReparsePointComplete(
{ {
PAGED_CODE(); PAGED_CODE();
if (!IsWrite) if (IsWrite)
return STATUS_SUCCESS; return STATUS_SUCCESS;
NTSTATUS Result; NTSTATUS Result;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer; /* see FspBufferUserBuffer call */ PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength; ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
if (Response->Buffer + Response->Rsp.FileSystemControl.Buffer.Offset + if (Response->Buffer + Response->Rsp.FileSystemControl.Buffer.Offset +
@ -302,6 +302,7 @@ NTSTATUS FspFsvolFileSystemControlComplete(
FSP_FILE_NODE *FileNode = FileObject->FsContext; FSP_FILE_NODE *FileNode = FileObject->FsContext;
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp); FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
Result = STATUS_INVALID_DEVICE_REQUEST;
switch (IrpSp->MinorFunction) switch (IrpSp->MinorFunction)
{ {
case IRP_MN_USER_FS_REQUEST: case IRP_MN_USER_FS_REQUEST:
@ -314,18 +315,12 @@ NTSTATUS FspFsvolFileSystemControlComplete(
case FSCTL_DELETE_REPARSE_POINT: case FSCTL_DELETE_REPARSE_POINT:
Result = FspFsvolFileSystemControlReparsePointComplete(Irp, Response, TRUE); Result = FspFsvolFileSystemControlReparsePointComplete(Irp, Response, TRUE);
break; break;
default:
ASSERT(0);
Result = STATUS_INVALID_PARAMETER;
break;
} }
break; break;
default:
ASSERT(0);
Result = STATUS_INVALID_PARAMETER;
break;
} }
ASSERT(STATUS_INVALID_DEVICE_REQUEST != Result);
FspIopRequestContext(Request, RequestFileNode) = 0; FspIopRequestContext(Request, RequestFileNode) = 0;
FspFileNodeReleaseOwner(FileNode, Full, Request); FspFileNodeReleaseOwner(FileNode, Full, Request);